blob: 10eb513149e803c57c8d1b3fc9b9c27af2dc69a4 [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]
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +02008output preset file
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08009module _pickle
Larry Hastingsc2047262014-01-25 20:43:29 -080010class _pickle.Pickler "PicklerObject *" "&Pickler_Type"
11class _pickle.PicklerMemoProxy "PicklerMemoProxyObject *" "&PicklerMemoProxyType"
12class _pickle.Unpickler "UnpicklerObject *" "&Unpickler_Type"
13class _pickle.UnpicklerMemoProxy "UnpicklerMemoProxyObject *" "&UnpicklerMemoProxyType"
Larry Hastings61272b72014-01-07 12:41:53 -080014[clinic start generated code]*/
Larry Hastings581ee362014-01-28 05:00:08 -080015/*[clinic end generated code: output=da39a3ee5e6b4b0d input=11c45248a41dd3fc]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -080016
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000017/* Bump this when new opcodes are added to the pickle protocol. */
18enum {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010019 HIGHEST_PROTOCOL = 4,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000020 DEFAULT_PROTOCOL = 3
21};
22
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000023/* Pickle opcodes. These must be kept updated with pickle.py.
24 Extensive docs are in pickletools.py. */
25enum opcode {
26 MARK = '(',
27 STOP = '.',
28 POP = '0',
29 POP_MARK = '1',
30 DUP = '2',
31 FLOAT = 'F',
32 INT = 'I',
33 BININT = 'J',
34 BININT1 = 'K',
35 LONG = 'L',
36 BININT2 = 'M',
37 NONE = 'N',
38 PERSID = 'P',
39 BINPERSID = 'Q',
40 REDUCE = 'R',
41 STRING = 'S',
42 BINSTRING = 'T',
43 SHORT_BINSTRING = 'U',
44 UNICODE = 'V',
45 BINUNICODE = 'X',
46 APPEND = 'a',
47 BUILD = 'b',
48 GLOBAL = 'c',
49 DICT = 'd',
50 EMPTY_DICT = '}',
51 APPENDS = 'e',
52 GET = 'g',
53 BINGET = 'h',
54 INST = 'i',
55 LONG_BINGET = 'j',
56 LIST = 'l',
57 EMPTY_LIST = ']',
58 OBJ = 'o',
59 PUT = 'p',
60 BINPUT = 'q',
61 LONG_BINPUT = 'r',
62 SETITEM = 's',
63 TUPLE = 't',
64 EMPTY_TUPLE = ')',
65 SETITEMS = 'u',
66 BINFLOAT = 'G',
67
68 /* Protocol 2. */
69 PROTO = '\x80',
70 NEWOBJ = '\x81',
71 EXT1 = '\x82',
72 EXT2 = '\x83',
73 EXT4 = '\x84',
74 TUPLE1 = '\x85',
75 TUPLE2 = '\x86',
76 TUPLE3 = '\x87',
77 NEWTRUE = '\x88',
78 NEWFALSE = '\x89',
79 LONG1 = '\x8a',
80 LONG4 = '\x8b',
81
82 /* Protocol 3 (Python 3.x) */
83 BINBYTES = 'B',
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010084 SHORT_BINBYTES = 'C',
85
86 /* Protocol 4 */
87 SHORT_BINUNICODE = '\x8c',
88 BINUNICODE8 = '\x8d',
89 BINBYTES8 = '\x8e',
90 EMPTY_SET = '\x8f',
91 ADDITEMS = '\x90',
92 FROZENSET = '\x91',
93 NEWOBJ_EX = '\x92',
94 STACK_GLOBAL = '\x93',
95 MEMOIZE = '\x94',
96 FRAME = '\x95'
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000097};
98
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000099enum {
100 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
101 batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
102 break if this gets out of synch with pickle.py, but it's unclear that would
103 help anything either. */
104 BATCHSIZE = 1000,
105
106 /* Nesting limit until Pickler, when running in "fast mode", starts
107 checking for self-referential data-structures. */
108 FAST_NESTING_LIMIT = 50,
109
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000110 /* Initial size of the write buffer of Pickler. */
111 WRITE_BUF_SIZE = 4096,
112
Antoine Pitrou04248a82010-10-12 20:51:21 +0000113 /* Prefetch size when unpickling (disabled on unpeekable streams) */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100114 PREFETCH = 8192 * 16,
115
116 FRAME_SIZE_TARGET = 64 * 1024,
117
118 FRAME_HEADER_SIZE = 9
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000119};
120
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800121/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000122
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800123/* State of the pickle module, per PEP 3121. */
124typedef struct {
125 /* Exception classes for pickle. */
126 PyObject *PickleError;
127 PyObject *PicklingError;
128 PyObject *UnpicklingError;
Larry Hastings61272b72014-01-07 12:41:53 -0800129
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800130 /* copyreg.dispatch_table, {type_object: pickling_function} */
131 PyObject *dispatch_table;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000132
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800133 /* For the extension opcodes EXT1, EXT2 and EXT4. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000134
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800135 /* copyreg._extension_registry, {(module_name, function_name): code} */
136 PyObject *extension_registry;
137 /* copyreg._extension_cache, {code: object} */
138 PyObject *extension_cache;
139 /* copyreg._inverted_registry, {code: (module_name, function_name)} */
140 PyObject *inverted_registry;
141
142 /* Import mappings for compatibility with Python 2.x */
143
144 /* _compat_pickle.NAME_MAPPING,
145 {(oldmodule, oldname): (newmodule, newname)} */
146 PyObject *name_mapping_2to3;
147 /* _compat_pickle.IMPORT_MAPPING, {oldmodule: newmodule} */
148 PyObject *import_mapping_2to3;
149 /* Same, but with REVERSE_NAME_MAPPING / REVERSE_IMPORT_MAPPING */
150 PyObject *name_mapping_3to2;
151 PyObject *import_mapping_3to2;
152
153 /* codecs.encode, used for saving bytes in older protocols */
154 PyObject *codecs_encode;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800155} PickleState;
156
157/* Forward declaration of the _pickle module definition. */
158static struct PyModuleDef _picklemodule;
159
160/* Given a module object, get its per-module state. */
161static PickleState *
162_Pickle_GetState(PyObject *module)
163{
164 return (PickleState *)PyModule_GetState(module);
165}
166
167/* Find the module instance imported in the currently running sub-interpreter
168 and get its state. */
169static PickleState *
170_Pickle_GetGlobalState(void)
171{
172 return _Pickle_GetState(PyState_FindModule(&_picklemodule));
173}
174
175/* Clear the given pickle module state. */
176static void
177_Pickle_ClearState(PickleState *st)
178{
179 Py_CLEAR(st->PickleError);
180 Py_CLEAR(st->PicklingError);
181 Py_CLEAR(st->UnpicklingError);
182 Py_CLEAR(st->dispatch_table);
183 Py_CLEAR(st->extension_registry);
184 Py_CLEAR(st->extension_cache);
185 Py_CLEAR(st->inverted_registry);
186 Py_CLEAR(st->name_mapping_2to3);
187 Py_CLEAR(st->import_mapping_2to3);
188 Py_CLEAR(st->name_mapping_3to2);
189 Py_CLEAR(st->import_mapping_3to2);
190 Py_CLEAR(st->codecs_encode);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800191}
192
193/* Initialize the given pickle module state. */
194static int
195_Pickle_InitState(PickleState *st)
196{
197 PyObject *copyreg = NULL;
198 PyObject *compat_pickle = NULL;
199 PyObject *codecs = NULL;
200
201 copyreg = PyImport_ImportModule("copyreg");
202 if (!copyreg)
203 goto error;
204 st->dispatch_table = PyObject_GetAttrString(copyreg, "dispatch_table");
205 if (!st->dispatch_table)
206 goto error;
207 if (!PyDict_CheckExact(st->dispatch_table)) {
208 PyErr_Format(PyExc_RuntimeError,
209 "copyreg.dispatch_table should be a dict, not %.200s",
210 Py_TYPE(st->dispatch_table)->tp_name);
211 goto error;
212 }
213 st->extension_registry = \
214 PyObject_GetAttrString(copyreg, "_extension_registry");
215 if (!st->extension_registry)
216 goto error;
217 if (!PyDict_CheckExact(st->extension_registry)) {
218 PyErr_Format(PyExc_RuntimeError,
219 "copyreg._extension_registry should be a dict, "
220 "not %.200s", Py_TYPE(st->extension_registry)->tp_name);
221 goto error;
222 }
223 st->inverted_registry = \
224 PyObject_GetAttrString(copyreg, "_inverted_registry");
225 if (!st->inverted_registry)
226 goto error;
227 if (!PyDict_CheckExact(st->inverted_registry)) {
228 PyErr_Format(PyExc_RuntimeError,
229 "copyreg._inverted_registry should be a dict, "
230 "not %.200s", Py_TYPE(st->inverted_registry)->tp_name);
231 goto error;
232 }
233 st->extension_cache = PyObject_GetAttrString(copyreg, "_extension_cache");
234 if (!st->extension_cache)
235 goto error;
236 if (!PyDict_CheckExact(st->extension_cache)) {
237 PyErr_Format(PyExc_RuntimeError,
238 "copyreg._extension_cache should be a dict, "
239 "not %.200s", Py_TYPE(st->extension_cache)->tp_name);
240 goto error;
241 }
242 Py_CLEAR(copyreg);
243
244 /* Load the 2.x -> 3.x stdlib module mapping tables */
245 compat_pickle = PyImport_ImportModule("_compat_pickle");
246 if (!compat_pickle)
247 goto error;
248 st->name_mapping_2to3 = \
249 PyObject_GetAttrString(compat_pickle, "NAME_MAPPING");
250 if (!st->name_mapping_2to3)
251 goto error;
252 if (!PyDict_CheckExact(st->name_mapping_2to3)) {
253 PyErr_Format(PyExc_RuntimeError,
254 "_compat_pickle.NAME_MAPPING should be a dict, not %.200s",
255 Py_TYPE(st->name_mapping_2to3)->tp_name);
256 goto error;
257 }
258 st->import_mapping_2to3 = \
259 PyObject_GetAttrString(compat_pickle, "IMPORT_MAPPING");
260 if (!st->import_mapping_2to3)
261 goto error;
262 if (!PyDict_CheckExact(st->import_mapping_2to3)) {
263 PyErr_Format(PyExc_RuntimeError,
264 "_compat_pickle.IMPORT_MAPPING should be a dict, "
265 "not %.200s", Py_TYPE(st->import_mapping_2to3)->tp_name);
266 goto error;
267 }
268 /* ... and the 3.x -> 2.x mapping tables */
269 st->name_mapping_3to2 = \
270 PyObject_GetAttrString(compat_pickle, "REVERSE_NAME_MAPPING");
271 if (!st->name_mapping_3to2)
272 goto error;
273 if (!PyDict_CheckExact(st->name_mapping_3to2)) {
274 PyErr_Format(PyExc_RuntimeError,
275 "_compat_pickle.REVERSE_NAME_MAPPING should be a dict, "
276 "not %.200s", Py_TYPE(st->name_mapping_3to2)->tp_name);
277 goto error;
278 }
279 st->import_mapping_3to2 = \
280 PyObject_GetAttrString(compat_pickle, "REVERSE_IMPORT_MAPPING");
281 if (!st->import_mapping_3to2)
282 goto error;
283 if (!PyDict_CheckExact(st->import_mapping_3to2)) {
284 PyErr_Format(PyExc_RuntimeError,
285 "_compat_pickle.REVERSE_IMPORT_MAPPING should be a dict, "
286 "not %.200s", Py_TYPE(st->import_mapping_3to2)->tp_name);
287 goto error;
288 }
289 Py_CLEAR(compat_pickle);
290
291 codecs = PyImport_ImportModule("codecs");
292 if (codecs == NULL)
293 goto error;
294 st->codecs_encode = PyObject_GetAttrString(codecs, "encode");
295 if (st->codecs_encode == NULL) {
296 goto error;
297 }
298 if (!PyCallable_Check(st->codecs_encode)) {
299 PyErr_Format(PyExc_RuntimeError,
300 "codecs.encode should be a callable, not %.200s",
301 Py_TYPE(st->codecs_encode)->tp_name);
302 goto error;
303 }
304 Py_CLEAR(codecs);
305
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800306 return 0;
307
308 error:
309 Py_CLEAR(copyreg);
310 Py_CLEAR(compat_pickle);
311 Py_CLEAR(codecs);
312 _Pickle_ClearState(st);
313 return -1;
314}
315
316/* Helper for calling a function with a single argument quickly.
317
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800318 This function steals the reference of the given argument. */
319static PyObject *
320_Pickle_FastCall(PyObject *func, PyObject *obj)
321{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800322 PyObject *result;
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800323 PyObject *arg_tuple = PyTuple_New(1);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800324
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800325 /* Note: this function used to reuse the argument tuple. This used to give
326 a slight performance boost with older pickle implementations where many
327 unbuffered reads occurred (thus needing many function calls).
328
329 However, this optimization was removed because it was too complicated
330 to get right. It abused the C API for tuples to mutate them which led
331 to subtle reference counting and concurrency bugs. Furthermore, the
332 introduction of protocol 4 and the prefetching optimization via peek()
333 significantly reduced the number of function calls we do. Thus, the
334 benefits became marginal at best. */
335
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800336 if (arg_tuple == NULL) {
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800337 Py_DECREF(obj);
338 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800339 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800340 PyTuple_SET_ITEM(arg_tuple, 0, obj);
341 result = PyObject_Call(func, arg_tuple, NULL);
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800342 Py_CLEAR(arg_tuple);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800343 return result;
344}
345
346/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000347
348static int
349stack_underflow(void)
350{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800351 PickleState *st = _Pickle_GetGlobalState();
352 PyErr_SetString(st->UnpicklingError, "unpickling stack underflow");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000353 return -1;
354}
355
356/* Internal data type used as the unpickling stack. */
357typedef struct {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000358 PyObject_VAR_HEAD
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000359 PyObject **data;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000360 Py_ssize_t allocated; /* number of slots in data allocated */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000361} Pdata;
362
363static void
364Pdata_dealloc(Pdata *self)
365{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200366 Py_ssize_t i = Py_SIZE(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000367 while (--i >= 0) {
368 Py_DECREF(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000369 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000370 PyMem_FREE(self->data);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000371 PyObject_Del(self);
372}
373
374static PyTypeObject Pdata_Type = {
375 PyVarObject_HEAD_INIT(NULL, 0)
376 "_pickle.Pdata", /*tp_name*/
377 sizeof(Pdata), /*tp_basicsize*/
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200378 sizeof(PyObject *), /*tp_itemsize*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000379 (destructor)Pdata_dealloc, /*tp_dealloc*/
380};
381
382static PyObject *
383Pdata_New(void)
384{
385 Pdata *self;
386
387 if (!(self = PyObject_New(Pdata, &Pdata_Type)))
388 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000389 Py_SIZE(self) = 0;
390 self->allocated = 8;
391 self->data = PyMem_MALLOC(self->allocated * sizeof(PyObject *));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000392 if (self->data)
393 return (PyObject *)self;
394 Py_DECREF(self);
395 return PyErr_NoMemory();
396}
397
398
399/* Retain only the initial clearto items. If clearto >= the current
400 * number of items, this is a (non-erroneous) NOP.
401 */
402static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200403Pdata_clear(Pdata *self, Py_ssize_t clearto)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000404{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200405 Py_ssize_t i = Py_SIZE(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000406
407 if (clearto < 0)
408 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000409 if (clearto >= i)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000410 return 0;
411
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000412 while (--i >= clearto) {
413 Py_CLEAR(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000414 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000415 Py_SIZE(self) = clearto;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000416 return 0;
417}
418
419static int
420Pdata_grow(Pdata *self)
421{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000422 PyObject **data = self->data;
423 Py_ssize_t allocated = self->allocated;
424 Py_ssize_t new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000425
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000426 new_allocated = (allocated >> 3) + 6;
427 /* check for integer overflow */
428 if (new_allocated > PY_SSIZE_T_MAX - allocated)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000429 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000430 new_allocated += allocated;
431 if (new_allocated > (PY_SSIZE_T_MAX / sizeof(PyObject *)))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000432 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000433 data = PyMem_REALLOC(data, new_allocated * sizeof(PyObject *));
434 if (data == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000435 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000436
437 self->data = data;
438 self->allocated = new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000439 return 0;
440
441 nomemory:
442 PyErr_NoMemory();
443 return -1;
444}
445
446/* D is a Pdata*. Pop the topmost element and store it into V, which
447 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
448 * is raised and V is set to NULL.
449 */
450static PyObject *
451Pdata_pop(Pdata *self)
452{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800453 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000454 if (Py_SIZE(self) == 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800455 PyErr_SetString(st->UnpicklingError, "bad pickle data");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000456 return NULL;
457 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000458 return self->data[--Py_SIZE(self)];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000459}
460#define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0)
461
462static int
463Pdata_push(Pdata *self, PyObject *obj)
464{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000465 if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000466 return -1;
467 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000468 self->data[Py_SIZE(self)++] = obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000469 return 0;
470}
471
472/* Push an object on stack, transferring its ownership to the stack. */
473#define PDATA_PUSH(D, O, ER) do { \
474 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
475
476/* Push an object on stack, adding a new reference to the object. */
477#define PDATA_APPEND(D, O, ER) do { \
478 Py_INCREF((O)); \
479 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
480
481static PyObject *
482Pdata_poptuple(Pdata *self, Py_ssize_t start)
483{
484 PyObject *tuple;
485 Py_ssize_t len, i, j;
486
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000487 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000488 tuple = PyTuple_New(len);
489 if (tuple == NULL)
490 return NULL;
491 for (i = start, j = 0; j < len; i++, j++)
492 PyTuple_SET_ITEM(tuple, j, self->data[i]);
493
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000494 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000495 return tuple;
496}
497
498static PyObject *
499Pdata_poplist(Pdata *self, Py_ssize_t start)
500{
501 PyObject *list;
502 Py_ssize_t len, i, j;
503
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000504 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000505 list = PyList_New(len);
506 if (list == NULL)
507 return NULL;
508 for (i = start, j = 0; j < len; i++, j++)
509 PyList_SET_ITEM(list, j, self->data[i]);
510
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000511 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000512 return list;
513}
514
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000515typedef struct {
516 PyObject *me_key;
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200517 Py_ssize_t me_value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000518} PyMemoEntry;
519
520typedef struct {
521 Py_ssize_t mt_mask;
522 Py_ssize_t mt_used;
523 Py_ssize_t mt_allocated;
524 PyMemoEntry *mt_table;
525} PyMemoTable;
526
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000527typedef struct PicklerObject {
528 PyObject_HEAD
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000529 PyMemoTable *memo; /* Memo table, keep track of the seen
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000530 objects to support self-referential objects
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000531 pickling. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000532 PyObject *pers_func; /* persistent_id() method, can be NULL */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100533 PyObject *dispatch_table; /* private dispatch_table, can be NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000534
535 PyObject *write; /* write() method of the output stream. */
536 PyObject *output_buffer; /* Write into a local bytearray buffer before
537 flushing to the stream. */
538 Py_ssize_t output_len; /* Length of output_buffer. */
539 Py_ssize_t max_output_len; /* Allocation size of output_buffer. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000540 int proto; /* Pickle protocol number, >= 0 */
541 int bin; /* Boolean, true if proto > 0 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100542 int framing; /* True when framing is enabled, proto >= 4 */
543 Py_ssize_t frame_start; /* Position in output_buffer where the
544 where the current frame begins. -1 if there
545 is no frame currently open. */
546
547 Py_ssize_t buf_size; /* Size of the current buffered pickle data */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000548 int fast; /* Enable fast mode if set to a true value.
549 The fast mode disable the usage of memo,
550 therefore speeding the pickling process by
551 not generating superfluous PUT opcodes. It
552 should not be used if with self-referential
553 objects. */
554 int fast_nesting;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000555 int fix_imports; /* Indicate whether Pickler should fix
556 the name of globals for Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000557 PyObject *fast_memo;
558} PicklerObject;
559
560typedef struct UnpicklerObject {
561 PyObject_HEAD
562 Pdata *stack; /* Pickle data stack, store unpickled objects. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000563
564 /* The unpickler memo is just an array of PyObject *s. Using a dict
565 is unnecessary, since the keys are contiguous ints. */
566 PyObject **memo;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100567 Py_ssize_t memo_size; /* Capacity of the memo array */
568 Py_ssize_t memo_len; /* Number of objects in the memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000569
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000570 PyObject *pers_func; /* persistent_load() method, can be NULL. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000571
572 Py_buffer buffer;
573 char *input_buffer;
574 char *input_line;
575 Py_ssize_t input_len;
576 Py_ssize_t next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +0000577 Py_ssize_t prefetched_idx; /* index of first prefetched byte */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100578
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000579 PyObject *read; /* read() method of the input stream. */
580 PyObject *readline; /* readline() method of the input stream. */
Antoine Pitrou04248a82010-10-12 20:51:21 +0000581 PyObject *peek; /* peek() method of the input stream, or NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000582
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000583 char *encoding; /* Name of the encoding to be used for
584 decoding strings pickled using Python
585 2.x. The default value is "ASCII" */
586 char *errors; /* Name of errors handling scheme to used when
587 decoding strings. The default value is
588 "strict". */
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500589 Py_ssize_t *marks; /* Mark stack, used for unpickling container
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000590 objects. */
591 Py_ssize_t num_marks; /* Number of marks in the mark stack. */
592 Py_ssize_t marks_size; /* Current allocated size of the mark stack. */
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000593 int proto; /* Protocol of the pickle loaded. */
594 int fix_imports; /* Indicate whether Unpickler should fix
595 the name of globals pickled by Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000596} UnpicklerObject;
597
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200598typedef struct {
599 PyObject_HEAD
600 PicklerObject *pickler; /* Pickler whose memo table we're proxying. */
601} PicklerMemoProxyObject;
602
603typedef struct {
604 PyObject_HEAD
605 UnpicklerObject *unpickler;
606} UnpicklerMemoProxyObject;
607
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000608/* Forward declarations */
609static int save(PicklerObject *, PyObject *, int);
610static int save_reduce(PicklerObject *, PyObject *, PyObject *);
611static PyTypeObject Pickler_Type;
612static PyTypeObject Unpickler_Type;
613
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200614#include "clinic/_pickle.c.h"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000615
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000616/*************************************************************************
Serhiy Storchaka95949422013-08-27 19:40:23 +0300617 A custom hashtable mapping void* to Python ints. This is used by the pickler
618 for memoization. Using a custom hashtable rather than PyDict allows us to skip
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000619 a bunch of unnecessary object creation. This makes a huge performance
620 difference. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000621
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000622#define MT_MINSIZE 8
623#define PERTURB_SHIFT 5
624
625
626static PyMemoTable *
627PyMemoTable_New(void)
628{
629 PyMemoTable *memo = PyMem_MALLOC(sizeof(PyMemoTable));
630 if (memo == NULL) {
631 PyErr_NoMemory();
632 return NULL;
633 }
634
635 memo->mt_used = 0;
636 memo->mt_allocated = MT_MINSIZE;
637 memo->mt_mask = MT_MINSIZE - 1;
638 memo->mt_table = PyMem_MALLOC(MT_MINSIZE * sizeof(PyMemoEntry));
639 if (memo->mt_table == NULL) {
640 PyMem_FREE(memo);
641 PyErr_NoMemory();
642 return NULL;
643 }
644 memset(memo->mt_table, 0, MT_MINSIZE * sizeof(PyMemoEntry));
645
646 return memo;
647}
648
649static PyMemoTable *
650PyMemoTable_Copy(PyMemoTable *self)
651{
652 Py_ssize_t i;
653 PyMemoTable *new = PyMemoTable_New();
654 if (new == NULL)
655 return NULL;
656
657 new->mt_used = self->mt_used;
658 new->mt_allocated = self->mt_allocated;
659 new->mt_mask = self->mt_mask;
660 /* The table we get from _New() is probably smaller than we wanted.
661 Free it and allocate one that's the right size. */
662 PyMem_FREE(new->mt_table);
663 new->mt_table = PyMem_MALLOC(self->mt_allocated * sizeof(PyMemoEntry));
664 if (new->mt_table == NULL) {
665 PyMem_FREE(new);
Victor Stinner42024562013-07-12 00:53:57 +0200666 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000667 return NULL;
668 }
669 for (i = 0; i < self->mt_allocated; i++) {
670 Py_XINCREF(self->mt_table[i].me_key);
671 }
672 memcpy(new->mt_table, self->mt_table,
673 sizeof(PyMemoEntry) * self->mt_allocated);
674
675 return new;
676}
677
678static Py_ssize_t
679PyMemoTable_Size(PyMemoTable *self)
680{
681 return self->mt_used;
682}
683
684static int
685PyMemoTable_Clear(PyMemoTable *self)
686{
687 Py_ssize_t i = self->mt_allocated;
688
689 while (--i >= 0) {
690 Py_XDECREF(self->mt_table[i].me_key);
691 }
692 self->mt_used = 0;
693 memset(self->mt_table, 0, self->mt_allocated * sizeof(PyMemoEntry));
694 return 0;
695}
696
697static void
698PyMemoTable_Del(PyMemoTable *self)
699{
700 if (self == NULL)
701 return;
702 PyMemoTable_Clear(self);
703
704 PyMem_FREE(self->mt_table);
705 PyMem_FREE(self);
706}
707
708/* Since entries cannot be deleted from this hashtable, _PyMemoTable_Lookup()
709 can be considerably simpler than dictobject.c's lookdict(). */
710static PyMemoEntry *
711_PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
712{
713 size_t i;
714 size_t perturb;
715 size_t mask = (size_t)self->mt_mask;
716 PyMemoEntry *table = self->mt_table;
717 PyMemoEntry *entry;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000718 Py_hash_t hash = (Py_hash_t)key >> 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000719
720 i = hash & mask;
721 entry = &table[i];
722 if (entry->me_key == NULL || entry->me_key == key)
723 return entry;
724
725 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
726 i = (i << 2) + i + perturb + 1;
727 entry = &table[i & mask];
728 if (entry->me_key == NULL || entry->me_key == key)
729 return entry;
730 }
731 assert(0); /* Never reached */
732 return NULL;
733}
734
735/* Returns -1 on failure, 0 on success. */
736static int
737_PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size)
738{
739 PyMemoEntry *oldtable = NULL;
740 PyMemoEntry *oldentry, *newentry;
741 Py_ssize_t new_size = MT_MINSIZE;
742 Py_ssize_t to_process;
743
744 assert(min_size > 0);
745
746 /* Find the smallest valid table size >= min_size. */
747 while (new_size < min_size && new_size > 0)
748 new_size <<= 1;
749 if (new_size <= 0) {
750 PyErr_NoMemory();
751 return -1;
752 }
753 /* new_size needs to be a power of two. */
754 assert((new_size & (new_size - 1)) == 0);
755
756 /* Allocate new table. */
757 oldtable = self->mt_table;
758 self->mt_table = PyMem_MALLOC(new_size * sizeof(PyMemoEntry));
759 if (self->mt_table == NULL) {
Victor Stinner8ca72e22013-07-12 00:53:26 +0200760 self->mt_table = oldtable;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000761 PyErr_NoMemory();
762 return -1;
763 }
764 self->mt_allocated = new_size;
765 self->mt_mask = new_size - 1;
766 memset(self->mt_table, 0, sizeof(PyMemoEntry) * new_size);
767
768 /* Copy entries from the old table. */
769 to_process = self->mt_used;
770 for (oldentry = oldtable; to_process > 0; oldentry++) {
771 if (oldentry->me_key != NULL) {
772 to_process--;
773 /* newentry is a pointer to a chunk of the new
774 mt_table, so we're setting the key:value pair
775 in-place. */
776 newentry = _PyMemoTable_Lookup(self, oldentry->me_key);
777 newentry->me_key = oldentry->me_key;
778 newentry->me_value = oldentry->me_value;
779 }
780 }
781
782 /* Deallocate the old table. */
783 PyMem_FREE(oldtable);
784 return 0;
785}
786
787/* Returns NULL on failure, a pointer to the value otherwise. */
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200788static Py_ssize_t *
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000789PyMemoTable_Get(PyMemoTable *self, PyObject *key)
790{
791 PyMemoEntry *entry = _PyMemoTable_Lookup(self, key);
792 if (entry->me_key == NULL)
793 return NULL;
794 return &entry->me_value;
795}
796
797/* Returns -1 on failure, 0 on success. */
798static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200799PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000800{
801 PyMemoEntry *entry;
802
803 assert(key != NULL);
804
805 entry = _PyMemoTable_Lookup(self, key);
806 if (entry->me_key != NULL) {
807 entry->me_value = value;
808 return 0;
809 }
810 Py_INCREF(key);
811 entry->me_key = key;
812 entry->me_value = value;
813 self->mt_used++;
814
815 /* If we added a key, we can safely resize. Otherwise just return!
816 * If used >= 2/3 size, adjust size. Normally, this quaduples the size.
817 *
818 * Quadrupling the size improves average table sparseness
819 * (reducing collisions) at the cost of some memory. It also halves
820 * the number of expensive resize operations in a growing memo table.
821 *
822 * Very large memo tables (over 50K items) use doubling instead.
823 * This may help applications with severe memory constraints.
824 */
825 if (!(self->mt_used * 3 >= (self->mt_mask + 1) * 2))
826 return 0;
827 return _PyMemoTable_ResizeTable(self,
828 (self->mt_used > 50000 ? 2 : 4) * self->mt_used);
829}
830
831#undef MT_MINSIZE
832#undef PERTURB_SHIFT
833
834/*************************************************************************/
835
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000836
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000837static int
838_Pickler_ClearBuffer(PicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000839{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000840 Py_CLEAR(self->output_buffer);
841 self->output_buffer =
842 PyBytes_FromStringAndSize(NULL, self->max_output_len);
843 if (self->output_buffer == NULL)
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000844 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000845 self->output_len = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100846 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000847 return 0;
848}
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000849
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100850static void
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100851_write_size64(char *out, size_t value)
852{
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800853 int i;
854
855 assert(sizeof(size_t) <= 8);
856
857 for (i = 0; i < sizeof(size_t); i++) {
858 out[i] = (unsigned char)((value >> (8 * i)) & 0xff);
859 }
860 for (i = sizeof(size_t); i < 8; i++) {
861 out[i] = 0;
Alexandre Vassalottided929b2013-11-24 22:41:13 -0800862 }
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100863}
864
865static void
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100866_Pickler_WriteFrameHeader(PicklerObject *self, char *qdata, size_t frame_len)
867{
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100868 qdata[0] = FRAME;
869 _write_size64(qdata + 1, frame_len);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100870}
871
872static int
873_Pickler_CommitFrame(PicklerObject *self)
874{
875 size_t frame_len;
876 char *qdata;
877
878 if (!self->framing || self->frame_start == -1)
879 return 0;
880 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
881 qdata = PyBytes_AS_STRING(self->output_buffer) + self->frame_start;
882 _Pickler_WriteFrameHeader(self, qdata, frame_len);
883 self->frame_start = -1;
884 return 0;
885}
886
887static int
888_Pickler_OpcodeBoundary(PicklerObject *self)
889{
890 Py_ssize_t frame_len;
891
892 if (!self->framing || self->frame_start == -1)
893 return 0;
894 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
895 if (frame_len >= FRAME_SIZE_TARGET)
896 return _Pickler_CommitFrame(self);
897 else
898 return 0;
899}
900
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000901static PyObject *
902_Pickler_GetString(PicklerObject *self)
903{
904 PyObject *output_buffer = self->output_buffer;
905
906 assert(self->output_buffer != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100907
908 if (_Pickler_CommitFrame(self))
909 return NULL;
910
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000911 self->output_buffer = NULL;
912 /* Resize down to exact size */
913 if (_PyBytes_Resize(&output_buffer, self->output_len) < 0)
914 return NULL;
915 return output_buffer;
916}
917
918static int
919_Pickler_FlushToFile(PicklerObject *self)
920{
921 PyObject *output, *result;
922
923 assert(self->write != NULL);
924
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100925 /* This will commit the frame first */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000926 output = _Pickler_GetString(self);
927 if (output == NULL)
928 return -1;
929
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -0800930 result = _Pickle_FastCall(self->write, output);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000931 Py_XDECREF(result);
932 return (result == NULL) ? -1 : 0;
933}
934
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200935static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100936_Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000937{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100938 Py_ssize_t i, n, required;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000939 char *buffer;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100940 int need_new_frame;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000941
942 assert(s != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100943 need_new_frame = (self->framing && self->frame_start == -1);
944
945 if (need_new_frame)
946 n = data_len + FRAME_HEADER_SIZE;
947 else
948 n = data_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000949
950 required = self->output_len + n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100951 if (required > self->max_output_len) {
952 /* Make place in buffer for the pickle chunk */
953 if (self->output_len >= PY_SSIZE_T_MAX / 2 - n) {
954 PyErr_NoMemory();
955 return -1;
956 }
957 self->max_output_len = (self->output_len + n) / 2 * 3;
958 if (_PyBytes_Resize(&self->output_buffer, self->max_output_len) < 0)
959 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000960 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000961 buffer = PyBytes_AS_STRING(self->output_buffer);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100962 if (need_new_frame) {
963 /* Setup new frame */
964 Py_ssize_t frame_start = self->output_len;
965 self->frame_start = frame_start;
966 for (i = 0; i < FRAME_HEADER_SIZE; i++) {
967 /* Write an invalid value, for debugging */
968 buffer[frame_start + i] = 0xFE;
969 }
970 self->output_len += FRAME_HEADER_SIZE;
971 }
972 if (data_len < 8) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000973 /* This is faster than memcpy when the string is short. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100974 for (i = 0; i < data_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000975 buffer[self->output_len + i] = s[i];
976 }
977 }
978 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100979 memcpy(buffer + self->output_len, s, data_len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000980 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100981 self->output_len += data_len;
982 return data_len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000983}
984
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000985static PicklerObject *
986_Pickler_New(void)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000987{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000988 PicklerObject *self;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000989
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000990 self = PyObject_GC_New(PicklerObject, &Pickler_Type);
991 if (self == NULL)
992 return NULL;
993
994 self->pers_func = NULL;
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100995 self->dispatch_table = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000996 self->write = NULL;
997 self->proto = 0;
998 self->bin = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100999 self->framing = 0;
1000 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001001 self->fast = 0;
1002 self->fast_nesting = 0;
1003 self->fix_imports = 0;
1004 self->fast_memo = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001005 self->max_output_len = WRITE_BUF_SIZE;
1006 self->output_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001007
1008 self->memo = PyMemoTable_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001009 self->output_buffer = PyBytes_FromStringAndSize(NULL,
1010 self->max_output_len);
Victor Stinner68c8ea22013-07-11 22:56:25 +02001011
1012 if (self->memo == NULL || self->output_buffer == NULL) {
Victor Stinnerc31df042013-07-12 00:08:59 +02001013 Py_DECREF(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001014 return NULL;
1015 }
1016 return self;
1017}
1018
1019static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001020_Pickler_SetProtocol(PicklerObject *self, PyObject *protocol, int fix_imports)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001021{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001022 long proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001023
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001024 if (protocol == NULL || protocol == Py_None) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001025 proto = DEFAULT_PROTOCOL;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001026 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001027 else {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001028 proto = PyLong_AsLong(protocol);
1029 if (proto < 0) {
1030 if (proto == -1 && PyErr_Occurred())
1031 return -1;
1032 proto = HIGHEST_PROTOCOL;
1033 }
1034 else if (proto > HIGHEST_PROTOCOL) {
1035 PyErr_Format(PyExc_ValueError, "pickle protocol must be <= %d",
1036 HIGHEST_PROTOCOL);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001037 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001038 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001039 }
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001040 self->proto = (int)proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001041 self->bin = proto > 0;
1042 self->fix_imports = fix_imports && proto < 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001043 return 0;
1044}
1045
1046/* Returns -1 (with an exception set) on failure, 0 on success. This may
1047 be called once on a freshly created Pickler. */
1048static int
1049_Pickler_SetOutputStream(PicklerObject *self, PyObject *file)
1050{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001051 _Py_IDENTIFIER(write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001052 assert(file != NULL);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001053 self->write = _PyObject_GetAttrId(file, &PyId_write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001054 if (self->write == NULL) {
1055 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1056 PyErr_SetString(PyExc_TypeError,
1057 "file must have a 'write' attribute");
1058 return -1;
1059 }
1060
1061 return 0;
1062}
1063
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001064/* Returns the size of the input on success, -1 on failure. This takes its
1065 own reference to `input`. */
1066static Py_ssize_t
1067_Unpickler_SetStringInput(UnpicklerObject *self, PyObject *input)
1068{
1069 if (self->buffer.buf != NULL)
1070 PyBuffer_Release(&self->buffer);
1071 if (PyObject_GetBuffer(input, &self->buffer, PyBUF_CONTIG_RO) < 0)
1072 return -1;
1073 self->input_buffer = self->buffer.buf;
1074 self->input_len = self->buffer.len;
1075 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001076 self->prefetched_idx = self->input_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001077 return self->input_len;
1078}
1079
Antoine Pitrou04248a82010-10-12 20:51:21 +00001080static int
1081_Unpickler_SkipConsumed(UnpicklerObject *self)
1082{
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001083 Py_ssize_t consumed;
1084 PyObject *r;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001085
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001086 consumed = self->next_read_idx - self->prefetched_idx;
1087 if (consumed <= 0)
1088 return 0;
1089
1090 assert(self->peek); /* otherwise we did something wrong */
1091 /* This makes an useless copy... */
1092 r = PyObject_CallFunction(self->read, "n", consumed);
1093 if (r == NULL)
1094 return -1;
1095 Py_DECREF(r);
1096
1097 self->prefetched_idx = self->next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001098 return 0;
1099}
1100
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001101static const Py_ssize_t READ_WHOLE_LINE = -1;
1102
1103/* If reading from a file, we need to only pull the bytes we need, since there
1104 may be multiple pickle objects arranged contiguously in the same input
1105 buffer.
1106
1107 If `n` is READ_WHOLE_LINE, read a whole line. Otherwise, read up to `n`
1108 bytes from the input stream/buffer.
1109
1110 Update the unpickler's input buffer with the newly-read data. Returns -1 on
1111 failure; on success, returns the number of bytes read from the file.
1112
1113 On success, self->input_len will be 0; this is intentional so that when
1114 unpickling from a file, the "we've run out of data" code paths will trigger,
1115 causing the Unpickler to go back to the file for more data. Use the returned
1116 size to tell you how much data you can process. */
1117static Py_ssize_t
1118_Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
1119{
1120 PyObject *data;
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001121 Py_ssize_t read_size;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001122
1123 assert(self->read != NULL);
Victor Stinner121aab42011-09-29 23:40:53 +02001124
Antoine Pitrou04248a82010-10-12 20:51:21 +00001125 if (_Unpickler_SkipConsumed(self) < 0)
1126 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001127
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001128 if (n == READ_WHOLE_LINE) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08001129 PyObject *empty_tuple = PyTuple_New(0);
1130 data = PyObject_Call(self->readline, empty_tuple, NULL);
1131 Py_DECREF(empty_tuple);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001132 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001133 else {
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001134 PyObject *len;
1135 /* Prefetch some data without advancing the file pointer, if possible */
1136 if (self->peek && n < PREFETCH) {
1137 len = PyLong_FromSsize_t(PREFETCH);
1138 if (len == NULL)
1139 return -1;
1140 data = _Pickle_FastCall(self->peek, len);
1141 if (data == NULL) {
1142 if (!PyErr_ExceptionMatches(PyExc_NotImplementedError))
1143 return -1;
1144 /* peek() is probably not supported by the given file object */
1145 PyErr_Clear();
1146 Py_CLEAR(self->peek);
1147 }
1148 else {
1149 read_size = _Unpickler_SetStringInput(self, data);
1150 Py_DECREF(data);
1151 self->prefetched_idx = 0;
1152 if (n <= read_size)
1153 return n;
1154 }
1155 }
1156 len = PyLong_FromSsize_t(n);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001157 if (len == NULL)
1158 return -1;
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001159 data = _Pickle_FastCall(self->read, len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001160 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001161 if (data == NULL)
1162 return -1;
1163
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001164 read_size = _Unpickler_SetStringInput(self, data);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001165 Py_DECREF(data);
1166 return read_size;
1167}
1168
1169/* Read `n` bytes from the unpickler's data source, storing the result in `*s`.
1170
1171 This should be used for all data reads, rather than accessing the unpickler's
1172 input buffer directly. This method deals correctly with reading from input
1173 streams, which the input buffer doesn't deal with.
1174
1175 Note that when reading from a file-like object, self->next_read_idx won't
1176 be updated (it should remain at 0 for the entire unpickling process). You
1177 should use this function's return value to know how many bytes you can
1178 consume.
1179
1180 Returns -1 (with an exception set) on failure. On success, return the
1181 number of chars read. */
1182static Py_ssize_t
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08001183_Unpickler_Read(UnpicklerObject *self, char **s, Py_ssize_t n)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001184{
Antoine Pitrou04248a82010-10-12 20:51:21 +00001185 Py_ssize_t num_read;
1186
Antoine Pitrou04248a82010-10-12 20:51:21 +00001187 if (self->next_read_idx + n <= self->input_len) {
1188 *s = self->input_buffer + self->next_read_idx;
1189 self->next_read_idx += n;
1190 return n;
1191 }
1192 if (!self->read) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001193 PyErr_Format(PyExc_EOFError, "Ran out of input");
Amaury Forgeot d'Arc3e4e72f2008-11-11 20:05:06 +00001194 return -1;
1195 }
Antoine Pitrou04248a82010-10-12 20:51:21 +00001196 num_read = _Unpickler_ReadFromFile(self, n);
1197 if (num_read < 0)
1198 return -1;
1199 if (num_read < n) {
1200 PyErr_Format(PyExc_EOFError, "Ran out of input");
1201 return -1;
1202 }
1203 *s = self->input_buffer;
1204 self->next_read_idx = n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001205 return n;
1206}
1207
1208static Py_ssize_t
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001209_Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len,
1210 char **result)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001211{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001212 char *input_line = PyMem_Realloc(self->input_line, len + 1);
Victor Stinner42024562013-07-12 00:53:57 +02001213 if (input_line == NULL) {
1214 PyErr_NoMemory();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001215 return -1;
Victor Stinner42024562013-07-12 00:53:57 +02001216 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001217
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001218 memcpy(input_line, line, len);
1219 input_line[len] = '\0';
1220 self->input_line = input_line;
1221 *result = self->input_line;
1222 return len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001223}
1224
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001225/* Read a line from the input stream/buffer. If we run off the end of the input
1226 before hitting \n, return the data we found.
1227
1228 Returns the number of chars read, or -1 on failure. */
1229static Py_ssize_t
1230_Unpickler_Readline(UnpicklerObject *self, char **result)
1231{
1232 Py_ssize_t i, num_read;
1233
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001234 for (i = self->next_read_idx; i < self->input_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001235 if (self->input_buffer[i] == '\n') {
1236 char *line_start = self->input_buffer + self->next_read_idx;
1237 num_read = i - self->next_read_idx + 1;
1238 self->next_read_idx = i + 1;
1239 return _Unpickler_CopyLine(self, line_start, num_read, result);
1240 }
1241 }
1242 if (self->read) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001243 num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE);
1244 if (num_read < 0)
1245 return -1;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001246 self->next_read_idx = num_read;
Antoine Pitrouf6c7a852011-08-11 21:04:02 +02001247 return _Unpickler_CopyLine(self, self->input_buffer, num_read, result);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001248 }
Victor Stinner121aab42011-09-29 23:40:53 +02001249
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001250 /* If we get here, we've run off the end of the input string. Return the
1251 remaining string and let the caller figure it out. */
1252 *result = self->input_buffer + self->next_read_idx;
1253 num_read = i - self->next_read_idx;
1254 self->next_read_idx = i;
1255 return num_read;
1256}
1257
1258/* Returns -1 (with an exception set) on failure, 0 on success. The memo array
1259 will be modified in place. */
1260static int
1261_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)
1262{
1263 Py_ssize_t i;
1264 PyObject **memo;
1265
1266 assert(new_size > self->memo_size);
1267
1268 memo = PyMem_REALLOC(self->memo, new_size * sizeof(PyObject *));
1269 if (memo == NULL) {
1270 PyErr_NoMemory();
1271 return -1;
1272 }
1273 self->memo = memo;
1274 for (i = self->memo_size; i < new_size; i++)
1275 self->memo[i] = NULL;
1276 self->memo_size = new_size;
1277 return 0;
1278}
1279
1280/* Returns NULL if idx is out of bounds. */
1281static PyObject *
1282_Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)
1283{
1284 if (idx < 0 || idx >= self->memo_size)
1285 return NULL;
1286
1287 return self->memo[idx];
1288}
1289
1290/* Returns -1 (with an exception set) on failure, 0 on success.
1291 This takes its own reference to `value`. */
1292static int
1293_Unpickler_MemoPut(UnpicklerObject *self, Py_ssize_t idx, PyObject *value)
1294{
1295 PyObject *old_item;
1296
1297 if (idx >= self->memo_size) {
1298 if (_Unpickler_ResizeMemoList(self, idx * 2) < 0)
1299 return -1;
1300 assert(idx < self->memo_size);
1301 }
1302 Py_INCREF(value);
1303 old_item = self->memo[idx];
1304 self->memo[idx] = value;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001305 if (old_item != NULL) {
1306 Py_DECREF(old_item);
1307 }
1308 else {
1309 self->memo_len++;
1310 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001311 return 0;
1312}
1313
1314static PyObject **
1315_Unpickler_NewMemo(Py_ssize_t new_size)
1316{
1317 PyObject **memo = PyMem_MALLOC(new_size * sizeof(PyObject *));
Victor Stinner42024562013-07-12 00:53:57 +02001318 if (memo == NULL) {
1319 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001320 return NULL;
Victor Stinner42024562013-07-12 00:53:57 +02001321 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001322 memset(memo, 0, new_size * sizeof(PyObject *));
1323 return memo;
1324}
1325
1326/* Free the unpickler's memo, taking care to decref any items left in it. */
1327static void
1328_Unpickler_MemoCleanup(UnpicklerObject *self)
1329{
1330 Py_ssize_t i;
1331 PyObject **memo = self->memo;
1332
1333 if (self->memo == NULL)
1334 return;
1335 self->memo = NULL;
1336 i = self->memo_size;
1337 while (--i >= 0) {
1338 Py_XDECREF(memo[i]);
1339 }
1340 PyMem_FREE(memo);
1341}
1342
1343static UnpicklerObject *
1344_Unpickler_New(void)
1345{
1346 UnpicklerObject *self;
1347
1348 self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type);
1349 if (self == NULL)
1350 return NULL;
1351
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001352 self->pers_func = NULL;
1353 self->input_buffer = NULL;
1354 self->input_line = NULL;
1355 self->input_len = 0;
1356 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001357 self->prefetched_idx = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001358 self->read = NULL;
1359 self->readline = NULL;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001360 self->peek = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001361 self->encoding = NULL;
1362 self->errors = NULL;
1363 self->marks = NULL;
1364 self->num_marks = 0;
1365 self->marks_size = 0;
1366 self->proto = 0;
1367 self->fix_imports = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001368 memset(&self->buffer, 0, sizeof(Py_buffer));
1369 self->memo_size = 32;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001370 self->memo_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001371 self->memo = _Unpickler_NewMemo(self->memo_size);
1372 self->stack = (Pdata *)Pdata_New();
1373
1374 if (self->memo == NULL || self->stack == NULL) {
1375 Py_DECREF(self);
1376 return NULL;
1377 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001378
1379 return self;
1380}
1381
1382/* Returns -1 (with an exception set) on failure, 0 on success. This may
1383 be called once on a freshly created Pickler. */
1384static int
1385_Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file)
1386{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001387 _Py_IDENTIFIER(peek);
1388 _Py_IDENTIFIER(read);
1389 _Py_IDENTIFIER(readline);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001390
1391 self->peek = _PyObject_GetAttrId(file, &PyId_peek);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001392 if (self->peek == NULL) {
1393 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1394 PyErr_Clear();
1395 else
1396 return -1;
1397 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001398 self->read = _PyObject_GetAttrId(file, &PyId_read);
1399 self->readline = _PyObject_GetAttrId(file, &PyId_readline);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001400 if (self->readline == NULL || self->read == NULL) {
1401 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1402 PyErr_SetString(PyExc_TypeError,
1403 "file must have 'read' and 'readline' attributes");
1404 Py_CLEAR(self->read);
1405 Py_CLEAR(self->readline);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001406 Py_CLEAR(self->peek);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001407 return -1;
1408 }
1409 return 0;
1410}
1411
1412/* Returns -1 (with an exception set) on failure, 0 on success. This may
1413 be called once on a freshly created Pickler. */
1414static int
1415_Unpickler_SetInputEncoding(UnpicklerObject *self,
1416 const char *encoding,
1417 const char *errors)
1418{
1419 if (encoding == NULL)
1420 encoding = "ASCII";
1421 if (errors == NULL)
1422 errors = "strict";
1423
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001424 self->encoding = _PyMem_Strdup(encoding);
1425 self->errors = _PyMem_Strdup(errors);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001426 if (self->encoding == NULL || self->errors == NULL) {
1427 PyErr_NoMemory();
1428 return -1;
1429 }
1430 return 0;
1431}
1432
1433/* Generate a GET opcode for an object stored in the memo. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001434static int
1435memo_get(PicklerObject *self, PyObject *key)
1436{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001437 Py_ssize_t *value;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001438 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001439 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001440
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001441 value = PyMemoTable_Get(self->memo, key);
1442 if (value == NULL) {
1443 PyErr_SetObject(PyExc_KeyError, key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001444 return -1;
1445 }
1446
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001447 if (!self->bin) {
1448 pdata[0] = GET;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001449 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
1450 "%" PY_FORMAT_SIZE_T "d\n", *value);
1451 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001452 }
1453 else {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001454 if (*value < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001455 pdata[0] = BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001456 pdata[1] = (unsigned char)(*value & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001457 len = 2;
1458 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001459 else if (*value <= 0xffffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001460 pdata[0] = LONG_BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001461 pdata[1] = (unsigned char)(*value & 0xff);
1462 pdata[2] = (unsigned char)((*value >> 8) & 0xff);
1463 pdata[3] = (unsigned char)((*value >> 16) & 0xff);
1464 pdata[4] = (unsigned char)((*value >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001465 len = 5;
1466 }
1467 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001468 PickleState *st = _Pickle_GetGlobalState();
1469 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001470 "memo id too large for LONG_BINGET");
1471 return -1;
1472 }
1473 }
1474
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001475 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001476 return -1;
1477
1478 return 0;
1479}
1480
1481/* Store an object in the memo, assign it a new unique ID based on the number
1482 of objects currently stored in the memo and generate a PUT opcode. */
1483static int
1484memo_put(PicklerObject *self, PyObject *obj)
1485{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001486 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001487 Py_ssize_t len;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001488 Py_ssize_t idx;
1489
1490 const char memoize_op = MEMOIZE;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001491
1492 if (self->fast)
1493 return 0;
1494
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001495 idx = PyMemoTable_Size(self->memo);
1496 if (PyMemoTable_Set(self->memo, obj, idx) < 0)
1497 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001498
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001499 if (self->proto >= 4) {
1500 if (_Pickler_Write(self, &memoize_op, 1) < 0)
1501 return -1;
1502 return 0;
1503 }
1504 else if (!self->bin) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001505 pdata[0] = PUT;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001506 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001507 "%" PY_FORMAT_SIZE_T "d\n", idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001508 len = strlen(pdata);
1509 }
1510 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001511 if (idx < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001512 pdata[0] = BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001513 pdata[1] = (unsigned char)idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001514 len = 2;
1515 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001516 else if (idx <= 0xffffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001517 pdata[0] = LONG_BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001518 pdata[1] = (unsigned char)(idx & 0xff);
1519 pdata[2] = (unsigned char)((idx >> 8) & 0xff);
1520 pdata[3] = (unsigned char)((idx >> 16) & 0xff);
1521 pdata[4] = (unsigned char)((idx >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001522 len = 5;
1523 }
1524 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001525 PickleState *st = _Pickle_GetGlobalState();
1526 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001527 "memo id too large for LONG_BINPUT");
1528 return -1;
1529 }
1530 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001531 if (_Pickler_Write(self, pdata, len) < 0)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001532 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001533
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001534 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001535}
1536
1537static PyObject *
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001538getattribute(PyObject *obj, PyObject *name, int allow_qualname) {
1539 PyObject *dotted_path;
1540 Py_ssize_t i;
1541 _Py_static_string(PyId_dot, ".");
1542 _Py_static_string(PyId_locals, "<locals>");
1543
1544 dotted_path = PyUnicode_Split(name, _PyUnicode_FromId(&PyId_dot), -1);
1545 if (dotted_path == NULL) {
1546 return NULL;
1547 }
1548 assert(Py_SIZE(dotted_path) >= 1);
1549 if (!allow_qualname && Py_SIZE(dotted_path) > 1) {
1550 PyErr_Format(PyExc_AttributeError,
1551 "Can't get qualified attribute %R on %R;"
1552 "use protocols >= 4 to enable support",
1553 name, obj);
1554 Py_DECREF(dotted_path);
1555 return NULL;
1556 }
1557 Py_INCREF(obj);
1558 for (i = 0; i < Py_SIZE(dotted_path); i++) {
1559 PyObject *subpath = PyList_GET_ITEM(dotted_path, i);
1560 PyObject *tmp;
1561 PyObject *result = PyUnicode_RichCompare(
1562 subpath, _PyUnicode_FromId(&PyId_locals), Py_EQ);
1563 int is_equal = (result == Py_True);
1564 assert(PyBool_Check(result));
1565 Py_DECREF(result);
1566 if (is_equal) {
1567 PyErr_Format(PyExc_AttributeError,
1568 "Can't get local attribute %R on %R", name, obj);
1569 Py_DECREF(dotted_path);
1570 Py_DECREF(obj);
1571 return NULL;
1572 }
1573 tmp = PyObject_GetAttr(obj, subpath);
1574 Py_DECREF(obj);
1575 if (tmp == NULL) {
1576 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1577 PyErr_Clear();
1578 PyErr_Format(PyExc_AttributeError,
1579 "Can't get attribute %R on %R", name, obj);
1580 }
1581 Py_DECREF(dotted_path);
1582 return NULL;
1583 }
1584 obj = tmp;
1585 }
1586 Py_DECREF(dotted_path);
1587 return obj;
1588}
1589
1590static PyObject *
1591whichmodule(PyObject *global, PyObject *global_name, int allow_qualname)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001592{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001593 PyObject *module_name;
1594 PyObject *modules_dict;
1595 PyObject *module;
1596 PyObject *obj;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001597 Py_ssize_t i, j;
1598 _Py_IDENTIFIER(__module__);
1599 _Py_IDENTIFIER(modules);
1600 _Py_IDENTIFIER(__main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001601
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001602 module_name = _PyObject_GetAttrId(global, &PyId___module__);
1603
1604 if (module_name == NULL) {
1605 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001606 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001607 PyErr_Clear();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001608 }
1609 else {
1610 /* In some rare cases (e.g., bound methods of extension types),
1611 __module__ can be None. If it is so, then search sys.modules for
1612 the module of global. */
1613 if (module_name != Py_None)
1614 return module_name;
1615 Py_CLEAR(module_name);
1616 }
1617 assert(module_name == NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001618
Victor Stinnerbb520202013-11-06 22:40:41 +01001619 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02001620 if (modules_dict == NULL) {
1621 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001622 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02001623 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001624
1625 i = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001626 while ((j = PyDict_Next(modules_dict, &i, &module_name, &module))) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001627 PyObject *result = PyUnicode_RichCompare(
1628 module_name, _PyUnicode_FromId(&PyId___main__), Py_EQ);
1629 int is_equal = (result == Py_True);
1630 assert(PyBool_Check(result));
1631 Py_DECREF(result);
1632 if (is_equal)
1633 continue;
1634 if (module == Py_None)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001635 continue;
1636
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001637 obj = getattribute(module, global_name, allow_qualname);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001638 if (obj == NULL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001639 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001640 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001641 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001642 continue;
1643 }
1644
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001645 if (obj == global) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001646 Py_DECREF(obj);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001647 Py_INCREF(module_name);
1648 return module_name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001649 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001650 Py_DECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001651 }
1652
1653 /* If no module is found, use __main__. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001654 module_name = _PyUnicode_FromId(&PyId___main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001655 Py_INCREF(module_name);
1656 return module_name;
1657}
1658
1659/* fast_save_enter() and fast_save_leave() are guards against recursive
1660 objects when Pickler is used with the "fast mode" (i.e., with object
1661 memoization disabled). If the nesting of a list or dict object exceed
1662 FAST_NESTING_LIMIT, these guards will start keeping an internal
1663 reference to the seen list or dict objects and check whether these objects
1664 are recursive. These are not strictly necessary, since save() has a
1665 hard-coded recursion limit, but they give a nicer error message than the
1666 typical RuntimeError. */
1667static int
1668fast_save_enter(PicklerObject *self, PyObject *obj)
1669{
1670 /* if fast_nesting < 0, we're doing an error exit. */
1671 if (++self->fast_nesting >= FAST_NESTING_LIMIT) {
1672 PyObject *key = NULL;
1673 if (self->fast_memo == NULL) {
1674 self->fast_memo = PyDict_New();
1675 if (self->fast_memo == NULL) {
1676 self->fast_nesting = -1;
1677 return 0;
1678 }
1679 }
1680 key = PyLong_FromVoidPtr(obj);
1681 if (key == NULL)
1682 return 0;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001683 if (PyDict_GetItemWithError(self->fast_memo, key)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001684 Py_DECREF(key);
1685 PyErr_Format(PyExc_ValueError,
1686 "fast mode: can't pickle cyclic objects "
1687 "including object type %.200s at %p",
1688 obj->ob_type->tp_name, obj);
1689 self->fast_nesting = -1;
1690 return 0;
1691 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001692 if (PyErr_Occurred()) {
1693 return 0;
1694 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001695 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
1696 Py_DECREF(key);
1697 self->fast_nesting = -1;
1698 return 0;
1699 }
1700 Py_DECREF(key);
1701 }
1702 return 1;
1703}
1704
1705static int
1706fast_save_leave(PicklerObject *self, PyObject *obj)
1707{
1708 if (self->fast_nesting-- >= FAST_NESTING_LIMIT) {
1709 PyObject *key = PyLong_FromVoidPtr(obj);
1710 if (key == NULL)
1711 return 0;
1712 if (PyDict_DelItem(self->fast_memo, key) < 0) {
1713 Py_DECREF(key);
1714 return 0;
1715 }
1716 Py_DECREF(key);
1717 }
1718 return 1;
1719}
1720
1721static int
1722save_none(PicklerObject *self, PyObject *obj)
1723{
1724 const char none_op = NONE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001725 if (_Pickler_Write(self, &none_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001726 return -1;
1727
1728 return 0;
1729}
1730
1731static int
1732save_bool(PicklerObject *self, PyObject *obj)
1733{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001734 if (self->proto >= 2) {
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001735 const char bool_op = (obj == Py_True) ? NEWTRUE : NEWFALSE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001736 if (_Pickler_Write(self, &bool_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001737 return -1;
1738 }
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001739 else {
1740 /* These aren't opcodes -- they're ways to pickle bools before protocol 2
1741 * so that unpicklers written before bools were introduced unpickle them
1742 * as ints, but unpicklers after can recognize that bools were intended.
1743 * Note that protocol 2 added direct ways to pickle bools.
1744 */
1745 const char *bool_str = (obj == Py_True) ? "I01\n" : "I00\n";
1746 if (_Pickler_Write(self, bool_str, strlen(bool_str)) < 0)
1747 return -1;
1748 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001749 return 0;
1750}
1751
1752static int
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001753save_long(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001754{
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001755 PyObject *repr = NULL;
1756 Py_ssize_t size;
1757 long val;
1758 int status = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001759
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001760 const char long_op = LONG;
1761
1762 val= PyLong_AsLong(obj);
1763 if (val == -1 && PyErr_Occurred()) {
1764 /* out of range for int pickling */
1765 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001766 }
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001767 else if (self->bin &&
1768 (sizeof(long) <= 4 ||
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001769 (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1)))) {
Larry Hastings61272b72014-01-07 12:41:53 -08001770 /* result fits in a signed 4-byte integer.
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001771
1772 Note: we can't use -0x80000000L in the above condition because some
1773 compilers (e.g., MSVC) will promote 0x80000000L to an unsigned type
1774 before applying the unary minus when sizeof(long) <= 4. The
1775 resulting value stays unsigned which is commonly not what we want,
1776 so MSVC happily warns us about it. However, that result would have
1777 been fine because we guard for sizeof(long) <= 4 which turns the
1778 condition true in that particular case. */
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001779 char pdata[32];
1780 Py_ssize_t len = 0;
1781
1782 pdata[1] = (unsigned char)(val & 0xff);
1783 pdata[2] = (unsigned char)((val >> 8) & 0xff);
1784 pdata[3] = (unsigned char)((val >> 16) & 0xff);
1785 pdata[4] = (unsigned char)((val >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001786
1787 if ((pdata[4] == 0) && (pdata[3] == 0)) {
1788 if (pdata[2] == 0) {
1789 pdata[0] = BININT1;
1790 len = 2;
1791 }
1792 else {
1793 pdata[0] = BININT2;
1794 len = 3;
1795 }
1796 }
1797 else {
1798 pdata[0] = BININT;
1799 len = 5;
1800 }
1801
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001802 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001803 return -1;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001804
1805 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001806 }
1807
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001808 if (self->proto >= 2) {
1809 /* Linear-time pickling. */
1810 size_t nbits;
1811 size_t nbytes;
1812 unsigned char *pdata;
1813 char header[5];
1814 int i;
1815 int sign = _PyLong_Sign(obj);
1816
1817 if (sign == 0) {
1818 header[0] = LONG1;
1819 header[1] = 0; /* It's 0 -- an empty bytestring. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001820 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001821 goto error;
1822 return 0;
1823 }
1824 nbits = _PyLong_NumBits(obj);
1825 if (nbits == (size_t)-1 && PyErr_Occurred())
1826 goto error;
1827 /* How many bytes do we need? There are nbits >> 3 full
1828 * bytes of data, and nbits & 7 leftover bits. If there
1829 * are any leftover bits, then we clearly need another
1830 * byte. Wnat's not so obvious is that we *probably*
1831 * need another byte even if there aren't any leftovers:
1832 * the most-significant bit of the most-significant byte
1833 * acts like a sign bit, and it's usually got a sense
Serhiy Storchaka95949422013-08-27 19:40:23 +03001834 * opposite of the one we need. The exception is ints
1835 * of the form -(2**(8*j-1)) for j > 0. Such an int is
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001836 * its own 256's-complement, so has the right sign bit
1837 * even without the extra byte. That's a pain to check
1838 * for in advance, though, so we always grab an extra
1839 * byte at the start, and cut it back later if possible.
1840 */
1841 nbytes = (nbits >> 3) + 1;
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001842 if (nbytes > 0x7fffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001843 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03001844 "int too large to pickle");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001845 goto error;
1846 }
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001847 repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001848 if (repr == NULL)
1849 goto error;
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001850 pdata = (unsigned char *)PyBytes_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001851 i = _PyLong_AsByteArray((PyLongObject *)obj,
1852 pdata, nbytes,
1853 1 /* little endian */ , 1 /* signed */ );
1854 if (i < 0)
1855 goto error;
Serhiy Storchaka95949422013-08-27 19:40:23 +03001856 /* If the int is negative, this may be a byte more than
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001857 * needed. This is so iff the MSB is all redundant sign
1858 * bits.
1859 */
1860 if (sign < 0 &&
Victor Stinner121aab42011-09-29 23:40:53 +02001861 nbytes > 1 &&
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001862 pdata[nbytes - 1] == 0xff &&
1863 (pdata[nbytes - 2] & 0x80) != 0) {
1864 nbytes--;
1865 }
1866
1867 if (nbytes < 256) {
1868 header[0] = LONG1;
1869 header[1] = (unsigned char)nbytes;
1870 size = 2;
1871 }
1872 else {
1873 header[0] = LONG4;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001874 size = (Py_ssize_t) nbytes;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001875 for (i = 1; i < 5; i++) {
1876 header[i] = (unsigned char)(size & 0xff);
1877 size >>= 8;
1878 }
1879 size = 5;
1880 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001881 if (_Pickler_Write(self, header, size) < 0 ||
1882 _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001883 goto error;
1884 }
1885 else {
1886 char *string;
1887
Mark Dickinson8dd05142009-01-20 20:43:58 +00001888 /* proto < 2: write the repr and newline. This is quadratic-time (in
1889 the number of digits), in both directions. We add a trailing 'L'
1890 to the repr, for compatibility with Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001891
1892 repr = PyObject_Repr(obj);
1893 if (repr == NULL)
1894 goto error;
1895
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001896 string = _PyUnicode_AsStringAndSize(repr, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001897 if (string == NULL)
1898 goto error;
1899
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001900 if (_Pickler_Write(self, &long_op, 1) < 0 ||
1901 _Pickler_Write(self, string, size) < 0 ||
1902 _Pickler_Write(self, "L\n", 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001903 goto error;
1904 }
1905
1906 if (0) {
1907 error:
1908 status = -1;
1909 }
1910 Py_XDECREF(repr);
1911
1912 return status;
1913}
1914
1915static int
1916save_float(PicklerObject *self, PyObject *obj)
1917{
1918 double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj);
1919
1920 if (self->bin) {
1921 char pdata[9];
1922 pdata[0] = BINFLOAT;
1923 if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0)
1924 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001925 if (_Pickler_Write(self, pdata, 9) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001926 return -1;
Victor Stinner121aab42011-09-29 23:40:53 +02001927 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001928 else {
Eric Smith0923d1d2009-04-16 20:16:10 +00001929 int result = -1;
1930 char *buf = NULL;
1931 char op = FLOAT;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001932
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001933 if (_Pickler_Write(self, &op, 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001934 goto done;
1935
Mark Dickinson3e09f432009-04-17 08:41:23 +00001936 buf = PyOS_double_to_string(x, 'g', 17, 0, NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +00001937 if (!buf) {
1938 PyErr_NoMemory();
1939 goto done;
1940 }
1941
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001942 if (_Pickler_Write(self, buf, strlen(buf)) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001943 goto done;
1944
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001945 if (_Pickler_Write(self, "\n", 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001946 goto done;
1947
1948 result = 0;
1949done:
1950 PyMem_Free(buf);
1951 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001952 }
1953
1954 return 0;
1955}
1956
1957static int
1958save_bytes(PicklerObject *self, PyObject *obj)
1959{
1960 if (self->proto < 3) {
1961 /* Older pickle protocols do not have an opcode for pickling bytes
1962 objects. Therefore, we need to fake the copy protocol (i.e.,
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001963 the __reduce__ method) to permit bytes object unpickling.
1964
1965 Here we use a hack to be compatible with Python 2. Since in Python
1966 2 'bytes' is just an alias for 'str' (which has different
1967 parameters than the actual bytes object), we use codecs.encode
1968 to create the appropriate 'str' object when unpickled using
1969 Python 2 *and* the appropriate 'bytes' object when unpickled
1970 using Python 3. Again this is a hack and we don't need to do this
1971 with newer protocols. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001972 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001973 int status;
1974
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001975 if (PyBytes_GET_SIZE(obj) == 0) {
1976 reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type);
1977 }
1978 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001979 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001980 PyObject *unicode_str =
1981 PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj),
1982 PyBytes_GET_SIZE(obj),
1983 "strict");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001984 _Py_IDENTIFIER(latin1);
1985
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001986 if (unicode_str == NULL)
1987 return -1;
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001988 reduce_value = Py_BuildValue("(O(OO))",
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001989 st->codecs_encode, unicode_str,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001990 _PyUnicode_FromId(&PyId_latin1));
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001991 Py_DECREF(unicode_str);
1992 }
1993
1994 if (reduce_value == NULL)
1995 return -1;
1996
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001997 /* save_reduce() will memoize the object automatically. */
1998 status = save_reduce(self, reduce_value, obj);
1999 Py_DECREF(reduce_value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002000 return status;
2001 }
2002 else {
2003 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002004 char header[9];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002005 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002006
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002007 size = PyBytes_GET_SIZE(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002008 if (size < 0)
2009 return -1;
2010
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002011 if (size <= 0xff) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002012 header[0] = SHORT_BINBYTES;
2013 header[1] = (unsigned char)size;
2014 len = 2;
2015 }
2016 else if (size <= 0xffffffffL) {
2017 header[0] = BINBYTES;
2018 header[1] = (unsigned char)(size & 0xff);
2019 header[2] = (unsigned char)((size >> 8) & 0xff);
2020 header[3] = (unsigned char)((size >> 16) & 0xff);
2021 header[4] = (unsigned char)((size >> 24) & 0xff);
2022 len = 5;
2023 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002024 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002025 header[0] = BINBYTES8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002026 _write_size64(header + 1, size);
Alexandre Vassalotti6e73ff12013-12-05 19:29:32 -08002027 len = 9;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002028 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002029 else {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002030 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakaf8def282013-02-16 17:29:56 +02002031 "cannot serialize a bytes object larger than 4 GiB");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002032 return -1; /* string too large */
2033 }
2034
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002035 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002036 return -1;
2037
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002038 if (_Pickler_Write(self, PyBytes_AS_STRING(obj), size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002039 return -1;
2040
2041 if (memo_put(self, obj) < 0)
2042 return -1;
2043
2044 return 0;
2045 }
2046}
2047
2048/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
2049 backslash and newline characters to \uXXXX escapes. */
2050static PyObject *
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002051raw_unicode_escape(PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002052{
2053 PyObject *repr, *result;
2054 char *p;
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002055 Py_ssize_t i, size, expandsize;
2056 void *data;
2057 unsigned int kind;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002058
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002059 if (PyUnicode_READY(obj))
2060 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002061
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002062 size = PyUnicode_GET_LENGTH(obj);
2063 data = PyUnicode_DATA(obj);
2064 kind = PyUnicode_KIND(obj);
2065 if (kind == PyUnicode_4BYTE_KIND)
2066 expandsize = 10;
2067 else
2068 expandsize = 6;
Victor Stinner121aab42011-09-29 23:40:53 +02002069
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002070 if (size > PY_SSIZE_T_MAX / expandsize)
2071 return PyErr_NoMemory();
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002072 repr = PyByteArray_FromStringAndSize(NULL, expandsize * size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002073 if (repr == NULL)
2074 return NULL;
2075 if (size == 0)
2076 goto done;
2077
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002078 p = PyByteArray_AS_STRING(repr);
2079 for (i=0; i < size; i++) {
2080 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002081 /* Map 32-bit characters to '\Uxxxxxxxx' */
2082 if (ch >= 0x10000) {
2083 *p++ = '\\';
2084 *p++ = 'U';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002085 *p++ = Py_hexdigits[(ch >> 28) & 0xf];
2086 *p++ = Py_hexdigits[(ch >> 24) & 0xf];
2087 *p++ = Py_hexdigits[(ch >> 20) & 0xf];
2088 *p++ = Py_hexdigits[(ch >> 16) & 0xf];
2089 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2090 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2091 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2092 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002093 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002094 /* Map 16-bit characters to '\uxxxx' */
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002095 else if (ch >= 256 || ch == '\\' || ch == '\n') {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002096 *p++ = '\\';
2097 *p++ = 'u';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002098 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2099 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2100 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2101 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002102 }
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002103 /* Copy everything else as-is */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002104 else
2105 *p++ = (char) ch;
2106 }
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002107 size = p - PyByteArray_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002108
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002109done:
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002110 result = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(repr), size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002111 Py_DECREF(repr);
2112 return result;
2113}
2114
2115static int
Antoine Pitrou299978d2013-04-07 17:38:11 +02002116write_utf8(PicklerObject *self, char *data, Py_ssize_t size)
2117{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002118 char header[9];
2119 Py_ssize_t len;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002120
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002121 if (size <= 0xff && self->proto >= 4) {
2122 header[0] = SHORT_BINUNICODE;
2123 header[1] = (unsigned char)(size & 0xff);
2124 len = 2;
2125 }
2126 else if (size <= 0xffffffffUL) {
2127 header[0] = BINUNICODE;
2128 header[1] = (unsigned char)(size & 0xff);
2129 header[2] = (unsigned char)((size >> 8) & 0xff);
2130 header[3] = (unsigned char)((size >> 16) & 0xff);
2131 header[4] = (unsigned char)((size >> 24) & 0xff);
2132 len = 5;
2133 }
2134 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002135 header[0] = BINUNICODE8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002136 _write_size64(header + 1, size);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002137 len = 9;
2138 }
2139 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002140 PyErr_SetString(PyExc_OverflowError,
Antoine Pitrou4b7b0f02013-04-07 23:46:52 +02002141 "cannot serialize a string larger than 4GiB");
Antoine Pitrou299978d2013-04-07 17:38:11 +02002142 return -1;
2143 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002144
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002145 if (_Pickler_Write(self, header, len) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002146 return -1;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002147 if (_Pickler_Write(self, data, size) < 0)
2148 return -1;
2149
2150 return 0;
2151}
2152
2153static int
2154write_unicode_binary(PicklerObject *self, PyObject *obj)
2155{
2156 PyObject *encoded = NULL;
2157 Py_ssize_t size;
2158 char *data;
2159 int r;
2160
2161 if (PyUnicode_READY(obj))
2162 return -1;
2163
2164 data = PyUnicode_AsUTF8AndSize(obj, &size);
2165 if (data != NULL)
2166 return write_utf8(self, data, size);
2167
2168 /* Issue #8383: for strings with lone surrogates, fallback on the
2169 "surrogatepass" error handler. */
2170 PyErr_Clear();
2171 encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
2172 if (encoded == NULL)
2173 return -1;
2174
2175 r = write_utf8(self, PyBytes_AS_STRING(encoded),
2176 PyBytes_GET_SIZE(encoded));
2177 Py_DECREF(encoded);
2178 return r;
2179}
2180
2181static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002182save_unicode(PicklerObject *self, PyObject *obj)
2183{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002184 if (self->bin) {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002185 if (write_unicode_binary(self, obj) < 0)
2186 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002187 }
2188 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002189 PyObject *encoded;
2190 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002191 const char unicode_op = UNICODE;
2192
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002193 encoded = raw_unicode_escape(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002194 if (encoded == NULL)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002195 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002196
Antoine Pitrou299978d2013-04-07 17:38:11 +02002197 if (_Pickler_Write(self, &unicode_op, 1) < 0) {
2198 Py_DECREF(encoded);
2199 return -1;
2200 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002201
2202 size = PyBytes_GET_SIZE(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002203 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
2204 Py_DECREF(encoded);
2205 return -1;
2206 }
2207 Py_DECREF(encoded);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002208
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002209 if (_Pickler_Write(self, "\n", 1) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002210 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002211 }
2212 if (memo_put(self, obj) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002213 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002214
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002215 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002216}
2217
2218/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
2219static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002220store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002221{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002222 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002223
2224 assert(PyTuple_Size(t) == len);
2225
2226 for (i = 0; i < len; i++) {
2227 PyObject *element = PyTuple_GET_ITEM(t, i);
2228
2229 if (element == NULL)
2230 return -1;
2231 if (save(self, element, 0) < 0)
2232 return -1;
2233 }
2234
2235 return 0;
2236}
2237
2238/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2239 * used across protocols to minimize the space needed to pickle them.
2240 * Tuples are also the only builtin immutable type that can be recursive
2241 * (a tuple can be reached from itself), and that requires some subtle
2242 * magic so that it works in all cases. IOW, this is a long routine.
2243 */
2244static int
2245save_tuple(PicklerObject *self, PyObject *obj)
2246{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002247 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002248
2249 const char mark_op = MARK;
2250 const char tuple_op = TUPLE;
2251 const char pop_op = POP;
2252 const char pop_mark_op = POP_MARK;
2253 const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2254
2255 if ((len = PyTuple_Size(obj)) < 0)
2256 return -1;
2257
2258 if (len == 0) {
2259 char pdata[2];
2260
2261 if (self->proto) {
2262 pdata[0] = EMPTY_TUPLE;
2263 len = 1;
2264 }
2265 else {
2266 pdata[0] = MARK;
2267 pdata[1] = TUPLE;
2268 len = 2;
2269 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002270 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002271 return -1;
2272 return 0;
2273 }
2274
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002275 /* The tuple isn't in the memo now. If it shows up there after
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002276 * saving the tuple elements, the tuple must be recursive, in
2277 * which case we'll pop everything we put on the stack, and fetch
2278 * its value from the memo.
2279 */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002280 if (len <= 3 && self->proto >= 2) {
2281 /* Use TUPLE{1,2,3} opcodes. */
2282 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002283 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002284
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002285 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002286 /* pop the len elements */
2287 for (i = 0; i < len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002288 if (_Pickler_Write(self, &pop_op, 1) < 0)
2289 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002290 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002291 if (memo_get(self, obj) < 0)
2292 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002293
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002294 return 0;
2295 }
2296 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002297 if (_Pickler_Write(self, len2opcode + len, 1) < 0)
2298 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002299 }
2300 goto memoize;
2301 }
2302
2303 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2304 * Generate MARK e1 e2 ... TUPLE
2305 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002306 if (_Pickler_Write(self, &mark_op, 1) < 0)
2307 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002308
2309 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002310 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002311
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002312 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002313 /* pop the stack stuff we pushed */
2314 if (self->bin) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002315 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2316 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002317 }
2318 else {
2319 /* Note that we pop one more than len, to remove
2320 * the MARK too.
2321 */
2322 for (i = 0; i <= len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002323 if (_Pickler_Write(self, &pop_op, 1) < 0)
2324 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002325 }
2326 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002327 if (memo_get(self, obj) < 0)
2328 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002329
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002330 return 0;
2331 }
2332 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002333 if (_Pickler_Write(self, &tuple_op, 1) < 0)
2334 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002335 }
2336
2337 memoize:
2338 if (memo_put(self, obj) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002339 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002340
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002341 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002342}
2343
2344/* iter is an iterator giving items, and we batch up chunks of
2345 * MARK item item ... item APPENDS
2346 * opcode sequences. Calling code should have arranged to first create an
2347 * empty list, or list-like object, for the APPENDS to operate on.
2348 * Returns 0 on success, <0 on error.
2349 */
2350static int
2351batch_list(PicklerObject *self, PyObject *iter)
2352{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002353 PyObject *obj = NULL;
2354 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002355 int i, n;
2356
2357 const char mark_op = MARK;
2358 const char append_op = APPEND;
2359 const char appends_op = APPENDS;
2360
2361 assert(iter != NULL);
2362
2363 /* XXX: I think this function could be made faster by avoiding the
2364 iterator interface and fetching objects directly from list using
2365 PyList_GET_ITEM.
2366 */
2367
2368 if (self->proto == 0) {
2369 /* APPENDS isn't available; do one at a time. */
2370 for (;;) {
2371 obj = PyIter_Next(iter);
2372 if (obj == NULL) {
2373 if (PyErr_Occurred())
2374 return -1;
2375 break;
2376 }
2377 i = save(self, obj, 0);
2378 Py_DECREF(obj);
2379 if (i < 0)
2380 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002381 if (_Pickler_Write(self, &append_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002382 return -1;
2383 }
2384 return 0;
2385 }
2386
2387 /* proto > 0: write in batches of BATCHSIZE. */
2388 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002389 /* Get first item */
2390 firstitem = PyIter_Next(iter);
2391 if (firstitem == NULL) {
2392 if (PyErr_Occurred())
2393 goto error;
2394
2395 /* nothing more to add */
2396 break;
2397 }
2398
2399 /* Try to get a second item */
2400 obj = PyIter_Next(iter);
2401 if (obj == NULL) {
2402 if (PyErr_Occurred())
2403 goto error;
2404
2405 /* Only one item to write */
2406 if (save(self, firstitem, 0) < 0)
2407 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002408 if (_Pickler_Write(self, &append_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002409 goto error;
2410 Py_CLEAR(firstitem);
2411 break;
2412 }
2413
2414 /* More than one item to write */
2415
2416 /* Pump out MARK, items, APPENDS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002417 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002418 goto error;
2419
2420 if (save(self, firstitem, 0) < 0)
2421 goto error;
2422 Py_CLEAR(firstitem);
2423 n = 1;
2424
2425 /* Fetch and save up to BATCHSIZE items */
2426 while (obj) {
2427 if (save(self, obj, 0) < 0)
2428 goto error;
2429 Py_CLEAR(obj);
2430 n += 1;
2431
2432 if (n == BATCHSIZE)
2433 break;
2434
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002435 obj = PyIter_Next(iter);
2436 if (obj == NULL) {
2437 if (PyErr_Occurred())
2438 goto error;
2439 break;
2440 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002441 }
2442
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002443 if (_Pickler_Write(self, &appends_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002444 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002445
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002446 } while (n == BATCHSIZE);
2447 return 0;
2448
2449 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002450 Py_XDECREF(firstitem);
2451 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002452 return -1;
2453}
2454
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002455/* This is a variant of batch_list() above, specialized for lists (with no
2456 * support for list subclasses). Like batch_list(), we batch up chunks of
2457 * MARK item item ... item APPENDS
2458 * opcode sequences. Calling code should have arranged to first create an
2459 * empty list, or list-like object, for the APPENDS to operate on.
2460 * Returns 0 on success, -1 on error.
2461 *
2462 * This version is considerably faster than batch_list(), if less general.
2463 *
2464 * Note that this only works for protocols > 0.
2465 */
2466static int
2467batch_list_exact(PicklerObject *self, PyObject *obj)
2468{
2469 PyObject *item = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002470 Py_ssize_t this_batch, total;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002471
2472 const char append_op = APPEND;
2473 const char appends_op = APPENDS;
2474 const char mark_op = MARK;
2475
2476 assert(obj != NULL);
2477 assert(self->proto > 0);
2478 assert(PyList_CheckExact(obj));
2479
2480 if (PyList_GET_SIZE(obj) == 1) {
2481 item = PyList_GET_ITEM(obj, 0);
2482 if (save(self, item, 0) < 0)
2483 return -1;
2484 if (_Pickler_Write(self, &append_op, 1) < 0)
2485 return -1;
2486 return 0;
2487 }
2488
2489 /* Write in batches of BATCHSIZE. */
2490 total = 0;
2491 do {
2492 this_batch = 0;
2493 if (_Pickler_Write(self, &mark_op, 1) < 0)
2494 return -1;
2495 while (total < PyList_GET_SIZE(obj)) {
2496 item = PyList_GET_ITEM(obj, total);
2497 if (save(self, item, 0) < 0)
2498 return -1;
2499 total++;
2500 if (++this_batch == BATCHSIZE)
2501 break;
2502 }
2503 if (_Pickler_Write(self, &appends_op, 1) < 0)
2504 return -1;
2505
2506 } while (total < PyList_GET_SIZE(obj));
2507
2508 return 0;
2509}
2510
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002511static int
2512save_list(PicklerObject *self, PyObject *obj)
2513{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002514 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002515 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002516 int status = 0;
2517
2518 if (self->fast && !fast_save_enter(self, obj))
2519 goto error;
2520
2521 /* Create an empty list. */
2522 if (self->bin) {
2523 header[0] = EMPTY_LIST;
2524 len = 1;
2525 }
2526 else {
2527 header[0] = MARK;
2528 header[1] = LIST;
2529 len = 2;
2530 }
2531
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002532 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002533 goto error;
2534
2535 /* Get list length, and bow out early if empty. */
2536 if ((len = PyList_Size(obj)) < 0)
2537 goto error;
2538
2539 if (memo_put(self, obj) < 0)
2540 goto error;
2541
2542 if (len != 0) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002543 /* Materialize the list elements. */
2544 if (PyList_CheckExact(obj) && self->proto > 0) {
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002545 if (Py_EnterRecursiveCall(" while pickling an object"))
2546 goto error;
2547 status = batch_list_exact(self, obj);
2548 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002549 } else {
2550 PyObject *iter = PyObject_GetIter(obj);
2551 if (iter == NULL)
2552 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002553
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002554 if (Py_EnterRecursiveCall(" while pickling an object")) {
2555 Py_DECREF(iter);
2556 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002557 }
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002558 status = batch_list(self, iter);
2559 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002560 Py_DECREF(iter);
2561 }
2562 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002563 if (0) {
2564 error:
2565 status = -1;
2566 }
2567
2568 if (self->fast && !fast_save_leave(self, obj))
2569 status = -1;
2570
2571 return status;
2572}
2573
2574/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
2575 * MARK key value ... key value SETITEMS
2576 * opcode sequences. Calling code should have arranged to first create an
2577 * empty dict, or dict-like object, for the SETITEMS to operate on.
2578 * Returns 0 on success, <0 on error.
2579 *
2580 * This is very much like batch_list(). The difference between saving
2581 * elements directly, and picking apart two-tuples, is so long-winded at
2582 * the C level, though, that attempts to combine these routines were too
2583 * ugly to bear.
2584 */
2585static int
2586batch_dict(PicklerObject *self, PyObject *iter)
2587{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002588 PyObject *obj = NULL;
2589 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002590 int i, n;
2591
2592 const char mark_op = MARK;
2593 const char setitem_op = SETITEM;
2594 const char setitems_op = SETITEMS;
2595
2596 assert(iter != NULL);
2597
2598 if (self->proto == 0) {
2599 /* SETITEMS isn't available; do one at a time. */
2600 for (;;) {
2601 obj = PyIter_Next(iter);
2602 if (obj == NULL) {
2603 if (PyErr_Occurred())
2604 return -1;
2605 break;
2606 }
2607 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2608 PyErr_SetString(PyExc_TypeError, "dict items "
2609 "iterator must return 2-tuples");
2610 return -1;
2611 }
2612 i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
2613 if (i >= 0)
2614 i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
2615 Py_DECREF(obj);
2616 if (i < 0)
2617 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002618 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002619 return -1;
2620 }
2621 return 0;
2622 }
2623
2624 /* proto > 0: write in batches of BATCHSIZE. */
2625 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002626 /* Get first item */
2627 firstitem = PyIter_Next(iter);
2628 if (firstitem == NULL) {
2629 if (PyErr_Occurred())
2630 goto error;
2631
2632 /* nothing more to add */
2633 break;
2634 }
2635 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
2636 PyErr_SetString(PyExc_TypeError, "dict items "
2637 "iterator must return 2-tuples");
2638 goto error;
2639 }
2640
2641 /* Try to get a second item */
2642 obj = PyIter_Next(iter);
2643 if (obj == NULL) {
2644 if (PyErr_Occurred())
2645 goto error;
2646
2647 /* Only one item to write */
2648 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2649 goto error;
2650 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2651 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002652 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002653 goto error;
2654 Py_CLEAR(firstitem);
2655 break;
2656 }
2657
2658 /* More than one item to write */
2659
2660 /* Pump out MARK, items, SETITEMS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002661 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002662 goto error;
2663
2664 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2665 goto error;
2666 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2667 goto error;
2668 Py_CLEAR(firstitem);
2669 n = 1;
2670
2671 /* Fetch and save up to BATCHSIZE items */
2672 while (obj) {
2673 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2674 PyErr_SetString(PyExc_TypeError, "dict items "
2675 "iterator must return 2-tuples");
2676 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002677 }
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002678 if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
2679 save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0)
2680 goto error;
2681 Py_CLEAR(obj);
2682 n += 1;
2683
2684 if (n == BATCHSIZE)
2685 break;
2686
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002687 obj = PyIter_Next(iter);
2688 if (obj == NULL) {
2689 if (PyErr_Occurred())
2690 goto error;
2691 break;
2692 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002693 }
2694
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002695 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002696 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002697
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002698 } while (n == BATCHSIZE);
2699 return 0;
2700
2701 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002702 Py_XDECREF(firstitem);
2703 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002704 return -1;
2705}
2706
Collin Winter5c9b02d2009-05-25 05:43:30 +00002707/* This is a variant of batch_dict() above that specializes for dicts, with no
2708 * support for dict subclasses. Like batch_dict(), we batch up chunks of
2709 * MARK key value ... key value SETITEMS
2710 * opcode sequences. Calling code should have arranged to first create an
2711 * empty dict, or dict-like object, for the SETITEMS to operate on.
2712 * Returns 0 on success, -1 on error.
2713 *
2714 * Note that this currently doesn't work for protocol 0.
2715 */
2716static int
2717batch_dict_exact(PicklerObject *self, PyObject *obj)
2718{
2719 PyObject *key = NULL, *value = NULL;
2720 int i;
2721 Py_ssize_t dict_size, ppos = 0;
2722
Alexandre Vassalottif70b1292009-05-25 18:00:52 +00002723 const char mark_op = MARK;
2724 const char setitem_op = SETITEM;
2725 const char setitems_op = SETITEMS;
Collin Winter5c9b02d2009-05-25 05:43:30 +00002726
2727 assert(obj != NULL);
2728 assert(self->proto > 0);
2729
2730 dict_size = PyDict_Size(obj);
2731
2732 /* Special-case len(d) == 1 to save space. */
2733 if (dict_size == 1) {
2734 PyDict_Next(obj, &ppos, &key, &value);
2735 if (save(self, key, 0) < 0)
2736 return -1;
2737 if (save(self, value, 0) < 0)
2738 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002739 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002740 return -1;
2741 return 0;
2742 }
2743
2744 /* Write in batches of BATCHSIZE. */
2745 do {
2746 i = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002747 if (_Pickler_Write(self, &mark_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002748 return -1;
2749 while (PyDict_Next(obj, &ppos, &key, &value)) {
2750 if (save(self, key, 0) < 0)
2751 return -1;
2752 if (save(self, value, 0) < 0)
2753 return -1;
2754 if (++i == BATCHSIZE)
2755 break;
2756 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002757 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002758 return -1;
2759 if (PyDict_Size(obj) != dict_size) {
2760 PyErr_Format(
2761 PyExc_RuntimeError,
2762 "dictionary changed size during iteration");
2763 return -1;
2764 }
2765
2766 } while (i == BATCHSIZE);
2767 return 0;
2768}
2769
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002770static int
2771save_dict(PicklerObject *self, PyObject *obj)
2772{
2773 PyObject *items, *iter;
2774 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002775 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002776 int status = 0;
2777
2778 if (self->fast && !fast_save_enter(self, obj))
2779 goto error;
2780
2781 /* Create an empty dict. */
2782 if (self->bin) {
2783 header[0] = EMPTY_DICT;
2784 len = 1;
2785 }
2786 else {
2787 header[0] = MARK;
2788 header[1] = DICT;
2789 len = 2;
2790 }
2791
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002792 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002793 goto error;
2794
2795 /* Get dict size, and bow out early if empty. */
2796 if ((len = PyDict_Size(obj)) < 0)
2797 goto error;
2798
2799 if (memo_put(self, obj) < 0)
2800 goto error;
2801
2802 if (len != 0) {
2803 /* Save the dict items. */
Collin Winter5c9b02d2009-05-25 05:43:30 +00002804 if (PyDict_CheckExact(obj) && self->proto > 0) {
2805 /* We can take certain shortcuts if we know this is a dict and
2806 not a dict subclass. */
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002807 if (Py_EnterRecursiveCall(" while pickling an object"))
2808 goto error;
2809 status = batch_dict_exact(self, obj);
2810 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002811 } else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002812 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002813
2814 items = _PyObject_CallMethodId(obj, &PyId_items, "()");
Collin Winter5c9b02d2009-05-25 05:43:30 +00002815 if (items == NULL)
2816 goto error;
2817 iter = PyObject_GetIter(items);
2818 Py_DECREF(items);
2819 if (iter == NULL)
2820 goto error;
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002821 if (Py_EnterRecursiveCall(" while pickling an object")) {
2822 Py_DECREF(iter);
2823 goto error;
2824 }
Collin Winter5c9b02d2009-05-25 05:43:30 +00002825 status = batch_dict(self, iter);
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002826 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002827 Py_DECREF(iter);
2828 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002829 }
2830
2831 if (0) {
2832 error:
2833 status = -1;
2834 }
2835
2836 if (self->fast && !fast_save_leave(self, obj))
2837 status = -1;
2838
2839 return status;
2840}
2841
2842static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002843save_set(PicklerObject *self, PyObject *obj)
2844{
2845 PyObject *item;
2846 int i;
2847 Py_ssize_t set_size, ppos = 0;
2848 Py_hash_t hash;
2849
2850 const char empty_set_op = EMPTY_SET;
2851 const char mark_op = MARK;
2852 const char additems_op = ADDITEMS;
2853
2854 if (self->proto < 4) {
2855 PyObject *items;
2856 PyObject *reduce_value;
2857 int status;
2858
2859 items = PySequence_List(obj);
2860 if (items == NULL) {
2861 return -1;
2862 }
2863 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
2864 Py_DECREF(items);
2865 if (reduce_value == NULL) {
2866 return -1;
2867 }
2868 /* save_reduce() will memoize the object automatically. */
2869 status = save_reduce(self, reduce_value, obj);
2870 Py_DECREF(reduce_value);
2871 return status;
2872 }
2873
2874 if (_Pickler_Write(self, &empty_set_op, 1) < 0)
2875 return -1;
2876
2877 if (memo_put(self, obj) < 0)
2878 return -1;
2879
2880 set_size = PySet_GET_SIZE(obj);
2881 if (set_size == 0)
2882 return 0; /* nothing to do */
2883
2884 /* Write in batches of BATCHSIZE. */
2885 do {
2886 i = 0;
2887 if (_Pickler_Write(self, &mark_op, 1) < 0)
2888 return -1;
2889 while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
2890 if (save(self, item, 0) < 0)
2891 return -1;
2892 if (++i == BATCHSIZE)
2893 break;
2894 }
2895 if (_Pickler_Write(self, &additems_op, 1) < 0)
2896 return -1;
2897 if (PySet_GET_SIZE(obj) != set_size) {
2898 PyErr_Format(
2899 PyExc_RuntimeError,
2900 "set changed size during iteration");
2901 return -1;
2902 }
2903 } while (i == BATCHSIZE);
2904
2905 return 0;
2906}
2907
2908static int
2909save_frozenset(PicklerObject *self, PyObject *obj)
2910{
2911 PyObject *iter;
2912
2913 const char mark_op = MARK;
2914 const char frozenset_op = FROZENSET;
2915
2916 if (self->fast && !fast_save_enter(self, obj))
2917 return -1;
2918
2919 if (self->proto < 4) {
2920 PyObject *items;
2921 PyObject *reduce_value;
2922 int status;
2923
2924 items = PySequence_List(obj);
2925 if (items == NULL) {
2926 return -1;
2927 }
2928 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
2929 items);
2930 Py_DECREF(items);
2931 if (reduce_value == NULL) {
2932 return -1;
2933 }
2934 /* save_reduce() will memoize the object automatically. */
2935 status = save_reduce(self, reduce_value, obj);
2936 Py_DECREF(reduce_value);
2937 return status;
2938 }
2939
2940 if (_Pickler_Write(self, &mark_op, 1) < 0)
2941 return -1;
2942
2943 iter = PyObject_GetIter(obj);
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002944 if (iter == NULL) {
Christian Heimes74d8d632013-11-23 21:05:31 +01002945 return -1;
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002946 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002947 for (;;) {
2948 PyObject *item;
2949
2950 item = PyIter_Next(iter);
2951 if (item == NULL) {
2952 if (PyErr_Occurred()) {
2953 Py_DECREF(iter);
2954 return -1;
2955 }
2956 break;
2957 }
2958 if (save(self, item, 0) < 0) {
2959 Py_DECREF(item);
2960 Py_DECREF(iter);
2961 return -1;
2962 }
2963 Py_DECREF(item);
2964 }
2965 Py_DECREF(iter);
2966
2967 /* If the object is already in the memo, this means it is
2968 recursive. In this case, throw away everything we put on the
2969 stack, and fetch the object back from the memo. */
2970 if (PyMemoTable_Get(self->memo, obj)) {
2971 const char pop_mark_op = POP_MARK;
2972
2973 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2974 return -1;
2975 if (memo_get(self, obj) < 0)
2976 return -1;
2977 return 0;
2978 }
2979
2980 if (_Pickler_Write(self, &frozenset_op, 1) < 0)
2981 return -1;
2982 if (memo_put(self, obj) < 0)
2983 return -1;
2984
2985 return 0;
2986}
2987
2988static int
2989fix_imports(PyObject **module_name, PyObject **global_name)
2990{
2991 PyObject *key;
2992 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002993 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002994
2995 key = PyTuple_Pack(2, *module_name, *global_name);
2996 if (key == NULL)
2997 return -1;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002998 item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002999 Py_DECREF(key);
3000 if (item) {
3001 PyObject *fixed_module_name;
3002 PyObject *fixed_global_name;
3003
3004 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
3005 PyErr_Format(PyExc_RuntimeError,
3006 "_compat_pickle.REVERSE_NAME_MAPPING values "
3007 "should be 2-tuples, not %.200s",
3008 Py_TYPE(item)->tp_name);
3009 return -1;
3010 }
3011 fixed_module_name = PyTuple_GET_ITEM(item, 0);
3012 fixed_global_name = PyTuple_GET_ITEM(item, 1);
3013 if (!PyUnicode_Check(fixed_module_name) ||
3014 !PyUnicode_Check(fixed_global_name)) {
3015 PyErr_Format(PyExc_RuntimeError,
3016 "_compat_pickle.REVERSE_NAME_MAPPING values "
3017 "should be pairs of str, not (%.200s, %.200s)",
3018 Py_TYPE(fixed_module_name)->tp_name,
3019 Py_TYPE(fixed_global_name)->tp_name);
3020 return -1;
3021 }
3022
3023 Py_CLEAR(*module_name);
3024 Py_CLEAR(*global_name);
3025 Py_INCREF(fixed_module_name);
3026 Py_INCREF(fixed_global_name);
3027 *module_name = fixed_module_name;
3028 *global_name = fixed_global_name;
3029 }
3030 else if (PyErr_Occurred()) {
3031 return -1;
3032 }
3033
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003034 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003035 if (item) {
3036 if (!PyUnicode_Check(item)) {
3037 PyErr_Format(PyExc_RuntimeError,
3038 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3039 "should be strings, not %.200s",
3040 Py_TYPE(item)->tp_name);
3041 return -1;
3042 }
3043 Py_CLEAR(*module_name);
3044 Py_INCREF(item);
3045 *module_name = item;
3046 }
3047 else if (PyErr_Occurred()) {
3048 return -1;
3049 }
3050
3051 return 0;
3052}
3053
3054static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003055save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3056{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003057 PyObject *global_name = NULL;
3058 PyObject *module_name = NULL;
3059 PyObject *module = NULL;
3060 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003061 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003062 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003063 _Py_IDENTIFIER(__name__);
3064 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003065
3066 const char global_op = GLOBAL;
3067
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003068 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003069 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003070 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003071 }
3072 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003073 if (self->proto >= 4) {
3074 global_name = _PyObject_GetAttrId(obj, &PyId___qualname__);
3075 if (global_name == NULL) {
3076 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3077 goto error;
3078 PyErr_Clear();
3079 }
3080 }
3081 if (global_name == NULL) {
3082 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3083 if (global_name == NULL)
3084 goto error;
3085 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003086 }
3087
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003088 module_name = whichmodule(obj, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003089 if (module_name == NULL)
3090 goto error;
3091
3092 /* XXX: Change to use the import C API directly with level=0 to disallow
3093 relative imports.
3094
3095 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3096 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3097 custom import functions (IMHO, this would be a nice security
3098 feature). The import C API would need to be extended to support the
3099 extra parameters of __import__ to fix that. */
3100 module = PyImport_Import(module_name);
3101 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003102 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003103 "Can't pickle %R: import of module %R failed",
3104 obj, module_name);
3105 goto error;
3106 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003107 cls = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003108 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003109 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003110 "Can't pickle %R: attribute lookup %S on %S failed",
3111 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003112 goto error;
3113 }
3114 if (cls != obj) {
3115 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003116 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003117 "Can't pickle %R: it's not the same object as %S.%S",
3118 obj, module_name, global_name);
3119 goto error;
3120 }
3121 Py_DECREF(cls);
3122
3123 if (self->proto >= 2) {
3124 /* See whether this is in the extension registry, and if
3125 * so generate an EXT opcode.
3126 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003127 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003128 PyObject *code_obj; /* extension code as Python object */
3129 long code; /* extension code as C value */
3130 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003131 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003132
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003133 extension_key = PyTuple_Pack(2, module_name, global_name);
3134 if (extension_key == NULL) {
3135 goto error;
3136 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003137 code_obj = PyDict_GetItemWithError(st->extension_registry,
3138 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003139 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003140 /* The object is not registered in the extension registry.
3141 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003142 if (code_obj == NULL) {
3143 if (PyErr_Occurred()) {
3144 goto error;
3145 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003146 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003147 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003148
3149 /* XXX: pickle.py doesn't check neither the type, nor the range
3150 of the value returned by the extension_registry. It should for
3151 consistency. */
3152
3153 /* Verify code_obj has the right type and value. */
3154 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003155 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003156 "Can't pickle %R: extension code %R isn't an integer",
3157 obj, code_obj);
3158 goto error;
3159 }
3160 code = PyLong_AS_LONG(code_obj);
3161 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003162 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003163 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3164 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003165 goto error;
3166 }
3167
3168 /* Generate an EXT opcode. */
3169 if (code <= 0xff) {
3170 pdata[0] = EXT1;
3171 pdata[1] = (unsigned char)code;
3172 n = 2;
3173 }
3174 else if (code <= 0xffff) {
3175 pdata[0] = EXT2;
3176 pdata[1] = (unsigned char)(code & 0xff);
3177 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3178 n = 3;
3179 }
3180 else {
3181 pdata[0] = EXT4;
3182 pdata[1] = (unsigned char)(code & 0xff);
3183 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3184 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3185 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3186 n = 5;
3187 }
3188
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003189 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003190 goto error;
3191 }
3192 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003193 gen_global:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003194 if (self->proto >= 4) {
3195 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003196
Christian Heimese8b1ba12013-11-23 21:13:39 +01003197 if (save(self, module_name, 0) < 0)
3198 goto error;
3199 if (save(self, global_name, 0) < 0)
3200 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003201
3202 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3203 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003204 }
3205 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003206 /* Generate a normal global opcode if we are using a pickle
3207 protocol < 4, or if the object is not registered in the
3208 extension registry. */
3209 PyObject *encoded;
3210 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003211
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003212 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003213 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003214
3215 /* For protocol < 3 and if the user didn't request against doing
3216 so, we convert module names to the old 2.x module names. */
3217 if (self->proto < 3 && self->fix_imports) {
3218 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003219 goto error;
3220 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003221 }
3222
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003223 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3224 both the module name and the global name using UTF-8. We do so
3225 only when we are using the pickle protocol newer than version
3226 3. This is to ensure compatibility with older Unpickler running
3227 on Python 2.x. */
3228 if (self->proto == 3) {
3229 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003230 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003231 else {
3232 unicode_encoder = PyUnicode_AsASCIIString;
3233 }
3234 encoded = unicode_encoder(module_name);
3235 if (encoded == NULL) {
3236 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003237 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003238 "can't pickle module identifier '%S' using "
3239 "pickle protocol %i",
3240 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003241 goto error;
3242 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003243 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3244 PyBytes_GET_SIZE(encoded)) < 0) {
3245 Py_DECREF(encoded);
3246 goto error;
3247 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003248 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003249 if(_Pickler_Write(self, "\n", 1) < 0)
3250 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003251
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003252 /* Save the name of the module. */
3253 encoded = unicode_encoder(global_name);
3254 if (encoded == NULL) {
3255 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003256 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003257 "can't pickle global identifier '%S' using "
3258 "pickle protocol %i",
3259 global_name, self->proto);
3260 goto error;
3261 }
3262 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3263 PyBytes_GET_SIZE(encoded)) < 0) {
3264 Py_DECREF(encoded);
3265 goto error;
3266 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003267 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003268 if (_Pickler_Write(self, "\n", 1) < 0)
3269 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003270 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003271 /* Memoize the object. */
3272 if (memo_put(self, obj) < 0)
3273 goto error;
3274 }
3275
3276 if (0) {
3277 error:
3278 status = -1;
3279 }
3280 Py_XDECREF(module_name);
3281 Py_XDECREF(global_name);
3282 Py_XDECREF(module);
3283
3284 return status;
3285}
3286
3287static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003288save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3289{
3290 PyObject *reduce_value;
3291 int status;
3292
3293 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3294 if (reduce_value == NULL) {
3295 return -1;
3296 }
3297 status = save_reduce(self, reduce_value, obj);
3298 Py_DECREF(reduce_value);
3299 return status;
3300}
3301
3302static int
3303save_type(PicklerObject *self, PyObject *obj)
3304{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003305 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003306 return save_singleton_type(self, obj, Py_None);
3307 }
3308 else if (obj == (PyObject *)&PyEllipsis_Type) {
3309 return save_singleton_type(self, obj, Py_Ellipsis);
3310 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003311 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003312 return save_singleton_type(self, obj, Py_NotImplemented);
3313 }
3314 return save_global(self, obj, NULL);
3315}
3316
3317static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003318save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
3319{
3320 PyObject *pid = NULL;
3321 int status = 0;
3322
3323 const char persid_op = PERSID;
3324 const char binpersid_op = BINPERSID;
3325
3326 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003327 pid = _Pickle_FastCall(func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003328 if (pid == NULL)
3329 return -1;
3330
3331 if (pid != Py_None) {
3332 if (self->bin) {
3333 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003334 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003335 goto error;
3336 }
3337 else {
3338 PyObject *pid_str = NULL;
3339 char *pid_ascii_bytes;
3340 Py_ssize_t size;
3341
3342 pid_str = PyObject_Str(pid);
3343 if (pid_str == NULL)
3344 goto error;
3345
3346 /* XXX: Should it check whether the persistent id only contains
3347 ASCII characters? And what if the pid contains embedded
3348 newlines? */
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00003349 pid_ascii_bytes = _PyUnicode_AsStringAndSize(pid_str, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003350 Py_DECREF(pid_str);
3351 if (pid_ascii_bytes == NULL)
3352 goto error;
3353
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003354 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
3355 _Pickler_Write(self, pid_ascii_bytes, size) < 0 ||
3356 _Pickler_Write(self, "\n", 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003357 goto error;
3358 }
3359 status = 1;
3360 }
3361
3362 if (0) {
3363 error:
3364 status = -1;
3365 }
3366 Py_XDECREF(pid);
3367
3368 return status;
3369}
3370
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003371static PyObject *
3372get_class(PyObject *obj)
3373{
3374 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003375 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003376
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003377 cls = _PyObject_GetAttrId(obj, &PyId___class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003378 if (cls == NULL) {
3379 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3380 PyErr_Clear();
3381 cls = (PyObject *) Py_TYPE(obj);
3382 Py_INCREF(cls);
3383 }
3384 }
3385 return cls;
3386}
3387
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003388/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3389 * appropriate __reduce__ method for obj.
3390 */
3391static int
3392save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3393{
3394 PyObject *callable;
3395 PyObject *argtup;
3396 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003397 PyObject *listitems = Py_None;
3398 PyObject *dictitems = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003399 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003400 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003401 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003402
3403 const char reduce_op = REDUCE;
3404 const char build_op = BUILD;
3405 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003406 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003407
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003408 size = PyTuple_Size(args);
3409 if (size < 2 || size > 5) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003410 PyErr_SetString(st->PicklingError, "tuple returned by "
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003411 "__reduce__ must contain 2 through 5 elements");
3412 return -1;
3413 }
3414
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003415 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
3416 &callable, &argtup, &state, &listitems, &dictitems))
3417 return -1;
3418
3419 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003420 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003421 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003422 return -1;
3423 }
3424 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003425 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003426 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003427 return -1;
3428 }
3429
3430 if (state == Py_None)
3431 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003432
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003433 if (listitems == Py_None)
3434 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003435 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003436 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003437 "returned by __reduce__ must be an iterator, not %s",
3438 Py_TYPE(listitems)->tp_name);
3439 return -1;
3440 }
3441
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003442 if (dictitems == Py_None)
3443 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003444 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003445 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003446 "returned by __reduce__ must be an iterator, not %s",
3447 Py_TYPE(dictitems)->tp_name);
3448 return -1;
3449 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003450
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003451 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003452 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003453 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003454
Victor Stinner804e05e2013-11-14 01:26:17 +01003455 name = _PyObject_GetAttrId(callable, &PyId___name__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003456 if (name == NULL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003457 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003458 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003459 }
3460 PyErr_Clear();
3461 }
3462 else if (self->proto >= 4) {
3463 _Py_IDENTIFIER(__newobj_ex__);
3464 use_newobj_ex = PyUnicode_Check(name) &&
3465 PyUnicode_Compare(
3466 name, _PyUnicode_FromId(&PyId___newobj_ex__)) == 0;
3467 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003468 }
3469 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003470 _Py_IDENTIFIER(__newobj__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003471 use_newobj = PyUnicode_Check(name) &&
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003472 PyUnicode_Compare(
3473 name, _PyUnicode_FromId(&PyId___newobj__)) == 0;
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003474 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003475 }
3476 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003477
3478 if (use_newobj_ex) {
3479 PyObject *cls;
3480 PyObject *args;
3481 PyObject *kwargs;
3482
3483 if (Py_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003484 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003485 "length of the NEWOBJ_EX argument tuple must be "
3486 "exactly 3, not %zd", Py_SIZE(argtup));
3487 return -1;
3488 }
3489
3490 cls = PyTuple_GET_ITEM(argtup, 0);
3491 if (!PyType_Check(cls)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003492 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003493 "first item from NEWOBJ_EX argument tuple must "
3494 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
3495 return -1;
3496 }
3497 args = PyTuple_GET_ITEM(argtup, 1);
3498 if (!PyTuple_Check(args)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003499 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003500 "second item from NEWOBJ_EX argument tuple must "
3501 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
3502 return -1;
3503 }
3504 kwargs = PyTuple_GET_ITEM(argtup, 2);
3505 if (!PyDict_Check(kwargs)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003506 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003507 "third item from NEWOBJ_EX argument tuple must "
3508 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
3509 return -1;
3510 }
3511
3512 if (save(self, cls, 0) < 0 ||
3513 save(self, args, 0) < 0 ||
3514 save(self, kwargs, 0) < 0 ||
3515 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
3516 return -1;
3517 }
3518 }
3519 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003520 PyObject *cls;
3521 PyObject *newargtup;
3522 PyObject *obj_class;
3523 int p;
3524
3525 /* Sanity checks. */
3526 if (Py_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003527 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003528 return -1;
3529 }
3530
3531 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003532 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003533 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003534 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003535 return -1;
3536 }
3537
3538 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003539 obj_class = get_class(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003540 p = obj_class != cls; /* true iff a problem */
3541 Py_DECREF(obj_class);
3542 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003543 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003544 "__newobj__ args has the wrong class");
3545 return -1;
3546 }
3547 }
3548 /* XXX: These calls save() are prone to infinite recursion. Imagine
3549 what happen if the value returned by the __reduce__() method of
3550 some extension type contains another object of the same type. Ouch!
3551
3552 Here is a quick example, that I ran into, to illustrate what I
3553 mean:
3554
3555 >>> import pickle, copyreg
3556 >>> copyreg.dispatch_table.pop(complex)
3557 >>> pickle.dumps(1+2j)
3558 Traceback (most recent call last):
3559 ...
3560 RuntimeError: maximum recursion depth exceeded
3561
3562 Removing the complex class from copyreg.dispatch_table made the
3563 __reduce_ex__() method emit another complex object:
3564
3565 >>> (1+1j).__reduce_ex__(2)
3566 (<function __newobj__ at 0xb7b71c3c>,
3567 (<class 'complex'>, (1+1j)), None, None, None)
3568
3569 Thus when save() was called on newargstup (the 2nd item) recursion
3570 ensued. Of course, the bug was in the complex class which had a
3571 broken __getnewargs__() that emitted another complex object. But,
3572 the point, here, is it is quite easy to end up with a broken reduce
3573 function. */
3574
3575 /* Save the class and its __new__ arguments. */
3576 if (save(self, cls, 0) < 0)
3577 return -1;
3578
3579 newargtup = PyTuple_GetSlice(argtup, 1, Py_SIZE(argtup));
3580 if (newargtup == NULL)
3581 return -1;
3582
3583 p = save(self, newargtup, 0);
3584 Py_DECREF(newargtup);
3585 if (p < 0)
3586 return -1;
3587
3588 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003589 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003590 return -1;
3591 }
3592 else { /* Not using NEWOBJ. */
3593 if (save(self, callable, 0) < 0 ||
3594 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003595 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003596 return -1;
3597 }
3598
3599 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
3600 the caller do not want to memoize the object. Not particularly useful,
3601 but that is to mimic the behavior save_reduce() in pickle.py when
3602 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003603 if (obj != NULL) {
3604 /* If the object is already in the memo, this means it is
3605 recursive. In this case, throw away everything we put on the
3606 stack, and fetch the object back from the memo. */
3607 if (PyMemoTable_Get(self->memo, obj)) {
3608 const char pop_op = POP;
3609
3610 if (_Pickler_Write(self, &pop_op, 1) < 0)
3611 return -1;
3612 if (memo_get(self, obj) < 0)
3613 return -1;
3614
3615 return 0;
3616 }
3617 else if (memo_put(self, obj) < 0)
3618 return -1;
3619 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003620
3621 if (listitems && batch_list(self, listitems) < 0)
3622 return -1;
3623
3624 if (dictitems && batch_dict(self, dictitems) < 0)
3625 return -1;
3626
3627 if (state) {
Victor Stinner121aab42011-09-29 23:40:53 +02003628 if (save(self, state, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003629 _Pickler_Write(self, &build_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003630 return -1;
3631 }
3632
3633 return 0;
3634}
3635
3636static int
3637save(PicklerObject *self, PyObject *obj, int pers_save)
3638{
3639 PyTypeObject *type;
3640 PyObject *reduce_func = NULL;
3641 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003642 int status = 0;
3643
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003644 if (_Pickler_OpcodeBoundary(self) < 0)
3645 return -1;
3646
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003647 if (Py_EnterRecursiveCall(" while pickling an object"))
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003648 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003649
3650 /* The extra pers_save argument is necessary to avoid calling save_pers()
3651 on its returned object. */
3652 if (!pers_save && self->pers_func) {
3653 /* save_pers() returns:
3654 -1 to signal an error;
3655 0 if it did nothing successfully;
3656 1 if a persistent id was saved.
3657 */
3658 if ((status = save_pers(self, obj, self->pers_func)) != 0)
3659 goto done;
3660 }
3661
3662 type = Py_TYPE(obj);
3663
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003664 /* The old cPickle had an optimization that used switch-case statement
3665 dispatching on the first letter of the type name. This has was removed
3666 since benchmarks shown that this optimization was actually slowing
3667 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003668
3669 /* Atom types; these aren't memoized, so don't check the memo. */
3670
3671 if (obj == Py_None) {
3672 status = save_none(self, obj);
3673 goto done;
3674 }
3675 else if (obj == Py_False || obj == Py_True) {
3676 status = save_bool(self, obj);
3677 goto done;
3678 }
3679 else if (type == &PyLong_Type) {
3680 status = save_long(self, obj);
3681 goto done;
3682 }
3683 else if (type == &PyFloat_Type) {
3684 status = save_float(self, obj);
3685 goto done;
3686 }
3687
3688 /* Check the memo to see if it has the object. If so, generate
3689 a GET (or BINGET) opcode, instead of pickling the object
3690 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003691 if (PyMemoTable_Get(self->memo, obj)) {
3692 if (memo_get(self, obj) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003693 goto error;
3694 goto done;
3695 }
3696
3697 if (type == &PyBytes_Type) {
3698 status = save_bytes(self, obj);
3699 goto done;
3700 }
3701 else if (type == &PyUnicode_Type) {
3702 status = save_unicode(self, obj);
3703 goto done;
3704 }
3705 else if (type == &PyDict_Type) {
3706 status = save_dict(self, obj);
3707 goto done;
3708 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003709 else if (type == &PySet_Type) {
3710 status = save_set(self, obj);
3711 goto done;
3712 }
3713 else if (type == &PyFrozenSet_Type) {
3714 status = save_frozenset(self, obj);
3715 goto done;
3716 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003717 else if (type == &PyList_Type) {
3718 status = save_list(self, obj);
3719 goto done;
3720 }
3721 else if (type == &PyTuple_Type) {
3722 status = save_tuple(self, obj);
3723 goto done;
3724 }
3725 else if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003726 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003727 goto done;
3728 }
3729 else if (type == &PyFunction_Type) {
3730 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08003731 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003732 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003733
3734 /* XXX: This part needs some unit tests. */
3735
3736 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003737 * self.dispatch_table, copyreg.dispatch_table, the object's
3738 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003739 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003740 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003741 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003742 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
3743 (PyObject *)type);
3744 if (reduce_func == NULL) {
3745 if (PyErr_Occurred()) {
3746 goto error;
3747 }
3748 } else {
3749 /* PyDict_GetItemWithError() returns a borrowed reference.
3750 Increase the reference count to be consistent with
3751 PyObject_GetItem and _PyObject_GetAttrId used below. */
3752 Py_INCREF(reduce_func);
3753 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003754 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003755 reduce_func = PyObject_GetItem(self->dispatch_table,
3756 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003757 if (reduce_func == NULL) {
3758 if (PyErr_ExceptionMatches(PyExc_KeyError))
3759 PyErr_Clear();
3760 else
3761 goto error;
3762 }
3763 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003764 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003765 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003766 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003767 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02003768 else if (PyType_IsSubtype(type, &PyType_Type)) {
3769 status = save_global(self, obj, NULL);
3770 goto done;
3771 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003772 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003773 _Py_IDENTIFIER(__reduce__);
3774 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003775
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003776
3777 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
3778 automatically defined as __reduce__. While this is convenient, this
3779 make it impossible to know which method was actually called. Of
3780 course, this is not a big deal. But still, it would be nice to let
3781 the user know which method was called when something go
3782 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
3783 don't actually have to check for a __reduce__ method. */
3784
3785 /* Check for a __reduce_ex__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003786 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003787 if (reduce_func != NULL) {
3788 PyObject *proto;
3789 proto = PyLong_FromLong(self->proto);
3790 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003791 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003792 }
3793 }
3794 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003795 PickleState *st = _Pickle_GetGlobalState();
3796
3797 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003798 PyErr_Clear();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003799 }
3800 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003801 goto error;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003802 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003803 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003804 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003805 if (reduce_func != NULL) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003806 PyObject *empty_tuple = PyTuple_New(0);
3807 reduce_value = PyObject_Call(reduce_func, empty_tuple,
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003808 NULL);
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003809 Py_DECREF(empty_tuple);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003810 }
3811 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003812 PyErr_Format(st->PicklingError,
3813 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003814 type->tp_name, obj);
3815 goto error;
3816 }
3817 }
3818 }
3819
3820 if (reduce_value == NULL)
3821 goto error;
3822
3823 if (PyUnicode_Check(reduce_value)) {
3824 status = save_global(self, obj, reduce_value);
3825 goto done;
3826 }
3827
3828 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003829 PickleState *st = _Pickle_GetGlobalState();
3830 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003831 "__reduce__ must return a string or tuple");
3832 goto error;
3833 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003834
3835 status = save_reduce(self, reduce_value, obj);
3836
3837 if (0) {
3838 error:
3839 status = -1;
3840 }
3841 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003842
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003843 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003844 Py_XDECREF(reduce_func);
3845 Py_XDECREF(reduce_value);
3846
3847 return status;
3848}
3849
3850static int
3851dump(PicklerObject *self, PyObject *obj)
3852{
3853 const char stop_op = STOP;
3854
3855 if (self->proto >= 2) {
3856 char header[2];
3857
3858 header[0] = PROTO;
3859 assert(self->proto >= 0 && self->proto < 256);
3860 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003861 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003862 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003863 if (self->proto >= 4)
3864 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003865 }
3866
3867 if (save(self, obj, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003868 _Pickler_Write(self, &stop_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003869 return -1;
3870
3871 return 0;
3872}
3873
Larry Hastings61272b72014-01-07 12:41:53 -08003874/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003875
3876_pickle.Pickler.clear_memo
3877
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003878Clears the pickler's "memo".
3879
3880The memo is the data structure that remembers which objects the
3881pickler has already seen, so that shared or recursive objects are
3882pickled by reference and not by value. This method is useful when
3883re-using picklers.
Larry Hastings61272b72014-01-07 12:41:53 -08003884[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003885
Larry Hastings3cceb382014-01-04 11:09:09 -08003886static PyObject *
3887_pickle_Pickler_clear_memo_impl(PicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08003888/*[clinic end generated code: output=8665c8658aaa094b input=01bdad52f3d93e56]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003889{
3890 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003891 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003892
3893 Py_RETURN_NONE;
3894}
3895
Larry Hastings61272b72014-01-07 12:41:53 -08003896/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003897
3898_pickle.Pickler.dump
3899
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003900 obj: object
3901 /
3902
3903Write a pickled representation of the given object to the open file.
Larry Hastings61272b72014-01-07 12:41:53 -08003904[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003905
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003906static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003907_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
Larry Hastings581ee362014-01-28 05:00:08 -08003908/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003909{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003910 /* Check whether the Pickler was initialized correctly (issue3664).
3911 Developers often forget to call __init__() in their subclasses, which
3912 would trigger a segfault without this check. */
3913 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003914 PickleState *st = _Pickle_GetGlobalState();
3915 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003916 "Pickler.__init__() was not called by %s.__init__()",
3917 Py_TYPE(self)->tp_name);
3918 return NULL;
3919 }
3920
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003921 if (_Pickler_ClearBuffer(self) < 0)
3922 return NULL;
3923
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003924 if (dump(self, obj) < 0)
3925 return NULL;
3926
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003927 if (_Pickler_FlushToFile(self) < 0)
3928 return NULL;
3929
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003930 Py_RETURN_NONE;
3931}
3932
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02003933/*[clinic input]
3934
3935_pickle.Pickler.__sizeof__ -> Py_ssize_t
3936
3937Returns size in memory, in bytes.
3938[clinic start generated code]*/
3939
3940static Py_ssize_t
3941_pickle_Pickler___sizeof___impl(PicklerObject *self)
3942/*[clinic end generated code: output=106edb3123f332e1 input=8cbbec9bd5540d42]*/
3943{
3944 Py_ssize_t res, s;
3945
3946 res = sizeof(PicklerObject);
3947 if (self->memo != NULL) {
3948 res += sizeof(PyMemoTable);
3949 res += self->memo->mt_allocated * sizeof(PyMemoEntry);
3950 }
3951 if (self->output_buffer != NULL) {
3952 s = _PySys_GetSizeOf(self->output_buffer);
3953 if (s == -1)
3954 return -1;
3955 res += s;
3956 }
3957 return res;
3958}
3959
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003960static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003961 _PICKLE_PICKLER_DUMP_METHODDEF
3962 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02003963 _PICKLE_PICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003964 {NULL, NULL} /* sentinel */
3965};
3966
3967static void
3968Pickler_dealloc(PicklerObject *self)
3969{
3970 PyObject_GC_UnTrack(self);
3971
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003972 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003973 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003974 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003975 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003976 Py_XDECREF(self->fast_memo);
3977
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003978 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003979
3980 Py_TYPE(self)->tp_free((PyObject *)self);
3981}
3982
3983static int
3984Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
3985{
3986 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003987 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003988 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003989 Py_VISIT(self->fast_memo);
3990 return 0;
3991}
3992
3993static int
3994Pickler_clear(PicklerObject *self)
3995{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003996 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003997 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003998 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003999 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004000 Py_CLEAR(self->fast_memo);
4001
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004002 if (self->memo != NULL) {
4003 PyMemoTable *memo = self->memo;
4004 self->memo = NULL;
4005 PyMemoTable_Del(memo);
4006 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004007 return 0;
4008}
4009
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004010
Larry Hastings61272b72014-01-07 12:41:53 -08004011/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004012
4013_pickle.Pickler.__init__
4014
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004015 file: object
4016 protocol: object = NULL
4017 fix_imports: bool = True
4018
4019This takes a binary file for writing a pickle data stream.
4020
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004021The optional *protocol* argument tells the pickler to use the given
4022protocol; supported protocols are 0, 1, 2, 3 and 4. The default
4023protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004024
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004025Specifying a negative protocol version selects the highest protocol
4026version supported. The higher the protocol used, the more recent the
4027version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004028
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004029The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004030bytes argument. It can thus be a file object opened for binary
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004031writing, a io.BytesIO instance, or any other custom object that meets
4032this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004033
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004034If *fix_imports* is True and protocol is less than 3, pickle will try
4035to map the new Python 3 names to the old module names used in Python
40362, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08004037[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004038
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004039static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004040_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports)
Larry Hastings581ee362014-01-28 05:00:08 -08004041/*[clinic end generated code: output=56e229f3b1f4332f input=b8cdeb7e3f5ee674]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004042{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004043 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004044 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004045
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004046 /* In case of multiple __init__() calls, clear previous content. */
4047 if (self->write != NULL)
4048 (void)Pickler_clear(self);
4049
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004050 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004051 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004052
4053 if (_Pickler_SetOutputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004054 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004055
4056 /* memo and output_buffer may have already been created in _Pickler_New */
4057 if (self->memo == NULL) {
4058 self->memo = PyMemoTable_New();
4059 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004060 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004061 }
4062 self->output_len = 0;
4063 if (self->output_buffer == NULL) {
4064 self->max_output_len = WRITE_BUF_SIZE;
4065 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4066 self->max_output_len);
4067 if (self->output_buffer == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004068 return -1;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004069 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004070
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004071 self->fast = 0;
4072 self->fast_nesting = 0;
4073 self->fast_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004074 self->pers_func = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004075 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) {
4076 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
4077 &PyId_persistent_id);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004078 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004079 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004080 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004081 self->dispatch_table = NULL;
4082 if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) {
4083 self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
4084 &PyId_dispatch_table);
4085 if (self->dispatch_table == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004086 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004087 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004088
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004089 return 0;
4090}
4091
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004092
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004093/* Define a proxy object for the Pickler's internal memo object. This is to
4094 * avoid breaking code like:
4095 * pickler.memo.clear()
4096 * and
4097 * pickler.memo = saved_memo
4098 * Is this a good idea? Not really, but we don't want to break code that uses
4099 * it. Note that we don't implement the entire mapping API here. This is
4100 * intentional, as these should be treated as black-box implementation details.
4101 */
4102
Larry Hastings61272b72014-01-07 12:41:53 -08004103/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004104_pickle.PicklerMemoProxy.clear
4105
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004106Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08004107[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004108
Larry Hastings3cceb382014-01-04 11:09:09 -08004109static PyObject *
4110_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004111/*[clinic end generated code: output=5fb9370d48ae8b05 input=ccc186dacd0f1405]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004112{
4113 if (self->pickler->memo)
4114 PyMemoTable_Clear(self->pickler->memo);
4115 Py_RETURN_NONE;
4116}
4117
Larry Hastings61272b72014-01-07 12:41:53 -08004118/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004119_pickle.PicklerMemoProxy.copy
4120
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004121Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08004122[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004123
Larry Hastings3cceb382014-01-04 11:09:09 -08004124static PyObject *
4125_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004126/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004127{
4128 Py_ssize_t i;
4129 PyMemoTable *memo;
4130 PyObject *new_memo = PyDict_New();
4131 if (new_memo == NULL)
4132 return NULL;
4133
4134 memo = self->pickler->memo;
4135 for (i = 0; i < memo->mt_allocated; ++i) {
4136 PyMemoEntry entry = memo->mt_table[i];
4137 if (entry.me_key != NULL) {
4138 int status;
4139 PyObject *key, *value;
4140
4141 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004142 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004143
4144 if (key == NULL || value == NULL) {
4145 Py_XDECREF(key);
4146 Py_XDECREF(value);
4147 goto error;
4148 }
4149 status = PyDict_SetItem(new_memo, key, value);
4150 Py_DECREF(key);
4151 Py_DECREF(value);
4152 if (status < 0)
4153 goto error;
4154 }
4155 }
4156 return new_memo;
4157
4158 error:
4159 Py_XDECREF(new_memo);
4160 return NULL;
4161}
4162
Larry Hastings61272b72014-01-07 12:41:53 -08004163/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004164_pickle.PicklerMemoProxy.__reduce__
4165
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004166Implement pickle support.
Larry Hastings61272b72014-01-07 12:41:53 -08004167[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004168
Larry Hastings3cceb382014-01-04 11:09:09 -08004169static PyObject *
4170_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004171/*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004172{
4173 PyObject *reduce_value, *dict_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08004174 PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004175 if (contents == NULL)
4176 return NULL;
4177
4178 reduce_value = PyTuple_New(2);
4179 if (reduce_value == NULL) {
4180 Py_DECREF(contents);
4181 return NULL;
4182 }
4183 dict_args = PyTuple_New(1);
4184 if (dict_args == NULL) {
4185 Py_DECREF(contents);
4186 Py_DECREF(reduce_value);
4187 return NULL;
4188 }
4189 PyTuple_SET_ITEM(dict_args, 0, contents);
4190 Py_INCREF((PyObject *)&PyDict_Type);
4191 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4192 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4193 return reduce_value;
4194}
4195
4196static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004197 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4198 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4199 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004200 {NULL, NULL} /* sentinel */
4201};
4202
4203static void
4204PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4205{
4206 PyObject_GC_UnTrack(self);
4207 Py_XDECREF(self->pickler);
4208 PyObject_GC_Del((PyObject *)self);
4209}
4210
4211static int
4212PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4213 visitproc visit, void *arg)
4214{
4215 Py_VISIT(self->pickler);
4216 return 0;
4217}
4218
4219static int
4220PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4221{
4222 Py_CLEAR(self->pickler);
4223 return 0;
4224}
4225
4226static PyTypeObject PicklerMemoProxyType = {
4227 PyVarObject_HEAD_INIT(NULL, 0)
4228 "_pickle.PicklerMemoProxy", /*tp_name*/
4229 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4230 0,
4231 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4232 0, /* tp_print */
4233 0, /* tp_getattr */
4234 0, /* tp_setattr */
4235 0, /* tp_compare */
4236 0, /* tp_repr */
4237 0, /* tp_as_number */
4238 0, /* tp_as_sequence */
4239 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004240 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004241 0, /* tp_call */
4242 0, /* tp_str */
4243 PyObject_GenericGetAttr, /* tp_getattro */
4244 PyObject_GenericSetAttr, /* tp_setattro */
4245 0, /* tp_as_buffer */
4246 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4247 0, /* tp_doc */
4248 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4249 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4250 0, /* tp_richcompare */
4251 0, /* tp_weaklistoffset */
4252 0, /* tp_iter */
4253 0, /* tp_iternext */
4254 picklerproxy_methods, /* tp_methods */
4255};
4256
4257static PyObject *
4258PicklerMemoProxy_New(PicklerObject *pickler)
4259{
4260 PicklerMemoProxyObject *self;
4261
4262 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4263 if (self == NULL)
4264 return NULL;
4265 Py_INCREF(pickler);
4266 self->pickler = pickler;
4267 PyObject_GC_Track(self);
4268 return (PyObject *)self;
4269}
4270
4271/*****************************************************************************/
4272
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004273static PyObject *
4274Pickler_get_memo(PicklerObject *self)
4275{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004276 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004277}
4278
4279static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004280Pickler_set_memo(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004281{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004282 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004283
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004284 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004285 PyErr_SetString(PyExc_TypeError,
4286 "attribute deletion is not supported");
4287 return -1;
4288 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004289
4290 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4291 PicklerObject *pickler =
4292 ((PicklerMemoProxyObject *)obj)->pickler;
4293
4294 new_memo = PyMemoTable_Copy(pickler->memo);
4295 if (new_memo == NULL)
4296 return -1;
4297 }
4298 else if (PyDict_Check(obj)) {
4299 Py_ssize_t i = 0;
4300 PyObject *key, *value;
4301
4302 new_memo = PyMemoTable_New();
4303 if (new_memo == NULL)
4304 return -1;
4305
4306 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004307 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004308 PyObject *memo_obj;
4309
4310 if (!PyTuple_Check(value) || Py_SIZE(value) != 2) {
4311 PyErr_SetString(PyExc_TypeError,
4312 "'memo' values must be 2-item tuples");
4313 goto error;
4314 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004315 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004316 if (memo_id == -1 && PyErr_Occurred())
4317 goto error;
4318 memo_obj = PyTuple_GET_ITEM(value, 1);
4319 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4320 goto error;
4321 }
4322 }
4323 else {
4324 PyErr_Format(PyExc_TypeError,
4325 "'memo' attribute must be an PicklerMemoProxy object"
4326 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004327 return -1;
4328 }
4329
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004330 PyMemoTable_Del(self->memo);
4331 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004332
4333 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004334
4335 error:
4336 if (new_memo)
4337 PyMemoTable_Del(new_memo);
4338 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004339}
4340
4341static PyObject *
4342Pickler_get_persid(PicklerObject *self)
4343{
4344 if (self->pers_func == NULL)
4345 PyErr_SetString(PyExc_AttributeError, "persistent_id");
4346 else
4347 Py_INCREF(self->pers_func);
4348 return self->pers_func;
4349}
4350
4351static int
4352Pickler_set_persid(PicklerObject *self, PyObject *value)
4353{
4354 PyObject *tmp;
4355
4356 if (value == NULL) {
4357 PyErr_SetString(PyExc_TypeError,
4358 "attribute deletion is not supported");
4359 return -1;
4360 }
4361 if (!PyCallable_Check(value)) {
4362 PyErr_SetString(PyExc_TypeError,
4363 "persistent_id must be a callable taking one argument");
4364 return -1;
4365 }
4366
4367 tmp = self->pers_func;
4368 Py_INCREF(value);
4369 self->pers_func = value;
4370 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
4371
4372 return 0;
4373}
4374
4375static PyMemberDef Pickler_members[] = {
4376 {"bin", T_INT, offsetof(PicklerObject, bin)},
4377 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004378 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004379 {NULL}
4380};
4381
4382static PyGetSetDef Pickler_getsets[] = {
4383 {"memo", (getter)Pickler_get_memo,
4384 (setter)Pickler_set_memo},
4385 {"persistent_id", (getter)Pickler_get_persid,
4386 (setter)Pickler_set_persid},
4387 {NULL}
4388};
4389
4390static PyTypeObject Pickler_Type = {
4391 PyVarObject_HEAD_INIT(NULL, 0)
4392 "_pickle.Pickler" , /*tp_name*/
4393 sizeof(PicklerObject), /*tp_basicsize*/
4394 0, /*tp_itemsize*/
4395 (destructor)Pickler_dealloc, /*tp_dealloc*/
4396 0, /*tp_print*/
4397 0, /*tp_getattr*/
4398 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00004399 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004400 0, /*tp_repr*/
4401 0, /*tp_as_number*/
4402 0, /*tp_as_sequence*/
4403 0, /*tp_as_mapping*/
4404 0, /*tp_hash*/
4405 0, /*tp_call*/
4406 0, /*tp_str*/
4407 0, /*tp_getattro*/
4408 0, /*tp_setattro*/
4409 0, /*tp_as_buffer*/
4410 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004411 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004412 (traverseproc)Pickler_traverse, /*tp_traverse*/
4413 (inquiry)Pickler_clear, /*tp_clear*/
4414 0, /*tp_richcompare*/
4415 0, /*tp_weaklistoffset*/
4416 0, /*tp_iter*/
4417 0, /*tp_iternext*/
4418 Pickler_methods, /*tp_methods*/
4419 Pickler_members, /*tp_members*/
4420 Pickler_getsets, /*tp_getset*/
4421 0, /*tp_base*/
4422 0, /*tp_dict*/
4423 0, /*tp_descr_get*/
4424 0, /*tp_descr_set*/
4425 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004426 _pickle_Pickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004427 PyType_GenericAlloc, /*tp_alloc*/
4428 PyType_GenericNew, /*tp_new*/
4429 PyObject_GC_Del, /*tp_free*/
4430 0, /*tp_is_gc*/
4431};
4432
Victor Stinner121aab42011-09-29 23:40:53 +02004433/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004434
4435 XXX: It would be nice to able to avoid Python function call overhead, by
4436 using directly the C version of find_class(), when find_class() is not
4437 overridden by a subclass. Although, this could become rather hackish. A
4438 simpler optimization would be to call the C function when self is not a
4439 subclass instance. */
4440static PyObject *
4441find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4442{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004443 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004444
4445 return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO",
4446 module_name, global_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004447}
4448
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004449static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004450marker(UnpicklerObject *self)
4451{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004452 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004453 if (self->num_marks < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004454 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004455 return -1;
4456 }
4457
4458 return self->marks[--self->num_marks];
4459}
4460
4461static int
4462load_none(UnpicklerObject *self)
4463{
4464 PDATA_APPEND(self->stack, Py_None, -1);
4465 return 0;
4466}
4467
4468static int
4469bad_readline(void)
4470{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004471 PickleState *st = _Pickle_GetGlobalState();
4472 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004473 return -1;
4474}
4475
4476static int
4477load_int(UnpicklerObject *self)
4478{
4479 PyObject *value;
4480 char *endptr, *s;
4481 Py_ssize_t len;
4482 long x;
4483
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004484 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004485 return -1;
4486 if (len < 2)
4487 return bad_readline();
4488
4489 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02004490 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004491 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004492 x = strtol(s, &endptr, 0);
4493
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004494 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004495 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03004496 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004497 errno = 0;
4498 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004499 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004500 if (value == NULL) {
4501 PyErr_SetString(PyExc_ValueError,
4502 "could not convert string to int");
4503 return -1;
4504 }
4505 }
4506 else {
4507 if (len == 3 && (x == 0 || x == 1)) {
4508 if ((value = PyBool_FromLong(x)) == NULL)
4509 return -1;
4510 }
4511 else {
4512 if ((value = PyLong_FromLong(x)) == NULL)
4513 return -1;
4514 }
4515 }
4516
4517 PDATA_PUSH(self->stack, value, -1);
4518 return 0;
4519}
4520
4521static int
4522load_bool(UnpicklerObject *self, PyObject *boolean)
4523{
4524 assert(boolean == Py_True || boolean == Py_False);
4525 PDATA_APPEND(self->stack, boolean, -1);
4526 return 0;
4527}
4528
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004529/* s contains x bytes of an unsigned little-endian integer. Return its value
4530 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4531 */
4532static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004533calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004534{
4535 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004536 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004537 size_t x = 0;
4538
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004539 for (i = 0; i < nbytes && i < sizeof(size_t); i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004540 x |= (size_t) s[i] << (8 * i);
4541 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004542
4543 if (x > PY_SSIZE_T_MAX)
4544 return -1;
4545 else
4546 return (Py_ssize_t) x;
4547}
4548
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004549/* s contains x bytes of a little-endian integer. Return its value as a
4550 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
4551 * int, but when x is 4 it's a signed one. This is an historical source
4552 * of x-platform bugs.
4553 */
4554static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004555calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004556{
4557 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004558 int i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004559 long x = 0;
4560
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004561 for (i = 0; i < nbytes; i++) {
4562 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004563 }
4564
4565 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4566 * is signed, so on a box with longs bigger than 4 bytes we need
4567 * to extend a BININT's sign bit to the full width.
4568 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004569 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004570 x |= -(x & (1L << 31));
4571 }
4572
4573 return x;
4574}
4575
4576static int
4577load_binintx(UnpicklerObject *self, char *s, int size)
4578{
4579 PyObject *value;
4580 long x;
4581
4582 x = calc_binint(s, size);
4583
4584 if ((value = PyLong_FromLong(x)) == NULL)
4585 return -1;
4586
4587 PDATA_PUSH(self->stack, value, -1);
4588 return 0;
4589}
4590
4591static int
4592load_binint(UnpicklerObject *self)
4593{
4594 char *s;
4595
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004596 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004597 return -1;
4598
4599 return load_binintx(self, s, 4);
4600}
4601
4602static int
4603load_binint1(UnpicklerObject *self)
4604{
4605 char *s;
4606
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004607 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004608 return -1;
4609
4610 return load_binintx(self, s, 1);
4611}
4612
4613static int
4614load_binint2(UnpicklerObject *self)
4615{
4616 char *s;
4617
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004618 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004619 return -1;
4620
4621 return load_binintx(self, s, 2);
4622}
4623
4624static int
4625load_long(UnpicklerObject *self)
4626{
4627 PyObject *value;
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004628 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004629 Py_ssize_t len;
4630
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004631 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004632 return -1;
4633 if (len < 2)
4634 return bad_readline();
4635
Mark Dickinson8dd05142009-01-20 20:43:58 +00004636 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4637 the 'L' before calling PyLong_FromString. In order to maintain
4638 compatibility with Python 3.0.0, we don't actually *require*
4639 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004640 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004641 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00004642 /* XXX: Should the base argument explicitly set to 10? */
4643 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00004644 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004645 return -1;
4646
4647 PDATA_PUSH(self->stack, value, -1);
4648 return 0;
4649}
4650
4651/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4652 * data following.
4653 */
4654static int
4655load_counted_long(UnpicklerObject *self, int size)
4656{
4657 PyObject *value;
4658 char *nbytes;
4659 char *pdata;
4660
4661 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004662 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004663 return -1;
4664
4665 size = calc_binint(nbytes, size);
4666 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004667 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004668 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004669 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004670 "LONG pickle has negative byte count");
4671 return -1;
4672 }
4673
4674 if (size == 0)
4675 value = PyLong_FromLong(0L);
4676 else {
4677 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004678 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004679 return -1;
4680 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
4681 1 /* little endian */ , 1 /* signed */ );
4682 }
4683 if (value == NULL)
4684 return -1;
4685 PDATA_PUSH(self->stack, value, -1);
4686 return 0;
4687}
4688
4689static int
4690load_float(UnpicklerObject *self)
4691{
4692 PyObject *value;
4693 char *endptr, *s;
4694 Py_ssize_t len;
4695 double d;
4696
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004697 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004698 return -1;
4699 if (len < 2)
4700 return bad_readline();
4701
4702 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004703 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
4704 if (d == -1.0 && PyErr_Occurred())
4705 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004706 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004707 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
4708 return -1;
4709 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00004710 value = PyFloat_FromDouble(d);
4711 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004712 return -1;
4713
4714 PDATA_PUSH(self->stack, value, -1);
4715 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004716}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004717
4718static int
4719load_binfloat(UnpicklerObject *self)
4720{
4721 PyObject *value;
4722 double x;
4723 char *s;
4724
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004725 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004726 return -1;
4727
4728 x = _PyFloat_Unpack8((unsigned char *)s, 0);
4729 if (x == -1.0 && PyErr_Occurred())
4730 return -1;
4731
4732 if ((value = PyFloat_FromDouble(x)) == NULL)
4733 return -1;
4734
4735 PDATA_PUSH(self->stack, value, -1);
4736 return 0;
4737}
4738
4739static int
4740load_string(UnpicklerObject *self)
4741{
4742 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004743 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004744 Py_ssize_t len;
4745 char *s, *p;
4746
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004747 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004748 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004749 /* Strip the newline */
4750 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004751 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004752 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004753 p = s + 1;
4754 len -= 2;
4755 }
4756 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004757 PickleState *st = _Pickle_GetGlobalState();
4758 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004759 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004760 return -1;
4761 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004762 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004763
4764 /* Use the PyBytes API to decode the string, since that is what is used
4765 to encode, and then coerce the result to Unicode. */
4766 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004767 if (bytes == NULL)
4768 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004769
4770 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
4771 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4772 if (strcmp(self->encoding, "bytes") == 0) {
4773 obj = bytes;
4774 }
4775 else {
4776 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
4777 Py_DECREF(bytes);
4778 if (obj == NULL) {
4779 return -1;
4780 }
4781 }
4782
4783 PDATA_PUSH(self->stack, obj, -1);
4784 return 0;
4785}
4786
4787static int
4788load_counted_binstring(UnpicklerObject *self, int nbytes)
4789{
4790 PyObject *obj;
4791 Py_ssize_t size;
4792 char *s;
4793
4794 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004795 return -1;
4796
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004797 size = calc_binsize(s, nbytes);
4798 if (size < 0) {
4799 PickleState *st = _Pickle_GetGlobalState();
4800 PyErr_Format(st->UnpicklingError,
4801 "BINSTRING exceeds system's maximum size of %zd bytes",
4802 PY_SSIZE_T_MAX);
4803 return -1;
4804 }
4805
4806 if (_Unpickler_Read(self, &s, size) < 0)
4807 return -1;
4808
4809 /* Convert Python 2.x strings to bytes if the *encoding* given to the
4810 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4811 if (strcmp(self->encoding, "bytes") == 0) {
4812 obj = PyBytes_FromStringAndSize(s, size);
4813 }
4814 else {
4815 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
4816 }
4817 if (obj == NULL) {
4818 return -1;
4819 }
4820
4821 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004822 return 0;
4823}
4824
4825static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004826load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004827{
4828 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004829 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004830 char *s;
4831
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004832 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004833 return -1;
4834
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004835 size = calc_binsize(s, nbytes);
4836 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004837 PyErr_Format(PyExc_OverflowError,
4838 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004839 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004840 return -1;
4841 }
4842
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004843 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004844 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004845
4846 bytes = PyBytes_FromStringAndSize(s, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004847 if (bytes == NULL)
4848 return -1;
4849
4850 PDATA_PUSH(self->stack, bytes, -1);
4851 return 0;
4852}
4853
4854static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004855load_unicode(UnpicklerObject *self)
4856{
4857 PyObject *str;
4858 Py_ssize_t len;
4859 char *s;
4860
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004861 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004862 return -1;
4863 if (len < 1)
4864 return bad_readline();
4865
4866 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
4867 if (str == NULL)
4868 return -1;
4869
4870 PDATA_PUSH(self->stack, str, -1);
4871 return 0;
4872}
4873
4874static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004875load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004876{
4877 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004878 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004879 char *s;
4880
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004881 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004882 return -1;
4883
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004884 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004885 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004886 PyErr_Format(PyExc_OverflowError,
4887 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004888 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004889 return -1;
4890 }
4891
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004892 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004893 return -1;
4894
Victor Stinner485fb562010-04-13 11:07:24 +00004895 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004896 if (str == NULL)
4897 return -1;
4898
4899 PDATA_PUSH(self->stack, str, -1);
4900 return 0;
4901}
4902
4903static int
4904load_tuple(UnpicklerObject *self)
4905{
4906 PyObject *tuple;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004907 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004908
4909 if ((i = marker(self)) < 0)
4910 return -1;
4911
4912 tuple = Pdata_poptuple(self->stack, i);
4913 if (tuple == NULL)
4914 return -1;
4915 PDATA_PUSH(self->stack, tuple, -1);
4916 return 0;
4917}
4918
4919static int
4920load_counted_tuple(UnpicklerObject *self, int len)
4921{
4922 PyObject *tuple;
4923
4924 tuple = PyTuple_New(len);
4925 if (tuple == NULL)
4926 return -1;
4927
4928 while (--len >= 0) {
4929 PyObject *item;
4930
4931 PDATA_POP(self->stack, item);
4932 if (item == NULL)
4933 return -1;
4934 PyTuple_SET_ITEM(tuple, len, item);
4935 }
4936 PDATA_PUSH(self->stack, tuple, -1);
4937 return 0;
4938}
4939
4940static int
4941load_empty_list(UnpicklerObject *self)
4942{
4943 PyObject *list;
4944
4945 if ((list = PyList_New(0)) == NULL)
4946 return -1;
4947 PDATA_PUSH(self->stack, list, -1);
4948 return 0;
4949}
4950
4951static int
4952load_empty_dict(UnpicklerObject *self)
4953{
4954 PyObject *dict;
4955
4956 if ((dict = PyDict_New()) == NULL)
4957 return -1;
4958 PDATA_PUSH(self->stack, dict, -1);
4959 return 0;
4960}
4961
4962static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004963load_empty_set(UnpicklerObject *self)
4964{
4965 PyObject *set;
4966
4967 if ((set = PySet_New(NULL)) == NULL)
4968 return -1;
4969 PDATA_PUSH(self->stack, set, -1);
4970 return 0;
4971}
4972
4973static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004974load_list(UnpicklerObject *self)
4975{
4976 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004977 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004978
4979 if ((i = marker(self)) < 0)
4980 return -1;
4981
4982 list = Pdata_poplist(self->stack, i);
4983 if (list == NULL)
4984 return -1;
4985 PDATA_PUSH(self->stack, list, -1);
4986 return 0;
4987}
4988
4989static int
4990load_dict(UnpicklerObject *self)
4991{
4992 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004993 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004994
4995 if ((i = marker(self)) < 0)
4996 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004997 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004998
4999 if ((dict = PyDict_New()) == NULL)
5000 return -1;
5001
5002 for (k = i + 1; k < j; k += 2) {
5003 key = self->stack->data[k - 1];
5004 value = self->stack->data[k];
5005 if (PyDict_SetItem(dict, key, value) < 0) {
5006 Py_DECREF(dict);
5007 return -1;
5008 }
5009 }
5010 Pdata_clear(self->stack, i);
5011 PDATA_PUSH(self->stack, dict, -1);
5012 return 0;
5013}
5014
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005015static int
5016load_frozenset(UnpicklerObject *self)
5017{
5018 PyObject *items;
5019 PyObject *frozenset;
5020 Py_ssize_t i;
5021
5022 if ((i = marker(self)) < 0)
5023 return -1;
5024
5025 items = Pdata_poptuple(self->stack, i);
5026 if (items == NULL)
5027 return -1;
5028
5029 frozenset = PyFrozenSet_New(items);
5030 Py_DECREF(items);
5031 if (frozenset == NULL)
5032 return -1;
5033
5034 PDATA_PUSH(self->stack, frozenset, -1);
5035 return 0;
5036}
5037
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005038static PyObject *
5039instantiate(PyObject *cls, PyObject *args)
5040{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005041 PyObject *result = NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005042 _Py_IDENTIFIER(__getinitargs__);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005043 /* Caller must assure args are a tuple. Normally, args come from
5044 Pdata_poptuple which packs objects from the top of the stack
5045 into a newly created tuple. */
5046 assert(PyTuple_Check(args));
5047 if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005048 _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005049 result = PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005050 }
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005051 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005052 _Py_IDENTIFIER(__new__);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005053
5054 result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005055 }
5056 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005057}
5058
5059static int
5060load_obj(UnpicklerObject *self)
5061{
5062 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005063 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005064
5065 if ((i = marker(self)) < 0)
5066 return -1;
5067
5068 args = Pdata_poptuple(self->stack, i + 1);
5069 if (args == NULL)
5070 return -1;
5071
5072 PDATA_POP(self->stack, cls);
5073 if (cls) {
5074 obj = instantiate(cls, args);
5075 Py_DECREF(cls);
5076 }
5077 Py_DECREF(args);
5078 if (obj == NULL)
5079 return -1;
5080
5081 PDATA_PUSH(self->stack, obj, -1);
5082 return 0;
5083}
5084
5085static int
5086load_inst(UnpicklerObject *self)
5087{
5088 PyObject *cls = NULL;
5089 PyObject *args = NULL;
5090 PyObject *obj = NULL;
5091 PyObject *module_name;
5092 PyObject *class_name;
5093 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005094 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005095 char *s;
5096
5097 if ((i = marker(self)) < 0)
5098 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005099 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005100 return -1;
5101 if (len < 2)
5102 return bad_readline();
5103
5104 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5105 identifiers are permitted in Python 3.0, since the INST opcode is only
5106 supported by older protocols on Python 2.x. */
5107 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5108 if (module_name == NULL)
5109 return -1;
5110
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005111 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005112 if (len < 2)
5113 return bad_readline();
5114 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005115 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005116 cls = find_class(self, module_name, class_name);
5117 Py_DECREF(class_name);
5118 }
5119 }
5120 Py_DECREF(module_name);
5121
5122 if (cls == NULL)
5123 return -1;
5124
5125 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5126 obj = instantiate(cls, args);
5127 Py_DECREF(args);
5128 }
5129 Py_DECREF(cls);
5130
5131 if (obj == NULL)
5132 return -1;
5133
5134 PDATA_PUSH(self->stack, obj, -1);
5135 return 0;
5136}
5137
5138static int
5139load_newobj(UnpicklerObject *self)
5140{
5141 PyObject *args = NULL;
5142 PyObject *clsraw = NULL;
5143 PyTypeObject *cls; /* clsraw cast to its true type */
5144 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005145 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005146
5147 /* Stack is ... cls argtuple, and we want to call
5148 * cls.__new__(cls, *argtuple).
5149 */
5150 PDATA_POP(self->stack, args);
5151 if (args == NULL)
5152 goto error;
5153 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005154 PyErr_SetString(st->UnpicklingError,
5155 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005156 goto error;
5157 }
5158
5159 PDATA_POP(self->stack, clsraw);
5160 cls = (PyTypeObject *)clsraw;
5161 if (cls == NULL)
5162 goto error;
5163 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005164 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005165 "isn't a type object");
5166 goto error;
5167 }
5168 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005169 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005170 "has NULL tp_new");
5171 goto error;
5172 }
5173
5174 /* Call __new__. */
5175 obj = cls->tp_new(cls, args, NULL);
5176 if (obj == NULL)
5177 goto error;
5178
5179 Py_DECREF(args);
5180 Py_DECREF(clsraw);
5181 PDATA_PUSH(self->stack, obj, -1);
5182 return 0;
5183
5184 error:
5185 Py_XDECREF(args);
5186 Py_XDECREF(clsraw);
5187 return -1;
5188}
5189
5190static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005191load_newobj_ex(UnpicklerObject *self)
5192{
5193 PyObject *cls, *args, *kwargs;
5194 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005195 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005196
5197 PDATA_POP(self->stack, kwargs);
5198 if (kwargs == NULL) {
5199 return -1;
5200 }
5201 PDATA_POP(self->stack, args);
5202 if (args == NULL) {
5203 Py_DECREF(kwargs);
5204 return -1;
5205 }
5206 PDATA_POP(self->stack, cls);
5207 if (cls == NULL) {
5208 Py_DECREF(kwargs);
5209 Py_DECREF(args);
5210 return -1;
5211 }
Larry Hastings61272b72014-01-07 12:41:53 -08005212
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005213 if (!PyType_Check(cls)) {
5214 Py_DECREF(kwargs);
5215 Py_DECREF(args);
5216 Py_DECREF(cls);
Larry Hastings61272b72014-01-07 12:41:53 -08005217 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005218 "NEWOBJ_EX class argument must be a type, not %.200s",
5219 Py_TYPE(cls)->tp_name);
5220 return -1;
5221 }
5222
5223 if (((PyTypeObject *)cls)->tp_new == NULL) {
5224 Py_DECREF(kwargs);
5225 Py_DECREF(args);
5226 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005227 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005228 "NEWOBJ_EX class argument doesn't have __new__");
5229 return -1;
5230 }
5231 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5232 Py_DECREF(kwargs);
5233 Py_DECREF(args);
5234 Py_DECREF(cls);
5235 if (obj == NULL) {
5236 return -1;
5237 }
5238 PDATA_PUSH(self->stack, obj, -1);
5239 return 0;
5240}
5241
5242static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005243load_global(UnpicklerObject *self)
5244{
5245 PyObject *global = NULL;
5246 PyObject *module_name;
5247 PyObject *global_name;
5248 Py_ssize_t len;
5249 char *s;
5250
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005251 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005252 return -1;
5253 if (len < 2)
5254 return bad_readline();
5255 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5256 if (!module_name)
5257 return -1;
5258
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005259 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005260 if (len < 2) {
5261 Py_DECREF(module_name);
5262 return bad_readline();
5263 }
5264 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5265 if (global_name) {
5266 global = find_class(self, module_name, global_name);
5267 Py_DECREF(global_name);
5268 }
5269 }
5270 Py_DECREF(module_name);
5271
5272 if (global == NULL)
5273 return -1;
5274 PDATA_PUSH(self->stack, global, -1);
5275 return 0;
5276}
5277
5278static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005279load_stack_global(UnpicklerObject *self)
5280{
5281 PyObject *global;
5282 PyObject *module_name;
5283 PyObject *global_name;
5284
5285 PDATA_POP(self->stack, global_name);
5286 PDATA_POP(self->stack, module_name);
5287 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5288 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005289 PickleState *st = _Pickle_GetGlobalState();
5290 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005291 Py_XDECREF(global_name);
5292 Py_XDECREF(module_name);
5293 return -1;
5294 }
5295 global = find_class(self, module_name, global_name);
5296 Py_DECREF(global_name);
5297 Py_DECREF(module_name);
5298 if (global == NULL)
5299 return -1;
5300 PDATA_PUSH(self->stack, global, -1);
5301 return 0;
5302}
5303
5304static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005305load_persid(UnpicklerObject *self)
5306{
5307 PyObject *pid;
5308 Py_ssize_t len;
5309 char *s;
5310
5311 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005312 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005313 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08005314 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005315 return bad_readline();
5316
5317 pid = PyBytes_FromStringAndSize(s, len - 1);
5318 if (pid == NULL)
5319 return -1;
5320
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005321 /* This does not leak since _Pickle_FastCall() steals the reference
5322 to pid first. */
5323 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005324 if (pid == NULL)
5325 return -1;
5326
5327 PDATA_PUSH(self->stack, pid, -1);
5328 return 0;
5329 }
5330 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005331 PickleState *st = _Pickle_GetGlobalState();
5332 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005333 "A load persistent id instruction was encountered,\n"
5334 "but no persistent_load function was specified.");
5335 return -1;
5336 }
5337}
5338
5339static int
5340load_binpersid(UnpicklerObject *self)
5341{
5342 PyObject *pid;
5343
5344 if (self->pers_func) {
5345 PDATA_POP(self->stack, pid);
5346 if (pid == NULL)
5347 return -1;
5348
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005349 /* This does not leak since _Pickle_FastCall() steals the
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005350 reference to pid first. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005351 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005352 if (pid == NULL)
5353 return -1;
5354
5355 PDATA_PUSH(self->stack, pid, -1);
5356 return 0;
5357 }
5358 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005359 PickleState *st = _Pickle_GetGlobalState();
5360 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005361 "A load persistent id instruction was encountered,\n"
5362 "but no persistent_load function was specified.");
5363 return -1;
5364 }
5365}
5366
5367static int
5368load_pop(UnpicklerObject *self)
5369{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005370 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005371
5372 /* Note that we split the (pickle.py) stack into two stacks,
5373 * an object stack and a mark stack. We have to be clever and
5374 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005375 * mark stack first, and only signalling a stack underflow if
5376 * the object stack is empty and the mark stack doesn't match
5377 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005378 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005379 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005380 self->num_marks--;
Antoine Pitrou01a15ea2010-01-07 17:57:31 +00005381 } else if (len > 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005382 len--;
5383 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005384 Py_SIZE(self->stack) = len;
Collin Winter8ca69de2009-05-26 16:53:41 +00005385 } else {
5386 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005387 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005388 return 0;
5389}
5390
5391static int
5392load_pop_mark(UnpicklerObject *self)
5393{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005394 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005395
5396 if ((i = marker(self)) < 0)
5397 return -1;
5398
5399 Pdata_clear(self->stack, i);
5400
5401 return 0;
5402}
5403
5404static int
5405load_dup(UnpicklerObject *self)
5406{
5407 PyObject *last;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005408 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005409
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005410 if ((len = Py_SIZE(self->stack)) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005411 return stack_underflow();
5412 last = self->stack->data[len - 1];
5413 PDATA_APPEND(self->stack, last, -1);
5414 return 0;
5415}
5416
5417static int
5418load_get(UnpicklerObject *self)
5419{
5420 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005421 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005422 Py_ssize_t len;
5423 char *s;
5424
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005425 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005426 return -1;
5427 if (len < 2)
5428 return bad_readline();
5429
5430 key = PyLong_FromString(s, NULL, 10);
5431 if (key == NULL)
5432 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005433 idx = PyLong_AsSsize_t(key);
5434 if (idx == -1 && PyErr_Occurred()) {
5435 Py_DECREF(key);
5436 return -1;
5437 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005438
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005439 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005440 if (value == NULL) {
5441 if (!PyErr_Occurred())
5442 PyErr_SetObject(PyExc_KeyError, key);
5443 Py_DECREF(key);
5444 return -1;
5445 }
5446 Py_DECREF(key);
5447
5448 PDATA_APPEND(self->stack, value, -1);
5449 return 0;
5450}
5451
5452static int
5453load_binget(UnpicklerObject *self)
5454{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005455 PyObject *value;
5456 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005457 char *s;
5458
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005459 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005460 return -1;
5461
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005462 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005463
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005464 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005465 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005466 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005467 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005468 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005469 Py_DECREF(key);
5470 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005471 return -1;
5472 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005473
5474 PDATA_APPEND(self->stack, value, -1);
5475 return 0;
5476}
5477
5478static int
5479load_long_binget(UnpicklerObject *self)
5480{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005481 PyObject *value;
5482 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005483 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005484
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005485 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005486 return -1;
5487
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005488 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005489
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005490 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005491 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005492 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005493 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005494 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005495 Py_DECREF(key);
5496 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005497 return -1;
5498 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005499
5500 PDATA_APPEND(self->stack, value, -1);
5501 return 0;
5502}
5503
5504/* Push an object from the extension registry (EXT[124]). nbytes is
5505 * the number of bytes following the opcode, holding the index (code) value.
5506 */
5507static int
5508load_extension(UnpicklerObject *self, int nbytes)
5509{
5510 char *codebytes; /* the nbytes bytes after the opcode */
5511 long code; /* calc_binint returns long */
5512 PyObject *py_code; /* code as a Python int */
5513 PyObject *obj; /* the object to push */
5514 PyObject *pair; /* (module_name, class_name) */
5515 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005516 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005517
5518 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005519 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005520 return -1;
5521 code = calc_binint(codebytes, nbytes);
5522 if (code <= 0) { /* note that 0 is forbidden */
5523 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005524 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005525 return -1;
5526 }
5527
5528 /* Look for the code in the cache. */
5529 py_code = PyLong_FromLong(code);
5530 if (py_code == NULL)
5531 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005532 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005533 if (obj != NULL) {
5534 /* Bingo. */
5535 Py_DECREF(py_code);
5536 PDATA_APPEND(self->stack, obj, -1);
5537 return 0;
5538 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005539 if (PyErr_Occurred()) {
5540 Py_DECREF(py_code);
5541 return -1;
5542 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005543
5544 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005545 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005546 if (pair == NULL) {
5547 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005548 if (!PyErr_Occurred()) {
5549 PyErr_Format(PyExc_ValueError, "unregistered extension "
5550 "code %ld", code);
5551 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005552 return -1;
5553 }
5554 /* Since the extension registry is manipulable via Python code,
5555 * confirm that pair is really a 2-tuple of strings.
5556 */
5557 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5558 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5559 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5560 Py_DECREF(py_code);
5561 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5562 "isn't a 2-tuple of strings", code);
5563 return -1;
5564 }
5565 /* Load the object. */
5566 obj = find_class(self, module_name, class_name);
5567 if (obj == NULL) {
5568 Py_DECREF(py_code);
5569 return -1;
5570 }
5571 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005572 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005573 Py_DECREF(py_code);
5574 if (code < 0) {
5575 Py_DECREF(obj);
5576 return -1;
5577 }
5578 PDATA_PUSH(self->stack, obj, -1);
5579 return 0;
5580}
5581
5582static int
5583load_put(UnpicklerObject *self)
5584{
5585 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005586 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005587 Py_ssize_t len;
5588 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005589
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005590 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005591 return -1;
5592 if (len < 2)
5593 return bad_readline();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005594 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005595 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005596 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005597
5598 key = PyLong_FromString(s, NULL, 10);
5599 if (key == NULL)
5600 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005601 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005602 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005603 if (idx < 0) {
5604 if (!PyErr_Occurred())
5605 PyErr_SetString(PyExc_ValueError,
5606 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005607 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005608 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005609
5610 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005611}
5612
5613static int
5614load_binput(UnpicklerObject *self)
5615{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005616 PyObject *value;
5617 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005618 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005619
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005620 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005621 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005622
5623 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005624 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005625 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005626
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005627 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005628
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005629 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005630}
5631
5632static int
5633load_long_binput(UnpicklerObject *self)
5634{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005635 PyObject *value;
5636 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005637 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005638
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005639 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005640 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005641
5642 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005643 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005644 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005645
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005646 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005647 if (idx < 0) {
5648 PyErr_SetString(PyExc_ValueError,
5649 "negative LONG_BINPUT argument");
5650 return -1;
5651 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005652
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005653 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005654}
5655
5656static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005657load_memoize(UnpicklerObject *self)
5658{
5659 PyObject *value;
5660
5661 if (Py_SIZE(self->stack) <= 0)
5662 return stack_underflow();
5663 value = self->stack->data[Py_SIZE(self->stack) - 1];
5664
5665 return _Unpickler_MemoPut(self, self->memo_len, value);
5666}
5667
5668static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005669do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005670{
5671 PyObject *value;
5672 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005673 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005674
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005675 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005676 if (x > len || x <= 0)
5677 return stack_underflow();
5678 if (len == x) /* nothing to do */
5679 return 0;
5680
5681 list = self->stack->data[x - 1];
5682
5683 if (PyList_Check(list)) {
5684 PyObject *slice;
5685 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005686 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005687
5688 slice = Pdata_poplist(self->stack, x);
5689 if (!slice)
5690 return -1;
5691 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005692 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005693 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005694 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005695 }
5696 else {
5697 PyObject *append_func;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005698 _Py_IDENTIFIER(append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005699
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005700 append_func = _PyObject_GetAttrId(list, &PyId_append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005701 if (append_func == NULL)
5702 return -1;
5703 for (i = x; i < len; i++) {
5704 PyObject *result;
5705
5706 value = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005707 result = _Pickle_FastCall(append_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005708 if (result == NULL) {
5709 Pdata_clear(self->stack, i + 1);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005710 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005711 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005712 return -1;
5713 }
5714 Py_DECREF(result);
5715 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005716 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005717 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005718 }
5719
5720 return 0;
5721}
5722
5723static int
5724load_append(UnpicklerObject *self)
5725{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005726 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005727}
5728
5729static int
5730load_appends(UnpicklerObject *self)
5731{
5732 return do_append(self, marker(self));
5733}
5734
5735static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005736do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005737{
5738 PyObject *value, *key;
5739 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005740 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005741 int status = 0;
5742
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005743 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005744 if (x > len || x <= 0)
5745 return stack_underflow();
5746 if (len == x) /* nothing to do */
5747 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005748 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005749 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005750 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005751 PyErr_SetString(st->UnpicklingError,
5752 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005753 return -1;
5754 }
5755
5756 /* Here, dict does not actually need to be a PyDict; it could be anything
5757 that supports the __setitem__ attribute. */
5758 dict = self->stack->data[x - 1];
5759
5760 for (i = x + 1; i < len; i += 2) {
5761 key = self->stack->data[i - 1];
5762 value = self->stack->data[i];
5763 if (PyObject_SetItem(dict, key, value) < 0) {
5764 status = -1;
5765 break;
5766 }
5767 }
5768
5769 Pdata_clear(self->stack, x);
5770 return status;
5771}
5772
5773static int
5774load_setitem(UnpicklerObject *self)
5775{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005776 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005777}
5778
5779static int
5780load_setitems(UnpicklerObject *self)
5781{
5782 return do_setitems(self, marker(self));
5783}
5784
5785static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005786load_additems(UnpicklerObject *self)
5787{
5788 PyObject *set;
5789 Py_ssize_t mark, len, i;
5790
5791 mark = marker(self);
5792 len = Py_SIZE(self->stack);
5793 if (mark > len || mark <= 0)
5794 return stack_underflow();
5795 if (len == mark) /* nothing to do */
5796 return 0;
5797
5798 set = self->stack->data[mark - 1];
5799
5800 if (PySet_Check(set)) {
5801 PyObject *items;
5802 int status;
5803
5804 items = Pdata_poptuple(self->stack, mark);
5805 if (items == NULL)
5806 return -1;
5807
5808 status = _PySet_Update(set, items);
5809 Py_DECREF(items);
5810 return status;
5811 }
5812 else {
5813 PyObject *add_func;
5814 _Py_IDENTIFIER(add);
5815
5816 add_func = _PyObject_GetAttrId(set, &PyId_add);
5817 if (add_func == NULL)
5818 return -1;
5819 for (i = mark; i < len; i++) {
5820 PyObject *result;
5821 PyObject *item;
5822
5823 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005824 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005825 if (result == NULL) {
5826 Pdata_clear(self->stack, i + 1);
5827 Py_SIZE(self->stack) = mark;
5828 return -1;
5829 }
5830 Py_DECREF(result);
5831 }
5832 Py_SIZE(self->stack) = mark;
5833 }
5834
5835 return 0;
5836}
5837
5838static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005839load_build(UnpicklerObject *self)
5840{
5841 PyObject *state, *inst, *slotstate;
5842 PyObject *setstate;
5843 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005844 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005845
5846 /* Stack is ... instance, state. We want to leave instance at
5847 * the stack top, possibly mutated via instance.__setstate__(state).
5848 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005849 if (Py_SIZE(self->stack) < 2)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005850 return stack_underflow();
5851
5852 PDATA_POP(self->stack, state);
5853 if (state == NULL)
5854 return -1;
5855
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005856 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005857
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005858 setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005859 if (setstate == NULL) {
5860 if (PyErr_ExceptionMatches(PyExc_AttributeError))
5861 PyErr_Clear();
Antoine Pitroud79dc622008-09-05 00:03:33 +00005862 else {
5863 Py_DECREF(state);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005864 return -1;
Antoine Pitroud79dc622008-09-05 00:03:33 +00005865 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005866 }
5867 else {
5868 PyObject *result;
5869
5870 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005871 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005872 Py_DECREF(setstate);
5873 if (result == NULL)
5874 return -1;
5875 Py_DECREF(result);
5876 return 0;
5877 }
5878
5879 /* A default __setstate__. First see whether state embeds a
5880 * slot state dict too (a proto 2 addition).
5881 */
5882 if (PyTuple_Check(state) && Py_SIZE(state) == 2) {
5883 PyObject *tmp = state;
5884
5885 state = PyTuple_GET_ITEM(tmp, 0);
5886 slotstate = PyTuple_GET_ITEM(tmp, 1);
5887 Py_INCREF(state);
5888 Py_INCREF(slotstate);
5889 Py_DECREF(tmp);
5890 }
5891 else
5892 slotstate = NULL;
5893
5894 /* Set inst.__dict__ from the state dict (if any). */
5895 if (state != Py_None) {
5896 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005897 PyObject *d_key, *d_value;
5898 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005899 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005900
5901 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005902 PickleState *st = _Pickle_GetGlobalState();
5903 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005904 goto error;
5905 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005906 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005907 if (dict == NULL)
5908 goto error;
5909
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005910 i = 0;
5911 while (PyDict_Next(state, &i, &d_key, &d_value)) {
5912 /* normally the keys for instance attributes are
5913 interned. we should try to do that here. */
5914 Py_INCREF(d_key);
5915 if (PyUnicode_CheckExact(d_key))
5916 PyUnicode_InternInPlace(&d_key);
5917 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
5918 Py_DECREF(d_key);
5919 goto error;
5920 }
5921 Py_DECREF(d_key);
5922 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005923 Py_DECREF(dict);
5924 }
5925
5926 /* Also set instance attributes from the slotstate dict (if any). */
5927 if (slotstate != NULL) {
5928 PyObject *d_key, *d_value;
5929 Py_ssize_t i;
5930
5931 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005932 PickleState *st = _Pickle_GetGlobalState();
5933 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005934 "slot state is not a dictionary");
5935 goto error;
5936 }
5937 i = 0;
5938 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
5939 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
5940 goto error;
5941 }
5942 }
5943
5944 if (0) {
5945 error:
5946 status = -1;
5947 }
5948
5949 Py_DECREF(state);
5950 Py_XDECREF(slotstate);
5951 return status;
5952}
5953
5954static int
5955load_mark(UnpicklerObject *self)
5956{
5957
5958 /* Note that we split the (pickle.py) stack into two stacks, an
5959 * object stack and a mark stack. Here we push a mark onto the
5960 * mark stack.
5961 */
5962
5963 if ((self->num_marks + 1) >= self->marks_size) {
5964 size_t alloc;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005965 Py_ssize_t *marks;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005966
5967 /* Use the size_t type to check for overflow. */
5968 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005969 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00005970 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005971 PyErr_NoMemory();
5972 return -1;
5973 }
5974
5975 if (self->marks == NULL)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005976 marks = (Py_ssize_t *) PyMem_Malloc(alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005977 else
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005978 marks = (Py_ssize_t *) PyMem_Realloc(self->marks,
5979 alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005980 if (marks == NULL) {
5981 PyErr_NoMemory();
5982 return -1;
5983 }
5984 self->marks = marks;
5985 self->marks_size = (Py_ssize_t)alloc;
5986 }
5987
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005988 self->marks[self->num_marks++] = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005989
5990 return 0;
5991}
5992
5993static int
5994load_reduce(UnpicklerObject *self)
5995{
5996 PyObject *callable = NULL;
5997 PyObject *argtup = NULL;
5998 PyObject *obj = NULL;
5999
6000 PDATA_POP(self->stack, argtup);
6001 if (argtup == NULL)
6002 return -1;
6003 PDATA_POP(self->stack, callable);
6004 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006005 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006006 Py_DECREF(callable);
6007 }
6008 Py_DECREF(argtup);
6009
6010 if (obj == NULL)
6011 return -1;
6012
6013 PDATA_PUSH(self->stack, obj, -1);
6014 return 0;
6015}
6016
6017/* Just raises an error if we don't know the protocol specified. PROTO
6018 * is the first opcode for protocols >= 2.
6019 */
6020static int
6021load_proto(UnpicklerObject *self)
6022{
6023 char *s;
6024 int i;
6025
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006026 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006027 return -1;
6028
6029 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006030 if (i <= HIGHEST_PROTOCOL) {
6031 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006032 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006033 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006034
6035 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6036 return -1;
6037}
6038
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006039static int
6040load_frame(UnpicklerObject *self)
6041{
6042 char *s;
6043 Py_ssize_t frame_len;
6044
6045 if (_Unpickler_Read(self, &s, 8) < 0)
6046 return -1;
6047
6048 frame_len = calc_binsize(s, 8);
6049 if (frame_len < 0) {
6050 PyErr_Format(PyExc_OverflowError,
6051 "FRAME length exceeds system's maximum of %zd bytes",
6052 PY_SSIZE_T_MAX);
6053 return -1;
6054 }
6055
6056 if (_Unpickler_Read(self, &s, frame_len) < 0)
6057 return -1;
6058
6059 /* Rewind to start of frame */
6060 self->next_read_idx -= frame_len;
6061 return 0;
6062}
6063
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006064static PyObject *
6065load(UnpicklerObject *self)
6066{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006067 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006068 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006069
6070 self->num_marks = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006071 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006072 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006073 Pdata_clear(self->stack, 0);
6074
6075 /* Convenient macros for the dispatch while-switch loop just below. */
6076#define OP(opcode, load_func) \
6077 case opcode: if (load_func(self) < 0) break; continue;
6078
6079#define OP_ARG(opcode, load_func, arg) \
6080 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6081
6082 while (1) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006083 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006084 break;
6085
6086 switch ((enum opcode)s[0]) {
6087 OP(NONE, load_none)
6088 OP(BININT, load_binint)
6089 OP(BININT1, load_binint1)
6090 OP(BININT2, load_binint2)
6091 OP(INT, load_int)
6092 OP(LONG, load_long)
6093 OP_ARG(LONG1, load_counted_long, 1)
6094 OP_ARG(LONG4, load_counted_long, 4)
6095 OP(FLOAT, load_float)
6096 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006097 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6098 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6099 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6100 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6101 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006102 OP(STRING, load_string)
6103 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006104 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6105 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6106 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006107 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6108 OP_ARG(TUPLE1, load_counted_tuple, 1)
6109 OP_ARG(TUPLE2, load_counted_tuple, 2)
6110 OP_ARG(TUPLE3, load_counted_tuple, 3)
6111 OP(TUPLE, load_tuple)
6112 OP(EMPTY_LIST, load_empty_list)
6113 OP(LIST, load_list)
6114 OP(EMPTY_DICT, load_empty_dict)
6115 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006116 OP(EMPTY_SET, load_empty_set)
6117 OP(ADDITEMS, load_additems)
6118 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006119 OP(OBJ, load_obj)
6120 OP(INST, load_inst)
6121 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006122 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006123 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006124 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006125 OP(APPEND, load_append)
6126 OP(APPENDS, load_appends)
6127 OP(BUILD, load_build)
6128 OP(DUP, load_dup)
6129 OP(BINGET, load_binget)
6130 OP(LONG_BINGET, load_long_binget)
6131 OP(GET, load_get)
6132 OP(MARK, load_mark)
6133 OP(BINPUT, load_binput)
6134 OP(LONG_BINPUT, load_long_binput)
6135 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006136 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006137 OP(POP, load_pop)
6138 OP(POP_MARK, load_pop_mark)
6139 OP(SETITEM, load_setitem)
6140 OP(SETITEMS, load_setitems)
6141 OP(PERSID, load_persid)
6142 OP(BINPERSID, load_binpersid)
6143 OP(REDUCE, load_reduce)
6144 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006145 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006146 OP_ARG(EXT1, load_extension, 1)
6147 OP_ARG(EXT2, load_extension, 2)
6148 OP_ARG(EXT4, load_extension, 4)
6149 OP_ARG(NEWTRUE, load_bool, Py_True)
6150 OP_ARG(NEWFALSE, load_bool, Py_False)
6151
6152 case STOP:
6153 break;
6154
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006155 default:
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006156 if (s[0] == '\0') {
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006157 PyErr_SetNone(PyExc_EOFError);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006158 }
6159 else {
6160 PickleState *st = _Pickle_GetGlobalState();
6161 PyErr_Format(st->UnpicklingError,
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006162 "invalid load key, '%c'.", s[0]);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006163 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006164 return NULL;
6165 }
6166
6167 break; /* and we are done! */
6168 }
6169
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006170 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006171 return NULL;
6172 }
6173
Victor Stinner2ae57e32013-10-31 13:39:23 +01006174 if (_Unpickler_SkipConsumed(self) < 0)
6175 return NULL;
6176
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006177 PDATA_POP(self->stack, value);
6178 return value;
6179}
6180
Larry Hastings61272b72014-01-07 12:41:53 -08006181/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006182
6183_pickle.Unpickler.load
6184
6185Load a pickle.
6186
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006187Read a pickled object representation from the open file object given
6188in the constructor, and return the reconstituted object hierarchy
6189specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006190[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006191
Larry Hastings3cceb382014-01-04 11:09:09 -08006192static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006193_pickle_Unpickler_load_impl(UnpicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006194/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006195{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006196 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006197
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006198 /* Check whether the Unpickler was initialized correctly. This prevents
6199 segfaulting if a subclass overridden __init__ with a function that does
6200 not call Unpickler.__init__(). Here, we simply ensure that self->read
6201 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006202 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006203 PickleState *st = _Pickle_GetGlobalState();
6204 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006205 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006206 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006207 return NULL;
6208 }
6209
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006210 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006211}
6212
6213/* The name of find_class() is misleading. In newer pickle protocols, this
6214 function is used for loading any global (i.e., functions), not just
6215 classes. The name is kept only for backward compatibility. */
6216
Larry Hastings61272b72014-01-07 12:41:53 -08006217/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006218
6219_pickle.Unpickler.find_class
6220
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006221 module_name: object
6222 global_name: object
6223 /
6224
6225Return an object from a specified module.
6226
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006227If necessary, the module will be imported. Subclasses may override
6228this method (e.g. to restrict unpickling of arbitrary classes and
6229functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006230
6231This method is called whenever a class or a function object is
6232needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006233[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006234
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006235static PyObject *
6236_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
Larry Hastings581ee362014-01-28 05:00:08 -08006237/*[clinic end generated code: output=64c77437e088e188 input=e2e6a865de093ef4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006238{
6239 PyObject *global;
6240 PyObject *modules_dict;
6241 PyObject *module;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006242 _Py_IDENTIFIER(modules);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006243
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006244 /* Try to map the old names used in Python 2.x to the new ones used in
6245 Python 3.x. We do this only with old pickle protocols and when the
6246 user has not disabled the feature. */
6247 if (self->proto < 3 && self->fix_imports) {
6248 PyObject *key;
6249 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006250 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006251
6252 /* Check if the global (i.e., a function or a class) was renamed
6253 or moved to another module. */
6254 key = PyTuple_Pack(2, module_name, global_name);
6255 if (key == NULL)
6256 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006257 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006258 Py_DECREF(key);
6259 if (item) {
6260 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6261 PyErr_Format(PyExc_RuntimeError,
6262 "_compat_pickle.NAME_MAPPING values should be "
6263 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6264 return NULL;
6265 }
6266 module_name = PyTuple_GET_ITEM(item, 0);
6267 global_name = PyTuple_GET_ITEM(item, 1);
6268 if (!PyUnicode_Check(module_name) ||
6269 !PyUnicode_Check(global_name)) {
6270 PyErr_Format(PyExc_RuntimeError,
6271 "_compat_pickle.NAME_MAPPING values should be "
6272 "pairs of str, not (%.200s, %.200s)",
6273 Py_TYPE(module_name)->tp_name,
6274 Py_TYPE(global_name)->tp_name);
6275 return NULL;
6276 }
6277 }
6278 else if (PyErr_Occurred()) {
6279 return NULL;
6280 }
6281
6282 /* Check if the module was renamed. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006283 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006284 if (item) {
6285 if (!PyUnicode_Check(item)) {
6286 PyErr_Format(PyExc_RuntimeError,
6287 "_compat_pickle.IMPORT_MAPPING values should be "
6288 "strings, not %.200s", Py_TYPE(item)->tp_name);
6289 return NULL;
6290 }
6291 module_name = item;
6292 }
6293 else if (PyErr_Occurred()) {
6294 return NULL;
6295 }
6296 }
6297
Victor Stinnerbb520202013-11-06 22:40:41 +01006298 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02006299 if (modules_dict == NULL) {
6300 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006301 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02006302 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006303
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006304 module = PyDict_GetItemWithError(modules_dict, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006305 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006306 if (PyErr_Occurred())
6307 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006308 module = PyImport_Import(module_name);
6309 if (module == NULL)
6310 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006311 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006312 Py_DECREF(module);
6313 }
Victor Stinner121aab42011-09-29 23:40:53 +02006314 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006315 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006316 }
6317 return global;
6318}
6319
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006320/*[clinic input]
6321
6322_pickle.Unpickler.__sizeof__ -> Py_ssize_t
6323
6324Returns size in memory, in bytes.
6325[clinic start generated code]*/
6326
6327static Py_ssize_t
6328_pickle_Unpickler___sizeof___impl(UnpicklerObject *self)
6329/*[clinic end generated code: output=119d9d03ad4c7651 input=13333471fdeedf5e]*/
6330{
6331 Py_ssize_t res;
6332
6333 res = sizeof(UnpicklerObject);
6334 if (self->memo != NULL)
6335 res += self->memo_size * sizeof(PyObject *);
6336 if (self->marks != NULL)
6337 res += self->marks_size * sizeof(Py_ssize_t);
6338 if (self->input_line != NULL)
6339 res += strlen(self->input_line) + 1;
6340 if (self->encoding != NULL)
6341 res += strlen(self->encoding) + 1;
6342 if (self->errors != NULL)
6343 res += strlen(self->errors) + 1;
6344 return res;
6345}
6346
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006347static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006348 _PICKLE_UNPICKLER_LOAD_METHODDEF
6349 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02006350 _PICKLE_UNPICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006351 {NULL, NULL} /* sentinel */
6352};
6353
6354static void
6355Unpickler_dealloc(UnpicklerObject *self)
6356{
6357 PyObject_GC_UnTrack((PyObject *)self);
6358 Py_XDECREF(self->readline);
6359 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006360 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006361 Py_XDECREF(self->stack);
6362 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006363 if (self->buffer.buf != NULL) {
6364 PyBuffer_Release(&self->buffer);
6365 self->buffer.buf = NULL;
6366 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006367
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006368 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006369 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006370 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006371 PyMem_Free(self->encoding);
6372 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006373
6374 Py_TYPE(self)->tp_free((PyObject *)self);
6375}
6376
6377static int
6378Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6379{
6380 Py_VISIT(self->readline);
6381 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006382 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006383 Py_VISIT(self->stack);
6384 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006385 return 0;
6386}
6387
6388static int
6389Unpickler_clear(UnpicklerObject *self)
6390{
6391 Py_CLEAR(self->readline);
6392 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006393 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006394 Py_CLEAR(self->stack);
6395 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006396 if (self->buffer.buf != NULL) {
6397 PyBuffer_Release(&self->buffer);
6398 self->buffer.buf = NULL;
6399 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006400
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006401 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006402 PyMem_Free(self->marks);
6403 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006404 PyMem_Free(self->input_line);
6405 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006406 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006407 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006408 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006409 self->errors = NULL;
6410
6411 return 0;
6412}
6413
Larry Hastings61272b72014-01-07 12:41:53 -08006414/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006415
6416_pickle.Unpickler.__init__
6417
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006418 file: object
6419 *
6420 fix_imports: bool = True
6421 encoding: str = 'ASCII'
6422 errors: str = 'strict'
6423
6424This takes a binary file for reading a pickle data stream.
6425
6426The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006427protocol argument is needed. Bytes past the pickled object's
6428representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006429
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006430The argument *file* must have two methods, a read() method that takes
6431an integer argument, and a readline() method that requires no
6432arguments. Both methods should return bytes. Thus *file* can be a
6433binary file object opened for reading, a io.BytesIO object, or any
6434other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006435
6436Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6437which are used to control compatiblity support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006438generated by Python 2. If *fix_imports* is True, pickle will try to
6439map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006440*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006441instances pickled by Python 2; these default to 'ASCII' and 'strict',
6442respectively. The *encoding* can be 'bytes' to read these 8-bit
6443string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006444[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006445
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006446static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006447_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, const char *errors)
Larry Hastings581ee362014-01-28 05:00:08 -08006448/*[clinic end generated code: output=b9ed1d84d315f3b5 input=30b4dc9e976b890c]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006449{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006450 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006451
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006452 /* In case of multiple __init__() calls, clear previous content. */
6453 if (self->read != NULL)
6454 (void)Unpickler_clear(self);
6455
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006456 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006457 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006458
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006459 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006460 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006461
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006462 self->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006463 if (self->fix_imports == -1)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006464 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006465
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006466 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006467 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
6468 &PyId_persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006469 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006470 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006471 }
6472 else {
6473 self->pers_func = NULL;
6474 }
6475
6476 self->stack = (Pdata *)Pdata_New();
6477 if (self->stack == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006478 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006479
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006480 self->memo_size = 32;
6481 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006482 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006483 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006484
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006485 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006486
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006487 return 0;
6488}
6489
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006490
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006491/* Define a proxy object for the Unpickler's internal memo object. This is to
6492 * avoid breaking code like:
6493 * unpickler.memo.clear()
6494 * and
6495 * unpickler.memo = saved_memo
6496 * Is this a good idea? Not really, but we don't want to break code that uses
6497 * it. Note that we don't implement the entire mapping API here. This is
6498 * intentional, as these should be treated as black-box implementation details.
6499 *
6500 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006501 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006502 */
6503
Larry Hastings61272b72014-01-07 12:41:53 -08006504/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006505_pickle.UnpicklerMemoProxy.clear
6506
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006507Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08006508[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006509
Larry Hastings3cceb382014-01-04 11:09:09 -08006510static PyObject *
6511_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006512/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006513{
6514 _Unpickler_MemoCleanup(self->unpickler);
6515 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6516 if (self->unpickler->memo == NULL)
6517 return NULL;
6518 Py_RETURN_NONE;
6519}
6520
Larry Hastings61272b72014-01-07 12:41:53 -08006521/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006522_pickle.UnpicklerMemoProxy.copy
6523
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006524Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08006525[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006526
Larry Hastings3cceb382014-01-04 11:09:09 -08006527static PyObject *
6528_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006529/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006530{
6531 Py_ssize_t i;
6532 PyObject *new_memo = PyDict_New();
6533 if (new_memo == NULL)
6534 return NULL;
6535
6536 for (i = 0; i < self->unpickler->memo_size; i++) {
6537 int status;
6538 PyObject *key, *value;
6539
6540 value = self->unpickler->memo[i];
6541 if (value == NULL)
6542 continue;
6543
6544 key = PyLong_FromSsize_t(i);
6545 if (key == NULL)
6546 goto error;
6547 status = PyDict_SetItem(new_memo, key, value);
6548 Py_DECREF(key);
6549 if (status < 0)
6550 goto error;
6551 }
6552 return new_memo;
6553
6554error:
6555 Py_DECREF(new_memo);
6556 return NULL;
6557}
6558
Larry Hastings61272b72014-01-07 12:41:53 -08006559/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006560_pickle.UnpicklerMemoProxy.__reduce__
6561
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006562Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08006563[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006564
Larry Hastings3cceb382014-01-04 11:09:09 -08006565static PyObject *
6566_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006567/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006568{
6569 PyObject *reduce_value;
6570 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08006571 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006572 if (contents == NULL)
6573 return NULL;
6574
6575 reduce_value = PyTuple_New(2);
6576 if (reduce_value == NULL) {
6577 Py_DECREF(contents);
6578 return NULL;
6579 }
6580 constructor_args = PyTuple_New(1);
6581 if (constructor_args == NULL) {
6582 Py_DECREF(contents);
6583 Py_DECREF(reduce_value);
6584 return NULL;
6585 }
6586 PyTuple_SET_ITEM(constructor_args, 0, contents);
6587 Py_INCREF((PyObject *)&PyDict_Type);
6588 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6589 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6590 return reduce_value;
6591}
6592
6593static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006594 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6595 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6596 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006597 {NULL, NULL} /* sentinel */
6598};
6599
6600static void
6601UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6602{
6603 PyObject_GC_UnTrack(self);
6604 Py_XDECREF(self->unpickler);
6605 PyObject_GC_Del((PyObject *)self);
6606}
6607
6608static int
6609UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6610 visitproc visit, void *arg)
6611{
6612 Py_VISIT(self->unpickler);
6613 return 0;
6614}
6615
6616static int
6617UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6618{
6619 Py_CLEAR(self->unpickler);
6620 return 0;
6621}
6622
6623static PyTypeObject UnpicklerMemoProxyType = {
6624 PyVarObject_HEAD_INIT(NULL, 0)
6625 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6626 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6627 0,
6628 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6629 0, /* tp_print */
6630 0, /* tp_getattr */
6631 0, /* tp_setattr */
6632 0, /* tp_compare */
6633 0, /* tp_repr */
6634 0, /* tp_as_number */
6635 0, /* tp_as_sequence */
6636 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006637 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006638 0, /* tp_call */
6639 0, /* tp_str */
6640 PyObject_GenericGetAttr, /* tp_getattro */
6641 PyObject_GenericSetAttr, /* tp_setattro */
6642 0, /* tp_as_buffer */
6643 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6644 0, /* tp_doc */
6645 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6646 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6647 0, /* tp_richcompare */
6648 0, /* tp_weaklistoffset */
6649 0, /* tp_iter */
6650 0, /* tp_iternext */
6651 unpicklerproxy_methods, /* tp_methods */
6652};
6653
6654static PyObject *
6655UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6656{
6657 UnpicklerMemoProxyObject *self;
6658
6659 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6660 &UnpicklerMemoProxyType);
6661 if (self == NULL)
6662 return NULL;
6663 Py_INCREF(unpickler);
6664 self->unpickler = unpickler;
6665 PyObject_GC_Track(self);
6666 return (PyObject *)self;
6667}
6668
6669/*****************************************************************************/
6670
6671
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006672static PyObject *
6673Unpickler_get_memo(UnpicklerObject *self)
6674{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006675 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006676}
6677
6678static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006679Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006680{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006681 PyObject **new_memo;
6682 Py_ssize_t new_memo_size = 0;
6683 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006684
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006685 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006686 PyErr_SetString(PyExc_TypeError,
6687 "attribute deletion is not supported");
6688 return -1;
6689 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006690
6691 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6692 UnpicklerObject *unpickler =
6693 ((UnpicklerMemoProxyObject *)obj)->unpickler;
6694
6695 new_memo_size = unpickler->memo_size;
6696 new_memo = _Unpickler_NewMemo(new_memo_size);
6697 if (new_memo == NULL)
6698 return -1;
6699
6700 for (i = 0; i < new_memo_size; i++) {
6701 Py_XINCREF(unpickler->memo[i]);
6702 new_memo[i] = unpickler->memo[i];
6703 }
6704 }
6705 else if (PyDict_Check(obj)) {
6706 Py_ssize_t i = 0;
6707 PyObject *key, *value;
6708
6709 new_memo_size = PyDict_Size(obj);
6710 new_memo = _Unpickler_NewMemo(new_memo_size);
6711 if (new_memo == NULL)
6712 return -1;
6713
6714 while (PyDict_Next(obj, &i, &key, &value)) {
6715 Py_ssize_t idx;
6716 if (!PyLong_Check(key)) {
6717 PyErr_SetString(PyExc_TypeError,
6718 "memo key must be integers");
6719 goto error;
6720 }
6721 idx = PyLong_AsSsize_t(key);
6722 if (idx == -1 && PyErr_Occurred())
6723 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02006724 if (idx < 0) {
6725 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02006726 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02006727 goto error;
6728 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006729 if (_Unpickler_MemoPut(self, idx, value) < 0)
6730 goto error;
6731 }
6732 }
6733 else {
6734 PyErr_Format(PyExc_TypeError,
6735 "'memo' attribute must be an UnpicklerMemoProxy object"
6736 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006737 return -1;
6738 }
6739
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006740 _Unpickler_MemoCleanup(self);
6741 self->memo_size = new_memo_size;
6742 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006743
6744 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006745
6746 error:
6747 if (new_memo_size) {
6748 i = new_memo_size;
6749 while (--i >= 0) {
6750 Py_XDECREF(new_memo[i]);
6751 }
6752 PyMem_FREE(new_memo);
6753 }
6754 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006755}
6756
6757static PyObject *
6758Unpickler_get_persload(UnpicklerObject *self)
6759{
6760 if (self->pers_func == NULL)
6761 PyErr_SetString(PyExc_AttributeError, "persistent_load");
6762 else
6763 Py_INCREF(self->pers_func);
6764 return self->pers_func;
6765}
6766
6767static int
6768Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
6769{
6770 PyObject *tmp;
6771
6772 if (value == NULL) {
6773 PyErr_SetString(PyExc_TypeError,
6774 "attribute deletion is not supported");
6775 return -1;
6776 }
6777 if (!PyCallable_Check(value)) {
6778 PyErr_SetString(PyExc_TypeError,
6779 "persistent_load must be a callable taking "
6780 "one argument");
6781 return -1;
6782 }
6783
6784 tmp = self->pers_func;
6785 Py_INCREF(value);
6786 self->pers_func = value;
6787 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
6788
6789 return 0;
6790}
6791
6792static PyGetSetDef Unpickler_getsets[] = {
6793 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
6794 {"persistent_load", (getter)Unpickler_get_persload,
6795 (setter)Unpickler_set_persload},
6796 {NULL}
6797};
6798
6799static PyTypeObject Unpickler_Type = {
6800 PyVarObject_HEAD_INIT(NULL, 0)
6801 "_pickle.Unpickler", /*tp_name*/
6802 sizeof(UnpicklerObject), /*tp_basicsize*/
6803 0, /*tp_itemsize*/
6804 (destructor)Unpickler_dealloc, /*tp_dealloc*/
6805 0, /*tp_print*/
6806 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006807 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00006808 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006809 0, /*tp_repr*/
6810 0, /*tp_as_number*/
6811 0, /*tp_as_sequence*/
6812 0, /*tp_as_mapping*/
6813 0, /*tp_hash*/
6814 0, /*tp_call*/
6815 0, /*tp_str*/
6816 0, /*tp_getattro*/
6817 0, /*tp_setattro*/
6818 0, /*tp_as_buffer*/
6819 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006820 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006821 (traverseproc)Unpickler_traverse, /*tp_traverse*/
6822 (inquiry)Unpickler_clear, /*tp_clear*/
6823 0, /*tp_richcompare*/
6824 0, /*tp_weaklistoffset*/
6825 0, /*tp_iter*/
6826 0, /*tp_iternext*/
6827 Unpickler_methods, /*tp_methods*/
6828 0, /*tp_members*/
6829 Unpickler_getsets, /*tp_getset*/
6830 0, /*tp_base*/
6831 0, /*tp_dict*/
6832 0, /*tp_descr_get*/
6833 0, /*tp_descr_set*/
6834 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006835 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006836 PyType_GenericAlloc, /*tp_alloc*/
6837 PyType_GenericNew, /*tp_new*/
6838 PyObject_GC_Del, /*tp_free*/
6839 0, /*tp_is_gc*/
6840};
6841
Larry Hastings61272b72014-01-07 12:41:53 -08006842/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006843
6844_pickle.dump
6845
6846 obj: object
6847 file: object
6848 protocol: object = NULL
6849 *
6850 fix_imports: bool = True
6851
6852Write a pickled representation of obj to the open file object file.
6853
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006854This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
6855be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006856
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006857The optional *protocol* argument tells the pickler to use the given
6858protocol supported protocols are 0, 1, 2, 3 and 4. The default
6859protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006860
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006861Specifying a negative protocol version selects the highest protocol
6862version supported. The higher the protocol used, the more recent the
6863version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006864
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006865The *file* argument must have a write() method that accepts a single
6866bytes argument. It can thus be a file object opened for binary
6867writing, a io.BytesIO instance, or any other custom object that meets
6868this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006869
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006870If *fix_imports* is True and protocol is less than 3, pickle will try
6871to map the new Python 3 names to the old module names used in Python
68722, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006873[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006874
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006875static PyObject *
6876_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports)
Larry Hastings581ee362014-01-28 05:00:08 -08006877/*[clinic end generated code: output=a606e626d553850d input=e9e5fdd48de92eae]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006878{
6879 PicklerObject *pickler = _Pickler_New();
6880
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006881 if (pickler == NULL)
6882 return NULL;
6883
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006884 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006885 goto error;
6886
6887 if (_Pickler_SetOutputStream(pickler, file) < 0)
6888 goto error;
6889
6890 if (dump(pickler, obj) < 0)
6891 goto error;
6892
6893 if (_Pickler_FlushToFile(pickler) < 0)
6894 goto error;
6895
6896 Py_DECREF(pickler);
6897 Py_RETURN_NONE;
6898
6899 error:
6900 Py_XDECREF(pickler);
6901 return NULL;
6902}
6903
Larry Hastings61272b72014-01-07 12:41:53 -08006904/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006905
6906_pickle.dumps
6907
6908 obj: object
6909 protocol: object = NULL
6910 *
6911 fix_imports: bool = True
6912
6913Return the pickled representation of the object as a bytes object.
6914
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006915The optional *protocol* argument tells the pickler to use the given
6916protocol; supported protocols are 0, 1, 2, 3 and 4. The default
6917protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006918
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006919Specifying a negative protocol version selects the highest protocol
6920version supported. The higher the protocol used, the more recent the
6921version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006922
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006923If *fix_imports* is True and *protocol* is less than 3, pickle will
6924try to map the new Python 3 names to the old module names used in
6925Python 2, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006926[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006927
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006928static PyObject *
6929_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol, int fix_imports)
Larry Hastings581ee362014-01-28 05:00:08 -08006930/*[clinic end generated code: output=777f0deefe5b88ee input=293dbeda181580b7]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006931{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006932 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006933 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006934
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006935 if (pickler == NULL)
6936 return NULL;
6937
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006938 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006939 goto error;
6940
6941 if (dump(pickler, obj) < 0)
6942 goto error;
6943
6944 result = _Pickler_GetString(pickler);
6945 Py_DECREF(pickler);
6946 return result;
6947
6948 error:
6949 Py_XDECREF(pickler);
6950 return NULL;
6951}
6952
Larry Hastings61272b72014-01-07 12:41:53 -08006953/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006954
6955_pickle.load
6956
6957 file: object
6958 *
6959 fix_imports: bool = True
6960 encoding: str = 'ASCII'
6961 errors: str = 'strict'
6962
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006963Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006964
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006965This is equivalent to ``Unpickler(file).load()``, but may be more
6966efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006967
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006968The protocol version of the pickle is detected automatically, so no
6969protocol argument is needed. Bytes past the pickled object's
6970representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006971
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006972The argument *file* must have two methods, a read() method that takes
6973an integer argument, and a readline() method that requires no
6974arguments. Both methods should return bytes. Thus *file* can be a
6975binary file object opened for reading, a io.BytesIO object, or any
6976other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006977
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006978Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6979which are used to control compatiblity support for pickle stream
6980generated by Python 2. If *fix_imports* is True, pickle will try to
6981map the old Python 2 names to the new names used in Python 3. The
6982*encoding* and *errors* tell pickle how to decode 8-bit string
6983instances pickled by Python 2; these default to 'ASCII' and 'strict',
6984respectively. The *encoding* can be 'bytes' to read these 8-bit
6985string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006986[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006987
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006988static PyObject *
6989_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports, const char *encoding, const char *errors)
Larry Hastings581ee362014-01-28 05:00:08 -08006990/*[clinic end generated code: output=568c61356c172654 input=da97372e38e510a6]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006991{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006992 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006993 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006994
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006995 if (unpickler == NULL)
6996 return NULL;
6997
6998 if (_Unpickler_SetInputStream(unpickler, file) < 0)
6999 goto error;
7000
7001 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7002 goto error;
7003
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007004 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007005
7006 result = load(unpickler);
7007 Py_DECREF(unpickler);
7008 return result;
7009
7010 error:
7011 Py_XDECREF(unpickler);
7012 return NULL;
7013}
7014
Larry Hastings61272b72014-01-07 12:41:53 -08007015/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007016
7017_pickle.loads
7018
7019 data: object
7020 *
7021 fix_imports: bool = True
7022 encoding: str = 'ASCII'
7023 errors: str = 'strict'
7024
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007025Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007026
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007027The protocol version of the pickle is detected automatically, so no
7028protocol argument is needed. Bytes past the pickled object's
7029representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007030
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007031Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
7032which are used to control compatiblity support for pickle stream
7033generated by Python 2. If *fix_imports* is True, pickle will try to
7034map the old Python 2 names to the new names used in Python 3. The
7035*encoding* and *errors* tell pickle how to decode 8-bit string
7036instances pickled by Python 2; these default to 'ASCII' and 'strict',
7037respectively. The *encoding* can be 'bytes' to read these 8-bit
7038string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007039[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007040
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007041static PyObject *
7042_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports, const char *encoding, const char *errors)
Larry Hastings581ee362014-01-28 05:00:08 -08007043/*[clinic end generated code: output=0b3845ad110b2522 input=f57f0fdaa2b4cb8b]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007044{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007045 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007046 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007047
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007048 if (unpickler == NULL)
7049 return NULL;
7050
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007051 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007052 goto error;
7053
7054 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7055 goto error;
7056
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007057 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007058
7059 result = load(unpickler);
7060 Py_DECREF(unpickler);
7061 return result;
7062
7063 error:
7064 Py_XDECREF(unpickler);
7065 return NULL;
7066}
7067
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007068static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007069 _PICKLE_DUMP_METHODDEF
7070 _PICKLE_DUMPS_METHODDEF
7071 _PICKLE_LOAD_METHODDEF
7072 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007073 {NULL, NULL} /* sentinel */
7074};
7075
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007076static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007077pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007078{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007079 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007080 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007081}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007082
Stefan Krahf483b0f2013-12-14 13:43:10 +01007083static void
7084pickle_free(PyObject *m)
7085{
7086 _Pickle_ClearState(_Pickle_GetState(m));
7087}
7088
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007089static int
7090pickle_traverse(PyObject *m, visitproc visit, void *arg)
7091{
7092 PickleState *st = _Pickle_GetState(m);
7093 Py_VISIT(st->PickleError);
7094 Py_VISIT(st->PicklingError);
7095 Py_VISIT(st->UnpicklingError);
7096 Py_VISIT(st->dispatch_table);
7097 Py_VISIT(st->extension_registry);
7098 Py_VISIT(st->extension_cache);
7099 Py_VISIT(st->inverted_registry);
7100 Py_VISIT(st->name_mapping_2to3);
7101 Py_VISIT(st->import_mapping_2to3);
7102 Py_VISIT(st->name_mapping_3to2);
7103 Py_VISIT(st->import_mapping_3to2);
7104 Py_VISIT(st->codecs_encode);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007105 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007106}
7107
7108static struct PyModuleDef _picklemodule = {
7109 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007110 "_pickle", /* m_name */
7111 pickle_module_doc, /* m_doc */
7112 sizeof(PickleState), /* m_size */
7113 pickle_methods, /* m_methods */
7114 NULL, /* m_reload */
7115 pickle_traverse, /* m_traverse */
7116 pickle_clear, /* m_clear */
7117 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007118};
7119
7120PyMODINIT_FUNC
7121PyInit__pickle(void)
7122{
7123 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007124 PickleState *st;
7125
7126 m = PyState_FindModule(&_picklemodule);
7127 if (m) {
7128 Py_INCREF(m);
7129 return m;
7130 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007131
7132 if (PyType_Ready(&Unpickler_Type) < 0)
7133 return NULL;
7134 if (PyType_Ready(&Pickler_Type) < 0)
7135 return NULL;
7136 if (PyType_Ready(&Pdata_Type) < 0)
7137 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007138 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7139 return NULL;
7140 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7141 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007142
7143 /* Create the module and add the functions. */
7144 m = PyModule_Create(&_picklemodule);
7145 if (m == NULL)
7146 return NULL;
7147
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007148 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007149 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7150 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007151 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007152 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7153 return NULL;
7154
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007155 st = _Pickle_GetState(m);
7156
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007157 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007158 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7159 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007160 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007161 st->PicklingError = \
7162 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7163 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007164 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007165 st->UnpicklingError = \
7166 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7167 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007168 return NULL;
7169
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007170 Py_INCREF(st->PickleError);
7171 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007172 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007173 Py_INCREF(st->PicklingError);
7174 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007175 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007176 Py_INCREF(st->UnpicklingError);
7177 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007178 return NULL;
7179
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007180 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007181 return NULL;
7182
7183 return m;
7184}