blob: a13eff32c3fff6a4249af6c9be7261e9d0d72c9d [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*/
378 0, /*tp_itemsize*/
379 (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;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200423 size_t allocated = (size_t)self->allocated;
424 size_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 */
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200428 if (new_allocated > (size_t)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;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200431 if (new_allocated > ((size_t)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;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200438 self->allocated = (Py_ssize_t)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{
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200853 size_t i;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800854
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 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001459 else if ((size_t)*value <= 0xffffffffUL) {
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 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001516 else if ((size_t)idx <= 0xffffffffUL) {
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 Pitroufce60ea2014-10-23 22:47:50 +02001538get_dotted_path(PyObject *obj, PyObject *name, int allow_qualname) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001539 _Py_static_string(PyId_dot, ".");
1540 _Py_static_string(PyId_locals, "<locals>");
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001541 PyObject *dotted_path;
1542 Py_ssize_t i, n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001543
1544 dotted_path = PyUnicode_Split(name, _PyUnicode_FromId(&PyId_dot), -1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001545 if (dotted_path == NULL)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001546 return NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001547 n = PyList_GET_SIZE(dotted_path);
1548 assert(n >= 1);
1549 if (!allow_qualname && n > 1) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001550 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 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001557 for (i = 0; i < n; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001558 PyObject *subpath = PyList_GET_ITEM(dotted_path, i);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001559 PyObject *result = PyUnicode_RichCompare(
1560 subpath, _PyUnicode_FromId(&PyId_locals), Py_EQ);
1561 int is_equal = (result == Py_True);
1562 assert(PyBool_Check(result));
1563 Py_DECREF(result);
1564 if (is_equal) {
1565 PyErr_Format(PyExc_AttributeError,
1566 "Can't get local attribute %R on %R", name, obj);
1567 Py_DECREF(dotted_path);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001568 return NULL;
1569 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001570 }
1571 return dotted_path;
1572}
1573
1574static PyObject *
1575get_deep_attribute(PyObject *obj, PyObject *names)
1576{
1577 Py_ssize_t i, n;
1578
1579 assert(PyList_CheckExact(names));
1580 Py_INCREF(obj);
1581 n = PyList_GET_SIZE(names);
1582 for (i = 0; i < n; i++) {
1583 PyObject *name = PyList_GET_ITEM(names, i);
1584 PyObject *tmp;
1585 tmp = PyObject_GetAttr(obj, name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001586 Py_DECREF(obj);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001587 if (tmp == NULL)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001588 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001589 obj = tmp;
1590 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001591 return obj;
1592}
1593
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001594static void
1595reformat_attribute_error(PyObject *obj, PyObject *name)
1596{
1597 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1598 PyErr_Clear();
1599 PyErr_Format(PyExc_AttributeError,
1600 "Can't get attribute %R on %R", name, obj);
1601 }
1602}
1603
1604
1605static PyObject *
1606getattribute(PyObject *obj, PyObject *name, int allow_qualname)
1607{
1608 PyObject *dotted_path, *attr;
1609
1610 dotted_path = get_dotted_path(obj, name, allow_qualname);
1611 if (dotted_path == NULL)
1612 return NULL;
1613 attr = get_deep_attribute(obj, dotted_path);
1614 Py_DECREF(dotted_path);
1615 if (attr == NULL)
1616 reformat_attribute_error(obj, name);
1617 return attr;
1618}
1619
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001620static PyObject *
1621whichmodule(PyObject *global, PyObject *global_name, int allow_qualname)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001622{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001623 PyObject *module_name;
1624 PyObject *modules_dict;
1625 PyObject *module;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001626 Py_ssize_t i;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001627 _Py_IDENTIFIER(__module__);
1628 _Py_IDENTIFIER(modules);
1629 _Py_IDENTIFIER(__main__);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001630 PyObject *dotted_path;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001631
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001632 module_name = _PyObject_GetAttrId(global, &PyId___module__);
1633
1634 if (module_name == NULL) {
1635 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001636 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001637 PyErr_Clear();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001638 }
1639 else {
1640 /* In some rare cases (e.g., bound methods of extension types),
1641 __module__ can be None. If it is so, then search sys.modules for
1642 the module of global. */
1643 if (module_name != Py_None)
1644 return module_name;
1645 Py_CLEAR(module_name);
1646 }
1647 assert(module_name == NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001648
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001649 /* Fallback on walking sys.modules */
Victor Stinnerbb520202013-11-06 22:40:41 +01001650 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02001651 if (modules_dict == NULL) {
1652 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001653 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02001654 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001655
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001656 dotted_path = get_dotted_path(module, global_name, allow_qualname);
1657 if (dotted_path == NULL)
1658 return NULL;
1659
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001660 i = 0;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001661 while (PyDict_Next(modules_dict, &i, &module_name, &module)) {
1662 PyObject *candidate;
1663 if (PyUnicode_Check(module_name) &&
1664 !PyUnicode_CompareWithASCIIString(module_name, "__main__"))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001665 continue;
1666 if (module == Py_None)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001667 continue;
1668
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001669 candidate = get_deep_attribute(module, dotted_path);
1670 if (candidate == NULL) {
1671 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1672 Py_DECREF(dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001673 return NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001674 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001675 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001676 continue;
1677 }
1678
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001679 if (candidate == global) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001680 Py_INCREF(module_name);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001681 Py_DECREF(dotted_path);
1682 Py_DECREF(candidate);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001683 return module_name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001684 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001685 Py_DECREF(candidate);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001686 }
1687
1688 /* If no module is found, use __main__. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001689 module_name = _PyUnicode_FromId(&PyId___main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001690 Py_INCREF(module_name);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001691 Py_DECREF(dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001692 return module_name;
1693}
1694
1695/* fast_save_enter() and fast_save_leave() are guards against recursive
1696 objects when Pickler is used with the "fast mode" (i.e., with object
1697 memoization disabled). If the nesting of a list or dict object exceed
1698 FAST_NESTING_LIMIT, these guards will start keeping an internal
1699 reference to the seen list or dict objects and check whether these objects
1700 are recursive. These are not strictly necessary, since save() has a
1701 hard-coded recursion limit, but they give a nicer error message than the
1702 typical RuntimeError. */
1703static int
1704fast_save_enter(PicklerObject *self, PyObject *obj)
1705{
1706 /* if fast_nesting < 0, we're doing an error exit. */
1707 if (++self->fast_nesting >= FAST_NESTING_LIMIT) {
1708 PyObject *key = NULL;
1709 if (self->fast_memo == NULL) {
1710 self->fast_memo = PyDict_New();
1711 if (self->fast_memo == NULL) {
1712 self->fast_nesting = -1;
1713 return 0;
1714 }
1715 }
1716 key = PyLong_FromVoidPtr(obj);
1717 if (key == NULL)
1718 return 0;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001719 if (PyDict_GetItemWithError(self->fast_memo, key)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001720 Py_DECREF(key);
1721 PyErr_Format(PyExc_ValueError,
1722 "fast mode: can't pickle cyclic objects "
1723 "including object type %.200s at %p",
1724 obj->ob_type->tp_name, obj);
1725 self->fast_nesting = -1;
1726 return 0;
1727 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001728 if (PyErr_Occurred()) {
1729 return 0;
1730 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001731 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
1732 Py_DECREF(key);
1733 self->fast_nesting = -1;
1734 return 0;
1735 }
1736 Py_DECREF(key);
1737 }
1738 return 1;
1739}
1740
1741static int
1742fast_save_leave(PicklerObject *self, PyObject *obj)
1743{
1744 if (self->fast_nesting-- >= FAST_NESTING_LIMIT) {
1745 PyObject *key = PyLong_FromVoidPtr(obj);
1746 if (key == NULL)
1747 return 0;
1748 if (PyDict_DelItem(self->fast_memo, key) < 0) {
1749 Py_DECREF(key);
1750 return 0;
1751 }
1752 Py_DECREF(key);
1753 }
1754 return 1;
1755}
1756
1757static int
1758save_none(PicklerObject *self, PyObject *obj)
1759{
1760 const char none_op = NONE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001761 if (_Pickler_Write(self, &none_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001762 return -1;
1763
1764 return 0;
1765}
1766
1767static int
1768save_bool(PicklerObject *self, PyObject *obj)
1769{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001770 if (self->proto >= 2) {
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001771 const char bool_op = (obj == Py_True) ? NEWTRUE : NEWFALSE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001772 if (_Pickler_Write(self, &bool_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001773 return -1;
1774 }
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001775 else {
1776 /* These aren't opcodes -- they're ways to pickle bools before protocol 2
1777 * so that unpicklers written before bools were introduced unpickle them
1778 * as ints, but unpicklers after can recognize that bools were intended.
1779 * Note that protocol 2 added direct ways to pickle bools.
1780 */
1781 const char *bool_str = (obj == Py_True) ? "I01\n" : "I00\n";
1782 if (_Pickler_Write(self, bool_str, strlen(bool_str)) < 0)
1783 return -1;
1784 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001785 return 0;
1786}
1787
1788static int
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001789save_long(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001790{
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001791 PyObject *repr = NULL;
1792 Py_ssize_t size;
1793 long val;
1794 int status = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001795
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001796 const char long_op = LONG;
1797
1798 val= PyLong_AsLong(obj);
1799 if (val == -1 && PyErr_Occurred()) {
1800 /* out of range for int pickling */
1801 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001802 }
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001803 else if (self->bin &&
1804 (sizeof(long) <= 4 ||
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001805 (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1)))) {
Larry Hastings61272b72014-01-07 12:41:53 -08001806 /* result fits in a signed 4-byte integer.
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001807
1808 Note: we can't use -0x80000000L in the above condition because some
1809 compilers (e.g., MSVC) will promote 0x80000000L to an unsigned type
1810 before applying the unary minus when sizeof(long) <= 4. The
1811 resulting value stays unsigned which is commonly not what we want,
1812 so MSVC happily warns us about it. However, that result would have
1813 been fine because we guard for sizeof(long) <= 4 which turns the
1814 condition true in that particular case. */
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001815 char pdata[32];
1816 Py_ssize_t len = 0;
1817
1818 pdata[1] = (unsigned char)(val & 0xff);
1819 pdata[2] = (unsigned char)((val >> 8) & 0xff);
1820 pdata[3] = (unsigned char)((val >> 16) & 0xff);
1821 pdata[4] = (unsigned char)((val >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001822
1823 if ((pdata[4] == 0) && (pdata[3] == 0)) {
1824 if (pdata[2] == 0) {
1825 pdata[0] = BININT1;
1826 len = 2;
1827 }
1828 else {
1829 pdata[0] = BININT2;
1830 len = 3;
1831 }
1832 }
1833 else {
1834 pdata[0] = BININT;
1835 len = 5;
1836 }
1837
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001838 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001839 return -1;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001840
1841 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001842 }
1843
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001844 if (self->proto >= 2) {
1845 /* Linear-time pickling. */
1846 size_t nbits;
1847 size_t nbytes;
1848 unsigned char *pdata;
1849 char header[5];
1850 int i;
1851 int sign = _PyLong_Sign(obj);
1852
1853 if (sign == 0) {
1854 header[0] = LONG1;
1855 header[1] = 0; /* It's 0 -- an empty bytestring. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001856 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001857 goto error;
1858 return 0;
1859 }
1860 nbits = _PyLong_NumBits(obj);
1861 if (nbits == (size_t)-1 && PyErr_Occurred())
1862 goto error;
1863 /* How many bytes do we need? There are nbits >> 3 full
1864 * bytes of data, and nbits & 7 leftover bits. If there
1865 * are any leftover bits, then we clearly need another
1866 * byte. Wnat's not so obvious is that we *probably*
1867 * need another byte even if there aren't any leftovers:
1868 * the most-significant bit of the most-significant byte
1869 * acts like a sign bit, and it's usually got a sense
Serhiy Storchaka95949422013-08-27 19:40:23 +03001870 * opposite of the one we need. The exception is ints
1871 * of the form -(2**(8*j-1)) for j > 0. Such an int is
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001872 * its own 256's-complement, so has the right sign bit
1873 * even without the extra byte. That's a pain to check
1874 * for in advance, though, so we always grab an extra
1875 * byte at the start, and cut it back later if possible.
1876 */
1877 nbytes = (nbits >> 3) + 1;
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001878 if (nbytes > 0x7fffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001879 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03001880 "int too large to pickle");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001881 goto error;
1882 }
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001883 repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001884 if (repr == NULL)
1885 goto error;
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001886 pdata = (unsigned char *)PyBytes_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001887 i = _PyLong_AsByteArray((PyLongObject *)obj,
1888 pdata, nbytes,
1889 1 /* little endian */ , 1 /* signed */ );
1890 if (i < 0)
1891 goto error;
Serhiy Storchaka95949422013-08-27 19:40:23 +03001892 /* If the int is negative, this may be a byte more than
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001893 * needed. This is so iff the MSB is all redundant sign
1894 * bits.
1895 */
1896 if (sign < 0 &&
Victor Stinner121aab42011-09-29 23:40:53 +02001897 nbytes > 1 &&
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001898 pdata[nbytes - 1] == 0xff &&
1899 (pdata[nbytes - 2] & 0x80) != 0) {
1900 nbytes--;
1901 }
1902
1903 if (nbytes < 256) {
1904 header[0] = LONG1;
1905 header[1] = (unsigned char)nbytes;
1906 size = 2;
1907 }
1908 else {
1909 header[0] = LONG4;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001910 size = (Py_ssize_t) nbytes;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001911 for (i = 1; i < 5; i++) {
1912 header[i] = (unsigned char)(size & 0xff);
1913 size >>= 8;
1914 }
1915 size = 5;
1916 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001917 if (_Pickler_Write(self, header, size) < 0 ||
1918 _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001919 goto error;
1920 }
1921 else {
1922 char *string;
1923
Mark Dickinson8dd05142009-01-20 20:43:58 +00001924 /* proto < 2: write the repr and newline. This is quadratic-time (in
1925 the number of digits), in both directions. We add a trailing 'L'
1926 to the repr, for compatibility with Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001927
1928 repr = PyObject_Repr(obj);
1929 if (repr == NULL)
1930 goto error;
1931
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001932 string = _PyUnicode_AsStringAndSize(repr, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001933 if (string == NULL)
1934 goto error;
1935
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001936 if (_Pickler_Write(self, &long_op, 1) < 0 ||
1937 _Pickler_Write(self, string, size) < 0 ||
1938 _Pickler_Write(self, "L\n", 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001939 goto error;
1940 }
1941
1942 if (0) {
1943 error:
1944 status = -1;
1945 }
1946 Py_XDECREF(repr);
1947
1948 return status;
1949}
1950
1951static int
1952save_float(PicklerObject *self, PyObject *obj)
1953{
1954 double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj);
1955
1956 if (self->bin) {
1957 char pdata[9];
1958 pdata[0] = BINFLOAT;
1959 if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0)
1960 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001961 if (_Pickler_Write(self, pdata, 9) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001962 return -1;
Victor Stinner121aab42011-09-29 23:40:53 +02001963 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001964 else {
Eric Smith0923d1d2009-04-16 20:16:10 +00001965 int result = -1;
1966 char *buf = NULL;
1967 char op = FLOAT;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001968
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001969 if (_Pickler_Write(self, &op, 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001970 goto done;
1971
Mark Dickinson3e09f432009-04-17 08:41:23 +00001972 buf = PyOS_double_to_string(x, 'g', 17, 0, NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +00001973 if (!buf) {
1974 PyErr_NoMemory();
1975 goto done;
1976 }
1977
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001978 if (_Pickler_Write(self, buf, strlen(buf)) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001979 goto done;
1980
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001981 if (_Pickler_Write(self, "\n", 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001982 goto done;
1983
1984 result = 0;
1985done:
1986 PyMem_Free(buf);
1987 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001988 }
1989
1990 return 0;
1991}
1992
1993static int
1994save_bytes(PicklerObject *self, PyObject *obj)
1995{
1996 if (self->proto < 3) {
1997 /* Older pickle protocols do not have an opcode for pickling bytes
1998 objects. Therefore, we need to fake the copy protocol (i.e.,
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001999 the __reduce__ method) to permit bytes object unpickling.
2000
2001 Here we use a hack to be compatible with Python 2. Since in Python
2002 2 'bytes' is just an alias for 'str' (which has different
2003 parameters than the actual bytes object), we use codecs.encode
2004 to create the appropriate 'str' object when unpickled using
2005 Python 2 *and* the appropriate 'bytes' object when unpickled
2006 using Python 3. Again this is a hack and we don't need to do this
2007 with newer protocols. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002008 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002009 int status;
2010
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002011 if (PyBytes_GET_SIZE(obj) == 0) {
2012 reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type);
2013 }
2014 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002015 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002016 PyObject *unicode_str =
2017 PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj),
2018 PyBytes_GET_SIZE(obj),
2019 "strict");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002020 _Py_IDENTIFIER(latin1);
2021
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002022 if (unicode_str == NULL)
2023 return -1;
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002024 reduce_value = Py_BuildValue("(O(OO))",
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002025 st->codecs_encode, unicode_str,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002026 _PyUnicode_FromId(&PyId_latin1));
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002027 Py_DECREF(unicode_str);
2028 }
2029
2030 if (reduce_value == NULL)
2031 return -1;
2032
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002033 /* save_reduce() will memoize the object automatically. */
2034 status = save_reduce(self, reduce_value, obj);
2035 Py_DECREF(reduce_value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002036 return status;
2037 }
2038 else {
2039 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002040 char header[9];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002041 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002042
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002043 size = PyBytes_GET_SIZE(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002044 if (size < 0)
2045 return -1;
2046
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002047 if (size <= 0xff) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002048 header[0] = SHORT_BINBYTES;
2049 header[1] = (unsigned char)size;
2050 len = 2;
2051 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03002052 else if ((size_t)size <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002053 header[0] = BINBYTES;
2054 header[1] = (unsigned char)(size & 0xff);
2055 header[2] = (unsigned char)((size >> 8) & 0xff);
2056 header[3] = (unsigned char)((size >> 16) & 0xff);
2057 header[4] = (unsigned char)((size >> 24) & 0xff);
2058 len = 5;
2059 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002060 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002061 header[0] = BINBYTES8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002062 _write_size64(header + 1, size);
Alexandre Vassalotti6e73ff12013-12-05 19:29:32 -08002063 len = 9;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002064 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002065 else {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002066 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakaf8def282013-02-16 17:29:56 +02002067 "cannot serialize a bytes object larger than 4 GiB");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002068 return -1; /* string too large */
2069 }
2070
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002071 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002072 return -1;
2073
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002074 if (_Pickler_Write(self, PyBytes_AS_STRING(obj), size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002075 return -1;
2076
2077 if (memo_put(self, obj) < 0)
2078 return -1;
2079
2080 return 0;
2081 }
2082}
2083
2084/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
2085 backslash and newline characters to \uXXXX escapes. */
2086static PyObject *
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002087raw_unicode_escape(PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002088{
Victor Stinner7270b7f2014-08-17 21:14:46 +02002089 PyObject *repr;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002090 char *p;
Victor Stinner049e5092014-08-17 22:20:00 +02002091 Py_ssize_t i, size;
2092 size_t expandsize;
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002093 void *data;
2094 unsigned int kind;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002095
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002096 if (PyUnicode_READY(obj))
2097 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002098
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002099 size = PyUnicode_GET_LENGTH(obj);
2100 data = PyUnicode_DATA(obj);
2101 kind = PyUnicode_KIND(obj);
2102 if (kind == PyUnicode_4BYTE_KIND)
2103 expandsize = 10;
2104 else
2105 expandsize = 6;
Victor Stinner121aab42011-09-29 23:40:53 +02002106
Victor Stinner049e5092014-08-17 22:20:00 +02002107 if ((size_t)size > (size_t)PY_SSIZE_T_MAX / expandsize)
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002108 return PyErr_NoMemory();
Victor Stinner7270b7f2014-08-17 21:14:46 +02002109 repr = PyBytes_FromStringAndSize(NULL, expandsize * size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002110 if (repr == NULL)
2111 return NULL;
2112 if (size == 0)
Victor Stinner7270b7f2014-08-17 21:14:46 +02002113 return repr;
2114 assert(Py_REFCNT(repr) == 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002115
Victor Stinner7270b7f2014-08-17 21:14:46 +02002116 p = PyBytes_AS_STRING(repr);
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002117 for (i=0; i < size; i++) {
2118 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002119 /* Map 32-bit characters to '\Uxxxxxxxx' */
2120 if (ch >= 0x10000) {
2121 *p++ = '\\';
2122 *p++ = 'U';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002123 *p++ = Py_hexdigits[(ch >> 28) & 0xf];
2124 *p++ = Py_hexdigits[(ch >> 24) & 0xf];
2125 *p++ = Py_hexdigits[(ch >> 20) & 0xf];
2126 *p++ = Py_hexdigits[(ch >> 16) & 0xf];
2127 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2128 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2129 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2130 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002131 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002132 /* Map 16-bit characters to '\uxxxx' */
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002133 else if (ch >= 256 || ch == '\\' || ch == '\n') {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002134 *p++ = '\\';
2135 *p++ = 'u';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002136 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2137 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2138 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2139 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002140 }
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002141 /* Copy everything else as-is */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002142 else
2143 *p++ = (char) ch;
2144 }
Victor Stinner7270b7f2014-08-17 21:14:46 +02002145 size = p - PyBytes_AS_STRING(repr);
2146 if (_PyBytes_Resize(&repr, size) < 0)
2147 return NULL;
2148 return repr;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002149}
2150
2151static int
Antoine Pitrou299978d2013-04-07 17:38:11 +02002152write_utf8(PicklerObject *self, char *data, Py_ssize_t size)
2153{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002154 char header[9];
2155 Py_ssize_t len;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002156
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002157 assert(size >= 0);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002158 if (size <= 0xff && self->proto >= 4) {
2159 header[0] = SHORT_BINUNICODE;
2160 header[1] = (unsigned char)(size & 0xff);
2161 len = 2;
2162 }
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002163 else if ((size_t)size <= 0xffffffffUL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002164 header[0] = BINUNICODE;
2165 header[1] = (unsigned char)(size & 0xff);
2166 header[2] = (unsigned char)((size >> 8) & 0xff);
2167 header[3] = (unsigned char)((size >> 16) & 0xff);
2168 header[4] = (unsigned char)((size >> 24) & 0xff);
2169 len = 5;
2170 }
2171 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002172 header[0] = BINUNICODE8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002173 _write_size64(header + 1, size);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002174 len = 9;
2175 }
2176 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002177 PyErr_SetString(PyExc_OverflowError,
Antoine Pitrou4b7b0f02013-04-07 23:46:52 +02002178 "cannot serialize a string larger than 4GiB");
Antoine Pitrou299978d2013-04-07 17:38:11 +02002179 return -1;
2180 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002181
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002182 if (_Pickler_Write(self, header, len) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002183 return -1;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002184 if (_Pickler_Write(self, data, size) < 0)
2185 return -1;
2186
2187 return 0;
2188}
2189
2190static int
2191write_unicode_binary(PicklerObject *self, PyObject *obj)
2192{
2193 PyObject *encoded = NULL;
2194 Py_ssize_t size;
2195 char *data;
2196 int r;
2197
2198 if (PyUnicode_READY(obj))
2199 return -1;
2200
2201 data = PyUnicode_AsUTF8AndSize(obj, &size);
2202 if (data != NULL)
2203 return write_utf8(self, data, size);
2204
2205 /* Issue #8383: for strings with lone surrogates, fallback on the
2206 "surrogatepass" error handler. */
2207 PyErr_Clear();
2208 encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
2209 if (encoded == NULL)
2210 return -1;
2211
2212 r = write_utf8(self, PyBytes_AS_STRING(encoded),
2213 PyBytes_GET_SIZE(encoded));
2214 Py_DECREF(encoded);
2215 return r;
2216}
2217
2218static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002219save_unicode(PicklerObject *self, PyObject *obj)
2220{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002221 if (self->bin) {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002222 if (write_unicode_binary(self, obj) < 0)
2223 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002224 }
2225 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002226 PyObject *encoded;
2227 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002228 const char unicode_op = UNICODE;
2229
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002230 encoded = raw_unicode_escape(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002231 if (encoded == NULL)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002232 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002233
Antoine Pitrou299978d2013-04-07 17:38:11 +02002234 if (_Pickler_Write(self, &unicode_op, 1) < 0) {
2235 Py_DECREF(encoded);
2236 return -1;
2237 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002238
2239 size = PyBytes_GET_SIZE(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002240 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
2241 Py_DECREF(encoded);
2242 return -1;
2243 }
2244 Py_DECREF(encoded);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002245
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002246 if (_Pickler_Write(self, "\n", 1) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002247 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002248 }
2249 if (memo_put(self, obj) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002250 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002251
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002252 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002253}
2254
2255/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
2256static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002257store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002258{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002259 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002260
2261 assert(PyTuple_Size(t) == len);
2262
2263 for (i = 0; i < len; i++) {
2264 PyObject *element = PyTuple_GET_ITEM(t, i);
2265
2266 if (element == NULL)
2267 return -1;
2268 if (save(self, element, 0) < 0)
2269 return -1;
2270 }
2271
2272 return 0;
2273}
2274
2275/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2276 * used across protocols to minimize the space needed to pickle them.
2277 * Tuples are also the only builtin immutable type that can be recursive
2278 * (a tuple can be reached from itself), and that requires some subtle
2279 * magic so that it works in all cases. IOW, this is a long routine.
2280 */
2281static int
2282save_tuple(PicklerObject *self, PyObject *obj)
2283{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002284 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002285
2286 const char mark_op = MARK;
2287 const char tuple_op = TUPLE;
2288 const char pop_op = POP;
2289 const char pop_mark_op = POP_MARK;
2290 const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2291
2292 if ((len = PyTuple_Size(obj)) < 0)
2293 return -1;
2294
2295 if (len == 0) {
2296 char pdata[2];
2297
2298 if (self->proto) {
2299 pdata[0] = EMPTY_TUPLE;
2300 len = 1;
2301 }
2302 else {
2303 pdata[0] = MARK;
2304 pdata[1] = TUPLE;
2305 len = 2;
2306 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002307 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002308 return -1;
2309 return 0;
2310 }
2311
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002312 /* The tuple isn't in the memo now. If it shows up there after
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002313 * saving the tuple elements, the tuple must be recursive, in
2314 * which case we'll pop everything we put on the stack, and fetch
2315 * its value from the memo.
2316 */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002317 if (len <= 3 && self->proto >= 2) {
2318 /* Use TUPLE{1,2,3} opcodes. */
2319 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002320 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002321
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002322 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002323 /* pop the len elements */
2324 for (i = 0; i < len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002325 if (_Pickler_Write(self, &pop_op, 1) < 0)
2326 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002327 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002328 if (memo_get(self, obj) < 0)
2329 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002330
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002331 return 0;
2332 }
2333 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002334 if (_Pickler_Write(self, len2opcode + len, 1) < 0)
2335 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002336 }
2337 goto memoize;
2338 }
2339
2340 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2341 * Generate MARK e1 e2 ... TUPLE
2342 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002343 if (_Pickler_Write(self, &mark_op, 1) < 0)
2344 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002345
2346 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002347 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002348
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002349 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002350 /* pop the stack stuff we pushed */
2351 if (self->bin) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002352 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2353 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002354 }
2355 else {
2356 /* Note that we pop one more than len, to remove
2357 * the MARK too.
2358 */
2359 for (i = 0; i <= len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002360 if (_Pickler_Write(self, &pop_op, 1) < 0)
2361 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002362 }
2363 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002364 if (memo_get(self, obj) < 0)
2365 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002366
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002367 return 0;
2368 }
2369 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002370 if (_Pickler_Write(self, &tuple_op, 1) < 0)
2371 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002372 }
2373
2374 memoize:
2375 if (memo_put(self, obj) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002376 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002377
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002378 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002379}
2380
2381/* iter is an iterator giving items, and we batch up chunks of
2382 * MARK item item ... item APPENDS
2383 * opcode sequences. Calling code should have arranged to first create an
2384 * empty list, or list-like object, for the APPENDS to operate on.
2385 * Returns 0 on success, <0 on error.
2386 */
2387static int
2388batch_list(PicklerObject *self, PyObject *iter)
2389{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002390 PyObject *obj = NULL;
2391 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002392 int i, n;
2393
2394 const char mark_op = MARK;
2395 const char append_op = APPEND;
2396 const char appends_op = APPENDS;
2397
2398 assert(iter != NULL);
2399
2400 /* XXX: I think this function could be made faster by avoiding the
2401 iterator interface and fetching objects directly from list using
2402 PyList_GET_ITEM.
2403 */
2404
2405 if (self->proto == 0) {
2406 /* APPENDS isn't available; do one at a time. */
2407 for (;;) {
2408 obj = PyIter_Next(iter);
2409 if (obj == NULL) {
2410 if (PyErr_Occurred())
2411 return -1;
2412 break;
2413 }
2414 i = save(self, obj, 0);
2415 Py_DECREF(obj);
2416 if (i < 0)
2417 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002418 if (_Pickler_Write(self, &append_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002419 return -1;
2420 }
2421 return 0;
2422 }
2423
2424 /* proto > 0: write in batches of BATCHSIZE. */
2425 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002426 /* Get first item */
2427 firstitem = PyIter_Next(iter);
2428 if (firstitem == NULL) {
2429 if (PyErr_Occurred())
2430 goto error;
2431
2432 /* nothing more to add */
2433 break;
2434 }
2435
2436 /* Try to get a second item */
2437 obj = PyIter_Next(iter);
2438 if (obj == NULL) {
2439 if (PyErr_Occurred())
2440 goto error;
2441
2442 /* Only one item to write */
2443 if (save(self, firstitem, 0) < 0)
2444 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002445 if (_Pickler_Write(self, &append_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002446 goto error;
2447 Py_CLEAR(firstitem);
2448 break;
2449 }
2450
2451 /* More than one item to write */
2452
2453 /* Pump out MARK, items, APPENDS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002454 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002455 goto error;
2456
2457 if (save(self, firstitem, 0) < 0)
2458 goto error;
2459 Py_CLEAR(firstitem);
2460 n = 1;
2461
2462 /* Fetch and save up to BATCHSIZE items */
2463 while (obj) {
2464 if (save(self, obj, 0) < 0)
2465 goto error;
2466 Py_CLEAR(obj);
2467 n += 1;
2468
2469 if (n == BATCHSIZE)
2470 break;
2471
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002472 obj = PyIter_Next(iter);
2473 if (obj == NULL) {
2474 if (PyErr_Occurred())
2475 goto error;
2476 break;
2477 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002478 }
2479
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002480 if (_Pickler_Write(self, &appends_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002481 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002482
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002483 } while (n == BATCHSIZE);
2484 return 0;
2485
2486 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002487 Py_XDECREF(firstitem);
2488 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002489 return -1;
2490}
2491
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002492/* This is a variant of batch_list() above, specialized for lists (with no
2493 * support for list subclasses). Like batch_list(), we batch up chunks of
2494 * MARK item item ... item APPENDS
2495 * opcode sequences. Calling code should have arranged to first create an
2496 * empty list, or list-like object, for the APPENDS to operate on.
2497 * Returns 0 on success, -1 on error.
2498 *
2499 * This version is considerably faster than batch_list(), if less general.
2500 *
2501 * Note that this only works for protocols > 0.
2502 */
2503static int
2504batch_list_exact(PicklerObject *self, PyObject *obj)
2505{
2506 PyObject *item = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002507 Py_ssize_t this_batch, total;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002508
2509 const char append_op = APPEND;
2510 const char appends_op = APPENDS;
2511 const char mark_op = MARK;
2512
2513 assert(obj != NULL);
2514 assert(self->proto > 0);
2515 assert(PyList_CheckExact(obj));
2516
2517 if (PyList_GET_SIZE(obj) == 1) {
2518 item = PyList_GET_ITEM(obj, 0);
2519 if (save(self, item, 0) < 0)
2520 return -1;
2521 if (_Pickler_Write(self, &append_op, 1) < 0)
2522 return -1;
2523 return 0;
2524 }
2525
2526 /* Write in batches of BATCHSIZE. */
2527 total = 0;
2528 do {
2529 this_batch = 0;
2530 if (_Pickler_Write(self, &mark_op, 1) < 0)
2531 return -1;
2532 while (total < PyList_GET_SIZE(obj)) {
2533 item = PyList_GET_ITEM(obj, total);
2534 if (save(self, item, 0) < 0)
2535 return -1;
2536 total++;
2537 if (++this_batch == BATCHSIZE)
2538 break;
2539 }
2540 if (_Pickler_Write(self, &appends_op, 1) < 0)
2541 return -1;
2542
2543 } while (total < PyList_GET_SIZE(obj));
2544
2545 return 0;
2546}
2547
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002548static int
2549save_list(PicklerObject *self, PyObject *obj)
2550{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002551 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002552 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002553 int status = 0;
2554
2555 if (self->fast && !fast_save_enter(self, obj))
2556 goto error;
2557
2558 /* Create an empty list. */
2559 if (self->bin) {
2560 header[0] = EMPTY_LIST;
2561 len = 1;
2562 }
2563 else {
2564 header[0] = MARK;
2565 header[1] = LIST;
2566 len = 2;
2567 }
2568
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002569 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002570 goto error;
2571
2572 /* Get list length, and bow out early if empty. */
2573 if ((len = PyList_Size(obj)) < 0)
2574 goto error;
2575
2576 if (memo_put(self, obj) < 0)
2577 goto error;
2578
2579 if (len != 0) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002580 /* Materialize the list elements. */
2581 if (PyList_CheckExact(obj) && self->proto > 0) {
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002582 if (Py_EnterRecursiveCall(" while pickling an object"))
2583 goto error;
2584 status = batch_list_exact(self, obj);
2585 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002586 } else {
2587 PyObject *iter = PyObject_GetIter(obj);
2588 if (iter == NULL)
2589 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002590
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002591 if (Py_EnterRecursiveCall(" while pickling an object")) {
2592 Py_DECREF(iter);
2593 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002594 }
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002595 status = batch_list(self, iter);
2596 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002597 Py_DECREF(iter);
2598 }
2599 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002600 if (0) {
2601 error:
2602 status = -1;
2603 }
2604
2605 if (self->fast && !fast_save_leave(self, obj))
2606 status = -1;
2607
2608 return status;
2609}
2610
2611/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
2612 * MARK key value ... key value SETITEMS
2613 * opcode sequences. Calling code should have arranged to first create an
2614 * empty dict, or dict-like object, for the SETITEMS to operate on.
2615 * Returns 0 on success, <0 on error.
2616 *
2617 * This is very much like batch_list(). The difference between saving
2618 * elements directly, and picking apart two-tuples, is so long-winded at
2619 * the C level, though, that attempts to combine these routines were too
2620 * ugly to bear.
2621 */
2622static int
2623batch_dict(PicklerObject *self, PyObject *iter)
2624{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002625 PyObject *obj = NULL;
2626 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002627 int i, n;
2628
2629 const char mark_op = MARK;
2630 const char setitem_op = SETITEM;
2631 const char setitems_op = SETITEMS;
2632
2633 assert(iter != NULL);
2634
2635 if (self->proto == 0) {
2636 /* SETITEMS isn't available; do one at a time. */
2637 for (;;) {
2638 obj = PyIter_Next(iter);
2639 if (obj == NULL) {
2640 if (PyErr_Occurred())
2641 return -1;
2642 break;
2643 }
2644 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2645 PyErr_SetString(PyExc_TypeError, "dict items "
2646 "iterator must return 2-tuples");
2647 return -1;
2648 }
2649 i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
2650 if (i >= 0)
2651 i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
2652 Py_DECREF(obj);
2653 if (i < 0)
2654 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002655 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002656 return -1;
2657 }
2658 return 0;
2659 }
2660
2661 /* proto > 0: write in batches of BATCHSIZE. */
2662 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002663 /* Get first item */
2664 firstitem = PyIter_Next(iter);
2665 if (firstitem == NULL) {
2666 if (PyErr_Occurred())
2667 goto error;
2668
2669 /* nothing more to add */
2670 break;
2671 }
2672 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
2673 PyErr_SetString(PyExc_TypeError, "dict items "
2674 "iterator must return 2-tuples");
2675 goto error;
2676 }
2677
2678 /* Try to get a second item */
2679 obj = PyIter_Next(iter);
2680 if (obj == NULL) {
2681 if (PyErr_Occurred())
2682 goto error;
2683
2684 /* Only one item to write */
2685 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2686 goto error;
2687 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2688 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002689 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002690 goto error;
2691 Py_CLEAR(firstitem);
2692 break;
2693 }
2694
2695 /* More than one item to write */
2696
2697 /* Pump out MARK, items, SETITEMS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002698 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002699 goto error;
2700
2701 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2702 goto error;
2703 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2704 goto error;
2705 Py_CLEAR(firstitem);
2706 n = 1;
2707
2708 /* Fetch and save up to BATCHSIZE items */
2709 while (obj) {
2710 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2711 PyErr_SetString(PyExc_TypeError, "dict items "
2712 "iterator must return 2-tuples");
2713 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002714 }
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002715 if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
2716 save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0)
2717 goto error;
2718 Py_CLEAR(obj);
2719 n += 1;
2720
2721 if (n == BATCHSIZE)
2722 break;
2723
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002724 obj = PyIter_Next(iter);
2725 if (obj == NULL) {
2726 if (PyErr_Occurred())
2727 goto error;
2728 break;
2729 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002730 }
2731
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002732 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002733 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002734
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002735 } while (n == BATCHSIZE);
2736 return 0;
2737
2738 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002739 Py_XDECREF(firstitem);
2740 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002741 return -1;
2742}
2743
Collin Winter5c9b02d2009-05-25 05:43:30 +00002744/* This is a variant of batch_dict() above that specializes for dicts, with no
2745 * support for dict subclasses. Like batch_dict(), we batch up chunks of
2746 * MARK key value ... key value SETITEMS
2747 * opcode sequences. Calling code should have arranged to first create an
2748 * empty dict, or dict-like object, for the SETITEMS to operate on.
2749 * Returns 0 on success, -1 on error.
2750 *
2751 * Note that this currently doesn't work for protocol 0.
2752 */
2753static int
2754batch_dict_exact(PicklerObject *self, PyObject *obj)
2755{
2756 PyObject *key = NULL, *value = NULL;
2757 int i;
2758 Py_ssize_t dict_size, ppos = 0;
2759
Alexandre Vassalottif70b1292009-05-25 18:00:52 +00002760 const char mark_op = MARK;
2761 const char setitem_op = SETITEM;
2762 const char setitems_op = SETITEMS;
Collin Winter5c9b02d2009-05-25 05:43:30 +00002763
2764 assert(obj != NULL);
2765 assert(self->proto > 0);
2766
2767 dict_size = PyDict_Size(obj);
2768
2769 /* Special-case len(d) == 1 to save space. */
2770 if (dict_size == 1) {
2771 PyDict_Next(obj, &ppos, &key, &value);
2772 if (save(self, key, 0) < 0)
2773 return -1;
2774 if (save(self, value, 0) < 0)
2775 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002776 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002777 return -1;
2778 return 0;
2779 }
2780
2781 /* Write in batches of BATCHSIZE. */
2782 do {
2783 i = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002784 if (_Pickler_Write(self, &mark_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002785 return -1;
2786 while (PyDict_Next(obj, &ppos, &key, &value)) {
2787 if (save(self, key, 0) < 0)
2788 return -1;
2789 if (save(self, value, 0) < 0)
2790 return -1;
2791 if (++i == BATCHSIZE)
2792 break;
2793 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002794 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002795 return -1;
2796 if (PyDict_Size(obj) != dict_size) {
2797 PyErr_Format(
2798 PyExc_RuntimeError,
2799 "dictionary changed size during iteration");
2800 return -1;
2801 }
2802
2803 } while (i == BATCHSIZE);
2804 return 0;
2805}
2806
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002807static int
2808save_dict(PicklerObject *self, PyObject *obj)
2809{
2810 PyObject *items, *iter;
2811 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002812 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002813 int status = 0;
2814
2815 if (self->fast && !fast_save_enter(self, obj))
2816 goto error;
2817
2818 /* Create an empty dict. */
2819 if (self->bin) {
2820 header[0] = EMPTY_DICT;
2821 len = 1;
2822 }
2823 else {
2824 header[0] = MARK;
2825 header[1] = DICT;
2826 len = 2;
2827 }
2828
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002829 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002830 goto error;
2831
2832 /* Get dict size, and bow out early if empty. */
2833 if ((len = PyDict_Size(obj)) < 0)
2834 goto error;
2835
2836 if (memo_put(self, obj) < 0)
2837 goto error;
2838
2839 if (len != 0) {
2840 /* Save the dict items. */
Collin Winter5c9b02d2009-05-25 05:43:30 +00002841 if (PyDict_CheckExact(obj) && self->proto > 0) {
2842 /* We can take certain shortcuts if we know this is a dict and
2843 not a dict subclass. */
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002844 if (Py_EnterRecursiveCall(" while pickling an object"))
2845 goto error;
2846 status = batch_dict_exact(self, obj);
2847 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002848 } else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002849 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002850
2851 items = _PyObject_CallMethodId(obj, &PyId_items, "()");
Collin Winter5c9b02d2009-05-25 05:43:30 +00002852 if (items == NULL)
2853 goto error;
2854 iter = PyObject_GetIter(items);
2855 Py_DECREF(items);
2856 if (iter == NULL)
2857 goto error;
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002858 if (Py_EnterRecursiveCall(" while pickling an object")) {
2859 Py_DECREF(iter);
2860 goto error;
2861 }
Collin Winter5c9b02d2009-05-25 05:43:30 +00002862 status = batch_dict(self, iter);
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002863 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002864 Py_DECREF(iter);
2865 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002866 }
2867
2868 if (0) {
2869 error:
2870 status = -1;
2871 }
2872
2873 if (self->fast && !fast_save_leave(self, obj))
2874 status = -1;
2875
2876 return status;
2877}
2878
2879static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002880save_set(PicklerObject *self, PyObject *obj)
2881{
2882 PyObject *item;
2883 int i;
2884 Py_ssize_t set_size, ppos = 0;
2885 Py_hash_t hash;
2886
2887 const char empty_set_op = EMPTY_SET;
2888 const char mark_op = MARK;
2889 const char additems_op = ADDITEMS;
2890
2891 if (self->proto < 4) {
2892 PyObject *items;
2893 PyObject *reduce_value;
2894 int status;
2895
2896 items = PySequence_List(obj);
2897 if (items == NULL) {
2898 return -1;
2899 }
2900 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
2901 Py_DECREF(items);
2902 if (reduce_value == NULL) {
2903 return -1;
2904 }
2905 /* save_reduce() will memoize the object automatically. */
2906 status = save_reduce(self, reduce_value, obj);
2907 Py_DECREF(reduce_value);
2908 return status;
2909 }
2910
2911 if (_Pickler_Write(self, &empty_set_op, 1) < 0)
2912 return -1;
2913
2914 if (memo_put(self, obj) < 0)
2915 return -1;
2916
2917 set_size = PySet_GET_SIZE(obj);
2918 if (set_size == 0)
2919 return 0; /* nothing to do */
2920
2921 /* Write in batches of BATCHSIZE. */
2922 do {
2923 i = 0;
2924 if (_Pickler_Write(self, &mark_op, 1) < 0)
2925 return -1;
2926 while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
2927 if (save(self, item, 0) < 0)
2928 return -1;
2929 if (++i == BATCHSIZE)
2930 break;
2931 }
2932 if (_Pickler_Write(self, &additems_op, 1) < 0)
2933 return -1;
2934 if (PySet_GET_SIZE(obj) != set_size) {
2935 PyErr_Format(
2936 PyExc_RuntimeError,
2937 "set changed size during iteration");
2938 return -1;
2939 }
2940 } while (i == BATCHSIZE);
2941
2942 return 0;
2943}
2944
2945static int
2946save_frozenset(PicklerObject *self, PyObject *obj)
2947{
2948 PyObject *iter;
2949
2950 const char mark_op = MARK;
2951 const char frozenset_op = FROZENSET;
2952
2953 if (self->fast && !fast_save_enter(self, obj))
2954 return -1;
2955
2956 if (self->proto < 4) {
2957 PyObject *items;
2958 PyObject *reduce_value;
2959 int status;
2960
2961 items = PySequence_List(obj);
2962 if (items == NULL) {
2963 return -1;
2964 }
2965 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
2966 items);
2967 Py_DECREF(items);
2968 if (reduce_value == NULL) {
2969 return -1;
2970 }
2971 /* save_reduce() will memoize the object automatically. */
2972 status = save_reduce(self, reduce_value, obj);
2973 Py_DECREF(reduce_value);
2974 return status;
2975 }
2976
2977 if (_Pickler_Write(self, &mark_op, 1) < 0)
2978 return -1;
2979
2980 iter = PyObject_GetIter(obj);
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002981 if (iter == NULL) {
Christian Heimes74d8d632013-11-23 21:05:31 +01002982 return -1;
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002983 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002984 for (;;) {
2985 PyObject *item;
2986
2987 item = PyIter_Next(iter);
2988 if (item == NULL) {
2989 if (PyErr_Occurred()) {
2990 Py_DECREF(iter);
2991 return -1;
2992 }
2993 break;
2994 }
2995 if (save(self, item, 0) < 0) {
2996 Py_DECREF(item);
2997 Py_DECREF(iter);
2998 return -1;
2999 }
3000 Py_DECREF(item);
3001 }
3002 Py_DECREF(iter);
3003
3004 /* If the object is already in the memo, this means it is
3005 recursive. In this case, throw away everything we put on the
3006 stack, and fetch the object back from the memo. */
3007 if (PyMemoTable_Get(self->memo, obj)) {
3008 const char pop_mark_op = POP_MARK;
3009
3010 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
3011 return -1;
3012 if (memo_get(self, obj) < 0)
3013 return -1;
3014 return 0;
3015 }
3016
3017 if (_Pickler_Write(self, &frozenset_op, 1) < 0)
3018 return -1;
3019 if (memo_put(self, obj) < 0)
3020 return -1;
3021
3022 return 0;
3023}
3024
3025static int
3026fix_imports(PyObject **module_name, PyObject **global_name)
3027{
3028 PyObject *key;
3029 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003030 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003031
3032 key = PyTuple_Pack(2, *module_name, *global_name);
3033 if (key == NULL)
3034 return -1;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003035 item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003036 Py_DECREF(key);
3037 if (item) {
3038 PyObject *fixed_module_name;
3039 PyObject *fixed_global_name;
3040
3041 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
3042 PyErr_Format(PyExc_RuntimeError,
3043 "_compat_pickle.REVERSE_NAME_MAPPING values "
3044 "should be 2-tuples, not %.200s",
3045 Py_TYPE(item)->tp_name);
3046 return -1;
3047 }
3048 fixed_module_name = PyTuple_GET_ITEM(item, 0);
3049 fixed_global_name = PyTuple_GET_ITEM(item, 1);
3050 if (!PyUnicode_Check(fixed_module_name) ||
3051 !PyUnicode_Check(fixed_global_name)) {
3052 PyErr_Format(PyExc_RuntimeError,
3053 "_compat_pickle.REVERSE_NAME_MAPPING values "
3054 "should be pairs of str, not (%.200s, %.200s)",
3055 Py_TYPE(fixed_module_name)->tp_name,
3056 Py_TYPE(fixed_global_name)->tp_name);
3057 return -1;
3058 }
3059
3060 Py_CLEAR(*module_name);
3061 Py_CLEAR(*global_name);
3062 Py_INCREF(fixed_module_name);
3063 Py_INCREF(fixed_global_name);
3064 *module_name = fixed_module_name;
3065 *global_name = fixed_global_name;
3066 }
3067 else if (PyErr_Occurred()) {
3068 return -1;
3069 }
3070
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003071 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003072 if (item) {
3073 if (!PyUnicode_Check(item)) {
3074 PyErr_Format(PyExc_RuntimeError,
3075 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3076 "should be strings, not %.200s",
3077 Py_TYPE(item)->tp_name);
3078 return -1;
3079 }
3080 Py_CLEAR(*module_name);
3081 Py_INCREF(item);
3082 *module_name = item;
3083 }
3084 else if (PyErr_Occurred()) {
3085 return -1;
3086 }
3087
3088 return 0;
3089}
3090
3091static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003092save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3093{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003094 PyObject *global_name = NULL;
3095 PyObject *module_name = NULL;
3096 PyObject *module = NULL;
3097 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003098 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003099 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003100 _Py_IDENTIFIER(__name__);
3101 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003102
3103 const char global_op = GLOBAL;
3104
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003105 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003106 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003107 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003108 }
3109 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003110 if (self->proto >= 4) {
3111 global_name = _PyObject_GetAttrId(obj, &PyId___qualname__);
3112 if (global_name == NULL) {
3113 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3114 goto error;
3115 PyErr_Clear();
3116 }
3117 }
3118 if (global_name == NULL) {
3119 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3120 if (global_name == NULL)
3121 goto error;
3122 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003123 }
3124
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003125 module_name = whichmodule(obj, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003126 if (module_name == NULL)
3127 goto error;
3128
3129 /* XXX: Change to use the import C API directly with level=0 to disallow
3130 relative imports.
3131
3132 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3133 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3134 custom import functions (IMHO, this would be a nice security
3135 feature). The import C API would need to be extended to support the
3136 extra parameters of __import__ to fix that. */
3137 module = PyImport_Import(module_name);
3138 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003139 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003140 "Can't pickle %R: import of module %R failed",
3141 obj, module_name);
3142 goto error;
3143 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003144 cls = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003145 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003146 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003147 "Can't pickle %R: attribute lookup %S on %S failed",
3148 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003149 goto error;
3150 }
3151 if (cls != obj) {
3152 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003153 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003154 "Can't pickle %R: it's not the same object as %S.%S",
3155 obj, module_name, global_name);
3156 goto error;
3157 }
3158 Py_DECREF(cls);
3159
3160 if (self->proto >= 2) {
3161 /* See whether this is in the extension registry, and if
3162 * so generate an EXT opcode.
3163 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003164 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003165 PyObject *code_obj; /* extension code as Python object */
3166 long code; /* extension code as C value */
3167 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003168 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003169
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003170 extension_key = PyTuple_Pack(2, module_name, global_name);
3171 if (extension_key == NULL) {
3172 goto error;
3173 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003174 code_obj = PyDict_GetItemWithError(st->extension_registry,
3175 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003176 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003177 /* The object is not registered in the extension registry.
3178 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003179 if (code_obj == NULL) {
3180 if (PyErr_Occurred()) {
3181 goto error;
3182 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003183 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003184 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003185
3186 /* XXX: pickle.py doesn't check neither the type, nor the range
3187 of the value returned by the extension_registry. It should for
3188 consistency. */
3189
3190 /* Verify code_obj has the right type and value. */
3191 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003192 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003193 "Can't pickle %R: extension code %R isn't an integer",
3194 obj, code_obj);
3195 goto error;
3196 }
3197 code = PyLong_AS_LONG(code_obj);
3198 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003199 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003200 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3201 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003202 goto error;
3203 }
3204
3205 /* Generate an EXT opcode. */
3206 if (code <= 0xff) {
3207 pdata[0] = EXT1;
3208 pdata[1] = (unsigned char)code;
3209 n = 2;
3210 }
3211 else if (code <= 0xffff) {
3212 pdata[0] = EXT2;
3213 pdata[1] = (unsigned char)(code & 0xff);
3214 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3215 n = 3;
3216 }
3217 else {
3218 pdata[0] = EXT4;
3219 pdata[1] = (unsigned char)(code & 0xff);
3220 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3221 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3222 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3223 n = 5;
3224 }
3225
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003226 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003227 goto error;
3228 }
3229 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003230 gen_global:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003231 if (self->proto >= 4) {
3232 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003233
Christian Heimese8b1ba12013-11-23 21:13:39 +01003234 if (save(self, module_name, 0) < 0)
3235 goto error;
3236 if (save(self, global_name, 0) < 0)
3237 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003238
3239 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3240 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003241 }
3242 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003243 /* Generate a normal global opcode if we are using a pickle
3244 protocol < 4, or if the object is not registered in the
3245 extension registry. */
3246 PyObject *encoded;
3247 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003248
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003249 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003250 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003251
3252 /* For protocol < 3 and if the user didn't request against doing
3253 so, we convert module names to the old 2.x module names. */
3254 if (self->proto < 3 && self->fix_imports) {
3255 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003256 goto error;
3257 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003258 }
3259
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003260 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3261 both the module name and the global name using UTF-8. We do so
3262 only when we are using the pickle protocol newer than version
3263 3. This is to ensure compatibility with older Unpickler running
3264 on Python 2.x. */
3265 if (self->proto == 3) {
3266 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003267 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003268 else {
3269 unicode_encoder = PyUnicode_AsASCIIString;
3270 }
3271 encoded = unicode_encoder(module_name);
3272 if (encoded == NULL) {
3273 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003274 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003275 "can't pickle module identifier '%S' using "
3276 "pickle protocol %i",
3277 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003278 goto error;
3279 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003280 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3281 PyBytes_GET_SIZE(encoded)) < 0) {
3282 Py_DECREF(encoded);
3283 goto error;
3284 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003285 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003286 if(_Pickler_Write(self, "\n", 1) < 0)
3287 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003288
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003289 /* Save the name of the module. */
3290 encoded = unicode_encoder(global_name);
3291 if (encoded == NULL) {
3292 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003293 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003294 "can't pickle global identifier '%S' using "
3295 "pickle protocol %i",
3296 global_name, self->proto);
3297 goto error;
3298 }
3299 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3300 PyBytes_GET_SIZE(encoded)) < 0) {
3301 Py_DECREF(encoded);
3302 goto error;
3303 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003304 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003305 if (_Pickler_Write(self, "\n", 1) < 0)
3306 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003307 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003308 /* Memoize the object. */
3309 if (memo_put(self, obj) < 0)
3310 goto error;
3311 }
3312
3313 if (0) {
3314 error:
3315 status = -1;
3316 }
3317 Py_XDECREF(module_name);
3318 Py_XDECREF(global_name);
3319 Py_XDECREF(module);
3320
3321 return status;
3322}
3323
3324static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003325save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3326{
3327 PyObject *reduce_value;
3328 int status;
3329
3330 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3331 if (reduce_value == NULL) {
3332 return -1;
3333 }
3334 status = save_reduce(self, reduce_value, obj);
3335 Py_DECREF(reduce_value);
3336 return status;
3337}
3338
3339static int
3340save_type(PicklerObject *self, PyObject *obj)
3341{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003342 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003343 return save_singleton_type(self, obj, Py_None);
3344 }
3345 else if (obj == (PyObject *)&PyEllipsis_Type) {
3346 return save_singleton_type(self, obj, Py_Ellipsis);
3347 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003348 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003349 return save_singleton_type(self, obj, Py_NotImplemented);
3350 }
3351 return save_global(self, obj, NULL);
3352}
3353
3354static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003355save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
3356{
3357 PyObject *pid = NULL;
3358 int status = 0;
3359
3360 const char persid_op = PERSID;
3361 const char binpersid_op = BINPERSID;
3362
3363 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003364 pid = _Pickle_FastCall(func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003365 if (pid == NULL)
3366 return -1;
3367
3368 if (pid != Py_None) {
3369 if (self->bin) {
3370 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003371 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003372 goto error;
3373 }
3374 else {
3375 PyObject *pid_str = NULL;
3376 char *pid_ascii_bytes;
3377 Py_ssize_t size;
3378
3379 pid_str = PyObject_Str(pid);
3380 if (pid_str == NULL)
3381 goto error;
3382
3383 /* XXX: Should it check whether the persistent id only contains
3384 ASCII characters? And what if the pid contains embedded
3385 newlines? */
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00003386 pid_ascii_bytes = _PyUnicode_AsStringAndSize(pid_str, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003387 Py_DECREF(pid_str);
3388 if (pid_ascii_bytes == NULL)
3389 goto error;
3390
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003391 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
3392 _Pickler_Write(self, pid_ascii_bytes, size) < 0 ||
3393 _Pickler_Write(self, "\n", 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003394 goto error;
3395 }
3396 status = 1;
3397 }
3398
3399 if (0) {
3400 error:
3401 status = -1;
3402 }
3403 Py_XDECREF(pid);
3404
3405 return status;
3406}
3407
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003408static PyObject *
3409get_class(PyObject *obj)
3410{
3411 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003412 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003413
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003414 cls = _PyObject_GetAttrId(obj, &PyId___class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003415 if (cls == NULL) {
3416 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3417 PyErr_Clear();
3418 cls = (PyObject *) Py_TYPE(obj);
3419 Py_INCREF(cls);
3420 }
3421 }
3422 return cls;
3423}
3424
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003425/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3426 * appropriate __reduce__ method for obj.
3427 */
3428static int
3429save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3430{
3431 PyObject *callable;
3432 PyObject *argtup;
3433 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003434 PyObject *listitems = Py_None;
3435 PyObject *dictitems = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003436 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003437 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003438 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003439
3440 const char reduce_op = REDUCE;
3441 const char build_op = BUILD;
3442 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003443 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003444
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003445 size = PyTuple_Size(args);
3446 if (size < 2 || size > 5) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003447 PyErr_SetString(st->PicklingError, "tuple returned by "
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003448 "__reduce__ must contain 2 through 5 elements");
3449 return -1;
3450 }
3451
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003452 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
3453 &callable, &argtup, &state, &listitems, &dictitems))
3454 return -1;
3455
3456 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003457 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003458 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003459 return -1;
3460 }
3461 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003462 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003463 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003464 return -1;
3465 }
3466
3467 if (state == Py_None)
3468 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003469
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003470 if (listitems == Py_None)
3471 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003472 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003473 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003474 "returned by __reduce__ must be an iterator, not %s",
3475 Py_TYPE(listitems)->tp_name);
3476 return -1;
3477 }
3478
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003479 if (dictitems == Py_None)
3480 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003481 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003482 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003483 "returned by __reduce__ must be an iterator, not %s",
3484 Py_TYPE(dictitems)->tp_name);
3485 return -1;
3486 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003487
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003488 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003489 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003490 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003491
Victor Stinner804e05e2013-11-14 01:26:17 +01003492 name = _PyObject_GetAttrId(callable, &PyId___name__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003493 if (name == NULL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003494 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003495 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003496 }
3497 PyErr_Clear();
3498 }
3499 else if (self->proto >= 4) {
3500 _Py_IDENTIFIER(__newobj_ex__);
3501 use_newobj_ex = PyUnicode_Check(name) &&
3502 PyUnicode_Compare(
3503 name, _PyUnicode_FromId(&PyId___newobj_ex__)) == 0;
3504 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003505 }
3506 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003507 _Py_IDENTIFIER(__newobj__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003508 use_newobj = PyUnicode_Check(name) &&
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003509 PyUnicode_Compare(
3510 name, _PyUnicode_FromId(&PyId___newobj__)) == 0;
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003511 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003512 }
3513 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003514
3515 if (use_newobj_ex) {
3516 PyObject *cls;
3517 PyObject *args;
3518 PyObject *kwargs;
3519
3520 if (Py_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003521 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003522 "length of the NEWOBJ_EX argument tuple must be "
3523 "exactly 3, not %zd", Py_SIZE(argtup));
3524 return -1;
3525 }
3526
3527 cls = PyTuple_GET_ITEM(argtup, 0);
3528 if (!PyType_Check(cls)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003529 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003530 "first item from NEWOBJ_EX argument tuple must "
3531 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
3532 return -1;
3533 }
3534 args = PyTuple_GET_ITEM(argtup, 1);
3535 if (!PyTuple_Check(args)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003536 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003537 "second item from NEWOBJ_EX argument tuple must "
3538 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
3539 return -1;
3540 }
3541 kwargs = PyTuple_GET_ITEM(argtup, 2);
3542 if (!PyDict_Check(kwargs)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003543 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003544 "third item from NEWOBJ_EX argument tuple must "
3545 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
3546 return -1;
3547 }
3548
3549 if (save(self, cls, 0) < 0 ||
3550 save(self, args, 0) < 0 ||
3551 save(self, kwargs, 0) < 0 ||
3552 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
3553 return -1;
3554 }
3555 }
3556 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003557 PyObject *cls;
3558 PyObject *newargtup;
3559 PyObject *obj_class;
3560 int p;
3561
3562 /* Sanity checks. */
3563 if (Py_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003564 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003565 return -1;
3566 }
3567
3568 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003569 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003570 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003571 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003572 return -1;
3573 }
3574
3575 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003576 obj_class = get_class(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003577 p = obj_class != cls; /* true iff a problem */
3578 Py_DECREF(obj_class);
3579 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003580 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003581 "__newobj__ args has the wrong class");
3582 return -1;
3583 }
3584 }
3585 /* XXX: These calls save() are prone to infinite recursion. Imagine
3586 what happen if the value returned by the __reduce__() method of
3587 some extension type contains another object of the same type. Ouch!
3588
3589 Here is a quick example, that I ran into, to illustrate what I
3590 mean:
3591
3592 >>> import pickle, copyreg
3593 >>> copyreg.dispatch_table.pop(complex)
3594 >>> pickle.dumps(1+2j)
3595 Traceback (most recent call last):
3596 ...
3597 RuntimeError: maximum recursion depth exceeded
3598
3599 Removing the complex class from copyreg.dispatch_table made the
3600 __reduce_ex__() method emit another complex object:
3601
3602 >>> (1+1j).__reduce_ex__(2)
3603 (<function __newobj__ at 0xb7b71c3c>,
3604 (<class 'complex'>, (1+1j)), None, None, None)
3605
3606 Thus when save() was called on newargstup (the 2nd item) recursion
3607 ensued. Of course, the bug was in the complex class which had a
3608 broken __getnewargs__() that emitted another complex object. But,
3609 the point, here, is it is quite easy to end up with a broken reduce
3610 function. */
3611
3612 /* Save the class and its __new__ arguments. */
3613 if (save(self, cls, 0) < 0)
3614 return -1;
3615
3616 newargtup = PyTuple_GetSlice(argtup, 1, Py_SIZE(argtup));
3617 if (newargtup == NULL)
3618 return -1;
3619
3620 p = save(self, newargtup, 0);
3621 Py_DECREF(newargtup);
3622 if (p < 0)
3623 return -1;
3624
3625 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003626 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003627 return -1;
3628 }
3629 else { /* Not using NEWOBJ. */
3630 if (save(self, callable, 0) < 0 ||
3631 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003632 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003633 return -1;
3634 }
3635
3636 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
3637 the caller do not want to memoize the object. Not particularly useful,
3638 but that is to mimic the behavior save_reduce() in pickle.py when
3639 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003640 if (obj != NULL) {
3641 /* If the object is already in the memo, this means it is
3642 recursive. In this case, throw away everything we put on the
3643 stack, and fetch the object back from the memo. */
3644 if (PyMemoTable_Get(self->memo, obj)) {
3645 const char pop_op = POP;
3646
3647 if (_Pickler_Write(self, &pop_op, 1) < 0)
3648 return -1;
3649 if (memo_get(self, obj) < 0)
3650 return -1;
3651
3652 return 0;
3653 }
3654 else if (memo_put(self, obj) < 0)
3655 return -1;
3656 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003657
3658 if (listitems && batch_list(self, listitems) < 0)
3659 return -1;
3660
3661 if (dictitems && batch_dict(self, dictitems) < 0)
3662 return -1;
3663
3664 if (state) {
Victor Stinner121aab42011-09-29 23:40:53 +02003665 if (save(self, state, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003666 _Pickler_Write(self, &build_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003667 return -1;
3668 }
3669
3670 return 0;
3671}
3672
3673static int
3674save(PicklerObject *self, PyObject *obj, int pers_save)
3675{
3676 PyTypeObject *type;
3677 PyObject *reduce_func = NULL;
3678 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003679 int status = 0;
3680
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003681 if (_Pickler_OpcodeBoundary(self) < 0)
3682 return -1;
3683
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003684 if (Py_EnterRecursiveCall(" while pickling an object"))
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003685 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003686
3687 /* The extra pers_save argument is necessary to avoid calling save_pers()
3688 on its returned object. */
3689 if (!pers_save && self->pers_func) {
3690 /* save_pers() returns:
3691 -1 to signal an error;
3692 0 if it did nothing successfully;
3693 1 if a persistent id was saved.
3694 */
3695 if ((status = save_pers(self, obj, self->pers_func)) != 0)
3696 goto done;
3697 }
3698
3699 type = Py_TYPE(obj);
3700
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003701 /* The old cPickle had an optimization that used switch-case statement
3702 dispatching on the first letter of the type name. This has was removed
3703 since benchmarks shown that this optimization was actually slowing
3704 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003705
3706 /* Atom types; these aren't memoized, so don't check the memo. */
3707
3708 if (obj == Py_None) {
3709 status = save_none(self, obj);
3710 goto done;
3711 }
3712 else if (obj == Py_False || obj == Py_True) {
3713 status = save_bool(self, obj);
3714 goto done;
3715 }
3716 else if (type == &PyLong_Type) {
3717 status = save_long(self, obj);
3718 goto done;
3719 }
3720 else if (type == &PyFloat_Type) {
3721 status = save_float(self, obj);
3722 goto done;
3723 }
3724
3725 /* Check the memo to see if it has the object. If so, generate
3726 a GET (or BINGET) opcode, instead of pickling the object
3727 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003728 if (PyMemoTable_Get(self->memo, obj)) {
3729 if (memo_get(self, obj) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003730 goto error;
3731 goto done;
3732 }
3733
3734 if (type == &PyBytes_Type) {
3735 status = save_bytes(self, obj);
3736 goto done;
3737 }
3738 else if (type == &PyUnicode_Type) {
3739 status = save_unicode(self, obj);
3740 goto done;
3741 }
3742 else if (type == &PyDict_Type) {
3743 status = save_dict(self, obj);
3744 goto done;
3745 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003746 else if (type == &PySet_Type) {
3747 status = save_set(self, obj);
3748 goto done;
3749 }
3750 else if (type == &PyFrozenSet_Type) {
3751 status = save_frozenset(self, obj);
3752 goto done;
3753 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003754 else if (type == &PyList_Type) {
3755 status = save_list(self, obj);
3756 goto done;
3757 }
3758 else if (type == &PyTuple_Type) {
3759 status = save_tuple(self, obj);
3760 goto done;
3761 }
3762 else if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003763 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003764 goto done;
3765 }
3766 else if (type == &PyFunction_Type) {
3767 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08003768 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003769 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003770
3771 /* XXX: This part needs some unit tests. */
3772
3773 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003774 * self.dispatch_table, copyreg.dispatch_table, the object's
3775 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003776 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003777 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003778 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003779 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
3780 (PyObject *)type);
3781 if (reduce_func == NULL) {
3782 if (PyErr_Occurred()) {
3783 goto error;
3784 }
3785 } else {
3786 /* PyDict_GetItemWithError() returns a borrowed reference.
3787 Increase the reference count to be consistent with
3788 PyObject_GetItem and _PyObject_GetAttrId used below. */
3789 Py_INCREF(reduce_func);
3790 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003791 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003792 reduce_func = PyObject_GetItem(self->dispatch_table,
3793 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003794 if (reduce_func == NULL) {
3795 if (PyErr_ExceptionMatches(PyExc_KeyError))
3796 PyErr_Clear();
3797 else
3798 goto error;
3799 }
3800 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003801 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003802 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003803 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003804 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02003805 else if (PyType_IsSubtype(type, &PyType_Type)) {
3806 status = save_global(self, obj, NULL);
3807 goto done;
3808 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003809 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003810 _Py_IDENTIFIER(__reduce__);
3811 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003812
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003813
3814 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
3815 automatically defined as __reduce__. While this is convenient, this
3816 make it impossible to know which method was actually called. Of
3817 course, this is not a big deal. But still, it would be nice to let
3818 the user know which method was called when something go
3819 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
3820 don't actually have to check for a __reduce__ method. */
3821
3822 /* Check for a __reduce_ex__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003823 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003824 if (reduce_func != NULL) {
3825 PyObject *proto;
3826 proto = PyLong_FromLong(self->proto);
3827 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003828 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003829 }
3830 }
3831 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003832 PickleState *st = _Pickle_GetGlobalState();
3833
3834 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003835 PyErr_Clear();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003836 }
3837 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003838 goto error;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003839 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003840 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003841 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003842 if (reduce_func != NULL) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003843 PyObject *empty_tuple = PyTuple_New(0);
3844 reduce_value = PyObject_Call(reduce_func, empty_tuple,
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003845 NULL);
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003846 Py_DECREF(empty_tuple);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003847 }
3848 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003849 PyErr_Format(st->PicklingError,
3850 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003851 type->tp_name, obj);
3852 goto error;
3853 }
3854 }
3855 }
3856
3857 if (reduce_value == NULL)
3858 goto error;
3859
3860 if (PyUnicode_Check(reduce_value)) {
3861 status = save_global(self, obj, reduce_value);
3862 goto done;
3863 }
3864
3865 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003866 PickleState *st = _Pickle_GetGlobalState();
3867 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003868 "__reduce__ must return a string or tuple");
3869 goto error;
3870 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003871
3872 status = save_reduce(self, reduce_value, obj);
3873
3874 if (0) {
3875 error:
3876 status = -1;
3877 }
3878 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003879
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003880 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003881 Py_XDECREF(reduce_func);
3882 Py_XDECREF(reduce_value);
3883
3884 return status;
3885}
3886
3887static int
3888dump(PicklerObject *self, PyObject *obj)
3889{
3890 const char stop_op = STOP;
3891
3892 if (self->proto >= 2) {
3893 char header[2];
3894
3895 header[0] = PROTO;
3896 assert(self->proto >= 0 && self->proto < 256);
3897 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003898 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003899 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003900 if (self->proto >= 4)
3901 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003902 }
3903
3904 if (save(self, obj, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003905 _Pickler_Write(self, &stop_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003906 return -1;
3907
3908 return 0;
3909}
3910
Larry Hastings61272b72014-01-07 12:41:53 -08003911/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003912
3913_pickle.Pickler.clear_memo
3914
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003915Clears the pickler's "memo".
3916
3917The memo is the data structure that remembers which objects the
3918pickler has already seen, so that shared or recursive objects are
3919pickled by reference and not by value. This method is useful when
3920re-using picklers.
Larry Hastings61272b72014-01-07 12:41:53 -08003921[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003922
Larry Hastings3cceb382014-01-04 11:09:09 -08003923static PyObject *
3924_pickle_Pickler_clear_memo_impl(PicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08003925/*[clinic end generated code: output=8665c8658aaa094b input=01bdad52f3d93e56]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003926{
3927 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003928 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003929
3930 Py_RETURN_NONE;
3931}
3932
Larry Hastings61272b72014-01-07 12:41:53 -08003933/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003934
3935_pickle.Pickler.dump
3936
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003937 obj: object
3938 /
3939
3940Write a pickled representation of the given object to the open file.
Larry Hastings61272b72014-01-07 12:41:53 -08003941[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003942
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003943static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003944_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
Larry Hastings581ee362014-01-28 05:00:08 -08003945/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003946{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003947 /* Check whether the Pickler was initialized correctly (issue3664).
3948 Developers often forget to call __init__() in their subclasses, which
3949 would trigger a segfault without this check. */
3950 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003951 PickleState *st = _Pickle_GetGlobalState();
3952 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003953 "Pickler.__init__() was not called by %s.__init__()",
3954 Py_TYPE(self)->tp_name);
3955 return NULL;
3956 }
3957
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003958 if (_Pickler_ClearBuffer(self) < 0)
3959 return NULL;
3960
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003961 if (dump(self, obj) < 0)
3962 return NULL;
3963
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003964 if (_Pickler_FlushToFile(self) < 0)
3965 return NULL;
3966
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003967 Py_RETURN_NONE;
3968}
3969
3970static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003971 _PICKLE_PICKLER_DUMP_METHODDEF
3972 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003973 {NULL, NULL} /* sentinel */
3974};
3975
3976static void
3977Pickler_dealloc(PicklerObject *self)
3978{
3979 PyObject_GC_UnTrack(self);
3980
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003981 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003982 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003983 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003984 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003985 Py_XDECREF(self->fast_memo);
3986
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003987 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003988
3989 Py_TYPE(self)->tp_free((PyObject *)self);
3990}
3991
3992static int
3993Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
3994{
3995 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003996 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003997 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003998 Py_VISIT(self->fast_memo);
3999 return 0;
4000}
4001
4002static int
4003Pickler_clear(PicklerObject *self)
4004{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004005 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004006 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004007 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004008 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004009 Py_CLEAR(self->fast_memo);
4010
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004011 if (self->memo != NULL) {
4012 PyMemoTable *memo = self->memo;
4013 self->memo = NULL;
4014 PyMemoTable_Del(memo);
4015 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004016 return 0;
4017}
4018
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004019
Larry Hastings61272b72014-01-07 12:41:53 -08004020/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004021
4022_pickle.Pickler.__init__
4023
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004024 file: object
4025 protocol: object = NULL
4026 fix_imports: bool = True
4027
4028This takes a binary file for writing a pickle data stream.
4029
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004030The optional *protocol* argument tells the pickler to use the given
4031protocol; supported protocols are 0, 1, 2, 3 and 4. The default
4032protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004033
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004034Specifying a negative protocol version selects the highest protocol
4035version supported. The higher the protocol used, the more recent the
4036version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004037
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004038The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004039bytes argument. It can thus be a file object opened for binary
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004040writing, a io.BytesIO instance, or any other custom object that meets
4041this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004042
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004043If *fix_imports* is True and protocol is less than 3, pickle will try
4044to map the new Python 3 names to the old module names used in Python
40452, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08004046[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004047
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004048static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004049_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports)
Larry Hastings581ee362014-01-28 05:00:08 -08004050/*[clinic end generated code: output=56e229f3b1f4332f input=b8cdeb7e3f5ee674]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004051{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004052 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004053 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004054
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004055 /* In case of multiple __init__() calls, clear previous content. */
4056 if (self->write != NULL)
4057 (void)Pickler_clear(self);
4058
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004059 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004060 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004061
4062 if (_Pickler_SetOutputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004063 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004064
4065 /* memo and output_buffer may have already been created in _Pickler_New */
4066 if (self->memo == NULL) {
4067 self->memo = PyMemoTable_New();
4068 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004069 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004070 }
4071 self->output_len = 0;
4072 if (self->output_buffer == NULL) {
4073 self->max_output_len = WRITE_BUF_SIZE;
4074 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4075 self->max_output_len);
4076 if (self->output_buffer == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004077 return -1;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004078 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004079
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004080 self->fast = 0;
4081 self->fast_nesting = 0;
4082 self->fast_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004083 self->pers_func = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004084 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) {
4085 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
4086 &PyId_persistent_id);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004087 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004088 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004089 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004090 self->dispatch_table = NULL;
4091 if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) {
4092 self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
4093 &PyId_dispatch_table);
4094 if (self->dispatch_table == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004095 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004096 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004097
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004098 return 0;
4099}
4100
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004101
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004102/* Define a proxy object for the Pickler's internal memo object. This is to
4103 * avoid breaking code like:
4104 * pickler.memo.clear()
4105 * and
4106 * pickler.memo = saved_memo
4107 * Is this a good idea? Not really, but we don't want to break code that uses
4108 * it. Note that we don't implement the entire mapping API here. This is
4109 * intentional, as these should be treated as black-box implementation details.
4110 */
4111
Larry Hastings61272b72014-01-07 12:41:53 -08004112/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004113_pickle.PicklerMemoProxy.clear
4114
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004115Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08004116[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004117
Larry Hastings3cceb382014-01-04 11:09:09 -08004118static PyObject *
4119_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004120/*[clinic end generated code: output=5fb9370d48ae8b05 input=ccc186dacd0f1405]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004121{
4122 if (self->pickler->memo)
4123 PyMemoTable_Clear(self->pickler->memo);
4124 Py_RETURN_NONE;
4125}
4126
Larry Hastings61272b72014-01-07 12:41:53 -08004127/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004128_pickle.PicklerMemoProxy.copy
4129
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004130Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08004131[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004132
Larry Hastings3cceb382014-01-04 11:09:09 -08004133static PyObject *
4134_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004135/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004136{
4137 Py_ssize_t i;
4138 PyMemoTable *memo;
4139 PyObject *new_memo = PyDict_New();
4140 if (new_memo == NULL)
4141 return NULL;
4142
4143 memo = self->pickler->memo;
4144 for (i = 0; i < memo->mt_allocated; ++i) {
4145 PyMemoEntry entry = memo->mt_table[i];
4146 if (entry.me_key != NULL) {
4147 int status;
4148 PyObject *key, *value;
4149
4150 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004151 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004152
4153 if (key == NULL || value == NULL) {
4154 Py_XDECREF(key);
4155 Py_XDECREF(value);
4156 goto error;
4157 }
4158 status = PyDict_SetItem(new_memo, key, value);
4159 Py_DECREF(key);
4160 Py_DECREF(value);
4161 if (status < 0)
4162 goto error;
4163 }
4164 }
4165 return new_memo;
4166
4167 error:
4168 Py_XDECREF(new_memo);
4169 return NULL;
4170}
4171
Larry Hastings61272b72014-01-07 12:41:53 -08004172/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004173_pickle.PicklerMemoProxy.__reduce__
4174
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004175Implement pickle support.
Larry Hastings61272b72014-01-07 12:41:53 -08004176[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004177
Larry Hastings3cceb382014-01-04 11:09:09 -08004178static PyObject *
4179_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004180/*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004181{
4182 PyObject *reduce_value, *dict_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08004183 PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004184 if (contents == NULL)
4185 return NULL;
4186
4187 reduce_value = PyTuple_New(2);
4188 if (reduce_value == NULL) {
4189 Py_DECREF(contents);
4190 return NULL;
4191 }
4192 dict_args = PyTuple_New(1);
4193 if (dict_args == NULL) {
4194 Py_DECREF(contents);
4195 Py_DECREF(reduce_value);
4196 return NULL;
4197 }
4198 PyTuple_SET_ITEM(dict_args, 0, contents);
4199 Py_INCREF((PyObject *)&PyDict_Type);
4200 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4201 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4202 return reduce_value;
4203}
4204
4205static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004206 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4207 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4208 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004209 {NULL, NULL} /* sentinel */
4210};
4211
4212static void
4213PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4214{
4215 PyObject_GC_UnTrack(self);
4216 Py_XDECREF(self->pickler);
4217 PyObject_GC_Del((PyObject *)self);
4218}
4219
4220static int
4221PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4222 visitproc visit, void *arg)
4223{
4224 Py_VISIT(self->pickler);
4225 return 0;
4226}
4227
4228static int
4229PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4230{
4231 Py_CLEAR(self->pickler);
4232 return 0;
4233}
4234
4235static PyTypeObject PicklerMemoProxyType = {
4236 PyVarObject_HEAD_INIT(NULL, 0)
4237 "_pickle.PicklerMemoProxy", /*tp_name*/
4238 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4239 0,
4240 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4241 0, /* tp_print */
4242 0, /* tp_getattr */
4243 0, /* tp_setattr */
4244 0, /* tp_compare */
4245 0, /* tp_repr */
4246 0, /* tp_as_number */
4247 0, /* tp_as_sequence */
4248 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004249 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004250 0, /* tp_call */
4251 0, /* tp_str */
4252 PyObject_GenericGetAttr, /* tp_getattro */
4253 PyObject_GenericSetAttr, /* tp_setattro */
4254 0, /* tp_as_buffer */
4255 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4256 0, /* tp_doc */
4257 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4258 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4259 0, /* tp_richcompare */
4260 0, /* tp_weaklistoffset */
4261 0, /* tp_iter */
4262 0, /* tp_iternext */
4263 picklerproxy_methods, /* tp_methods */
4264};
4265
4266static PyObject *
4267PicklerMemoProxy_New(PicklerObject *pickler)
4268{
4269 PicklerMemoProxyObject *self;
4270
4271 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4272 if (self == NULL)
4273 return NULL;
4274 Py_INCREF(pickler);
4275 self->pickler = pickler;
4276 PyObject_GC_Track(self);
4277 return (PyObject *)self;
4278}
4279
4280/*****************************************************************************/
4281
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004282static PyObject *
4283Pickler_get_memo(PicklerObject *self)
4284{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004285 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004286}
4287
4288static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004289Pickler_set_memo(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004290{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004291 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004292
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004293 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004294 PyErr_SetString(PyExc_TypeError,
4295 "attribute deletion is not supported");
4296 return -1;
4297 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004298
4299 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4300 PicklerObject *pickler =
4301 ((PicklerMemoProxyObject *)obj)->pickler;
4302
4303 new_memo = PyMemoTable_Copy(pickler->memo);
4304 if (new_memo == NULL)
4305 return -1;
4306 }
4307 else if (PyDict_Check(obj)) {
4308 Py_ssize_t i = 0;
4309 PyObject *key, *value;
4310
4311 new_memo = PyMemoTable_New();
4312 if (new_memo == NULL)
4313 return -1;
4314
4315 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004316 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004317 PyObject *memo_obj;
4318
4319 if (!PyTuple_Check(value) || Py_SIZE(value) != 2) {
4320 PyErr_SetString(PyExc_TypeError,
4321 "'memo' values must be 2-item tuples");
4322 goto error;
4323 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004324 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004325 if (memo_id == -1 && PyErr_Occurred())
4326 goto error;
4327 memo_obj = PyTuple_GET_ITEM(value, 1);
4328 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4329 goto error;
4330 }
4331 }
4332 else {
4333 PyErr_Format(PyExc_TypeError,
4334 "'memo' attribute must be an PicklerMemoProxy object"
4335 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004336 return -1;
4337 }
4338
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004339 PyMemoTable_Del(self->memo);
4340 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004341
4342 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004343
4344 error:
4345 if (new_memo)
4346 PyMemoTable_Del(new_memo);
4347 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004348}
4349
4350static PyObject *
4351Pickler_get_persid(PicklerObject *self)
4352{
4353 if (self->pers_func == NULL)
4354 PyErr_SetString(PyExc_AttributeError, "persistent_id");
4355 else
4356 Py_INCREF(self->pers_func);
4357 return self->pers_func;
4358}
4359
4360static int
4361Pickler_set_persid(PicklerObject *self, PyObject *value)
4362{
4363 PyObject *tmp;
4364
4365 if (value == NULL) {
4366 PyErr_SetString(PyExc_TypeError,
4367 "attribute deletion is not supported");
4368 return -1;
4369 }
4370 if (!PyCallable_Check(value)) {
4371 PyErr_SetString(PyExc_TypeError,
4372 "persistent_id must be a callable taking one argument");
4373 return -1;
4374 }
4375
4376 tmp = self->pers_func;
4377 Py_INCREF(value);
4378 self->pers_func = value;
4379 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
4380
4381 return 0;
4382}
4383
4384static PyMemberDef Pickler_members[] = {
4385 {"bin", T_INT, offsetof(PicklerObject, bin)},
4386 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004387 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004388 {NULL}
4389};
4390
4391static PyGetSetDef Pickler_getsets[] = {
4392 {"memo", (getter)Pickler_get_memo,
4393 (setter)Pickler_set_memo},
4394 {"persistent_id", (getter)Pickler_get_persid,
4395 (setter)Pickler_set_persid},
4396 {NULL}
4397};
4398
4399static PyTypeObject Pickler_Type = {
4400 PyVarObject_HEAD_INIT(NULL, 0)
4401 "_pickle.Pickler" , /*tp_name*/
4402 sizeof(PicklerObject), /*tp_basicsize*/
4403 0, /*tp_itemsize*/
4404 (destructor)Pickler_dealloc, /*tp_dealloc*/
4405 0, /*tp_print*/
4406 0, /*tp_getattr*/
4407 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00004408 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004409 0, /*tp_repr*/
4410 0, /*tp_as_number*/
4411 0, /*tp_as_sequence*/
4412 0, /*tp_as_mapping*/
4413 0, /*tp_hash*/
4414 0, /*tp_call*/
4415 0, /*tp_str*/
4416 0, /*tp_getattro*/
4417 0, /*tp_setattro*/
4418 0, /*tp_as_buffer*/
4419 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004420 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004421 (traverseproc)Pickler_traverse, /*tp_traverse*/
4422 (inquiry)Pickler_clear, /*tp_clear*/
4423 0, /*tp_richcompare*/
4424 0, /*tp_weaklistoffset*/
4425 0, /*tp_iter*/
4426 0, /*tp_iternext*/
4427 Pickler_methods, /*tp_methods*/
4428 Pickler_members, /*tp_members*/
4429 Pickler_getsets, /*tp_getset*/
4430 0, /*tp_base*/
4431 0, /*tp_dict*/
4432 0, /*tp_descr_get*/
4433 0, /*tp_descr_set*/
4434 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004435 _pickle_Pickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004436 PyType_GenericAlloc, /*tp_alloc*/
4437 PyType_GenericNew, /*tp_new*/
4438 PyObject_GC_Del, /*tp_free*/
4439 0, /*tp_is_gc*/
4440};
4441
Victor Stinner121aab42011-09-29 23:40:53 +02004442/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004443
4444 XXX: It would be nice to able to avoid Python function call overhead, by
4445 using directly the C version of find_class(), when find_class() is not
4446 overridden by a subclass. Although, this could become rather hackish. A
4447 simpler optimization would be to call the C function when self is not a
4448 subclass instance. */
4449static PyObject *
4450find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4451{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004452 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004453
4454 return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO",
4455 module_name, global_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004456}
4457
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004458static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004459marker(UnpicklerObject *self)
4460{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004461 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004462 if (self->num_marks < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004463 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004464 return -1;
4465 }
4466
4467 return self->marks[--self->num_marks];
4468}
4469
4470static int
4471load_none(UnpicklerObject *self)
4472{
4473 PDATA_APPEND(self->stack, Py_None, -1);
4474 return 0;
4475}
4476
4477static int
4478bad_readline(void)
4479{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004480 PickleState *st = _Pickle_GetGlobalState();
4481 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004482 return -1;
4483}
4484
4485static int
4486load_int(UnpicklerObject *self)
4487{
4488 PyObject *value;
4489 char *endptr, *s;
4490 Py_ssize_t len;
4491 long x;
4492
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004493 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004494 return -1;
4495 if (len < 2)
4496 return bad_readline();
4497
4498 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02004499 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004500 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004501 x = strtol(s, &endptr, 0);
4502
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004503 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004504 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03004505 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004506 errno = 0;
4507 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004508 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004509 if (value == NULL) {
4510 PyErr_SetString(PyExc_ValueError,
4511 "could not convert string to int");
4512 return -1;
4513 }
4514 }
4515 else {
4516 if (len == 3 && (x == 0 || x == 1)) {
4517 if ((value = PyBool_FromLong(x)) == NULL)
4518 return -1;
4519 }
4520 else {
4521 if ((value = PyLong_FromLong(x)) == NULL)
4522 return -1;
4523 }
4524 }
4525
4526 PDATA_PUSH(self->stack, value, -1);
4527 return 0;
4528}
4529
4530static int
4531load_bool(UnpicklerObject *self, PyObject *boolean)
4532{
4533 assert(boolean == Py_True || boolean == Py_False);
4534 PDATA_APPEND(self->stack, boolean, -1);
4535 return 0;
4536}
4537
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004538/* s contains x bytes of an unsigned little-endian integer. Return its value
4539 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4540 */
4541static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004542calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004543{
4544 unsigned char *s = (unsigned char *)bytes;
Victor Stinnerf13c46c2014-08-17 21:05:55 +02004545 Py_ssize_t i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004546 size_t x = 0;
4547
Victor Stinnerf13c46c2014-08-17 21:05:55 +02004548 for (i = 0; i < nbytes && (size_t)i < sizeof(size_t); i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004549 x |= (size_t) s[i] << (8 * i);
4550 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004551
4552 if (x > PY_SSIZE_T_MAX)
4553 return -1;
4554 else
4555 return (Py_ssize_t) x;
4556}
4557
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004558/* s contains x bytes of a little-endian integer. Return its value as a
4559 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
4560 * int, but when x is 4 it's a signed one. This is an historical source
4561 * of x-platform bugs.
4562 */
4563static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004564calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004565{
4566 unsigned char *s = (unsigned char *)bytes;
Victor Stinnerf13c46c2014-08-17 21:05:55 +02004567 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004568 long x = 0;
4569
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004570 for (i = 0; i < nbytes; i++) {
4571 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004572 }
4573
4574 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4575 * is signed, so on a box with longs bigger than 4 bytes we need
4576 * to extend a BININT's sign bit to the full width.
4577 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004578 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004579 x |= -(x & (1L << 31));
4580 }
4581
4582 return x;
4583}
4584
4585static int
4586load_binintx(UnpicklerObject *self, char *s, int size)
4587{
4588 PyObject *value;
4589 long x;
4590
4591 x = calc_binint(s, size);
4592
4593 if ((value = PyLong_FromLong(x)) == NULL)
4594 return -1;
4595
4596 PDATA_PUSH(self->stack, value, -1);
4597 return 0;
4598}
4599
4600static int
4601load_binint(UnpicklerObject *self)
4602{
4603 char *s;
4604
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004605 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004606 return -1;
4607
4608 return load_binintx(self, s, 4);
4609}
4610
4611static int
4612load_binint1(UnpicklerObject *self)
4613{
4614 char *s;
4615
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004616 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004617 return -1;
4618
4619 return load_binintx(self, s, 1);
4620}
4621
4622static int
4623load_binint2(UnpicklerObject *self)
4624{
4625 char *s;
4626
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004627 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004628 return -1;
4629
4630 return load_binintx(self, s, 2);
4631}
4632
4633static int
4634load_long(UnpicklerObject *self)
4635{
4636 PyObject *value;
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004637 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004638 Py_ssize_t len;
4639
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004640 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004641 return -1;
4642 if (len < 2)
4643 return bad_readline();
4644
Mark Dickinson8dd05142009-01-20 20:43:58 +00004645 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4646 the 'L' before calling PyLong_FromString. In order to maintain
4647 compatibility with Python 3.0.0, we don't actually *require*
4648 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004649 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004650 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00004651 /* XXX: Should the base argument explicitly set to 10? */
4652 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00004653 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004654 return -1;
4655
4656 PDATA_PUSH(self->stack, value, -1);
4657 return 0;
4658}
4659
4660/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4661 * data following.
4662 */
4663static int
4664load_counted_long(UnpicklerObject *self, int size)
4665{
4666 PyObject *value;
4667 char *nbytes;
4668 char *pdata;
4669
4670 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004671 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004672 return -1;
4673
4674 size = calc_binint(nbytes, size);
4675 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004676 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004677 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004678 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004679 "LONG pickle has negative byte count");
4680 return -1;
4681 }
4682
4683 if (size == 0)
4684 value = PyLong_FromLong(0L);
4685 else {
4686 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004687 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004688 return -1;
4689 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
4690 1 /* little endian */ , 1 /* signed */ );
4691 }
4692 if (value == NULL)
4693 return -1;
4694 PDATA_PUSH(self->stack, value, -1);
4695 return 0;
4696}
4697
4698static int
4699load_float(UnpicklerObject *self)
4700{
4701 PyObject *value;
4702 char *endptr, *s;
4703 Py_ssize_t len;
4704 double d;
4705
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004706 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004707 return -1;
4708 if (len < 2)
4709 return bad_readline();
4710
4711 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004712 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
4713 if (d == -1.0 && PyErr_Occurred())
4714 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004715 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004716 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
4717 return -1;
4718 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00004719 value = PyFloat_FromDouble(d);
4720 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004721 return -1;
4722
4723 PDATA_PUSH(self->stack, value, -1);
4724 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004725}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004726
4727static int
4728load_binfloat(UnpicklerObject *self)
4729{
4730 PyObject *value;
4731 double x;
4732 char *s;
4733
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004734 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004735 return -1;
4736
4737 x = _PyFloat_Unpack8((unsigned char *)s, 0);
4738 if (x == -1.0 && PyErr_Occurred())
4739 return -1;
4740
4741 if ((value = PyFloat_FromDouble(x)) == NULL)
4742 return -1;
4743
4744 PDATA_PUSH(self->stack, value, -1);
4745 return 0;
4746}
4747
4748static int
4749load_string(UnpicklerObject *self)
4750{
4751 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004752 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004753 Py_ssize_t len;
4754 char *s, *p;
4755
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004756 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004757 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004758 /* Strip the newline */
4759 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004760 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004761 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004762 p = s + 1;
4763 len -= 2;
4764 }
4765 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004766 PickleState *st = _Pickle_GetGlobalState();
4767 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004768 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004769 return -1;
4770 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004771 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004772
4773 /* Use the PyBytes API to decode the string, since that is what is used
4774 to encode, and then coerce the result to Unicode. */
4775 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004776 if (bytes == NULL)
4777 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004778
4779 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
4780 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4781 if (strcmp(self->encoding, "bytes") == 0) {
4782 obj = bytes;
4783 }
4784 else {
4785 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
4786 Py_DECREF(bytes);
4787 if (obj == NULL) {
4788 return -1;
4789 }
4790 }
4791
4792 PDATA_PUSH(self->stack, obj, -1);
4793 return 0;
4794}
4795
4796static int
4797load_counted_binstring(UnpicklerObject *self, int nbytes)
4798{
4799 PyObject *obj;
4800 Py_ssize_t size;
4801 char *s;
4802
4803 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004804 return -1;
4805
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004806 size = calc_binsize(s, nbytes);
4807 if (size < 0) {
4808 PickleState *st = _Pickle_GetGlobalState();
4809 PyErr_Format(st->UnpicklingError,
4810 "BINSTRING exceeds system's maximum size of %zd bytes",
4811 PY_SSIZE_T_MAX);
4812 return -1;
4813 }
4814
4815 if (_Unpickler_Read(self, &s, size) < 0)
4816 return -1;
4817
4818 /* Convert Python 2.x strings to bytes if the *encoding* given to the
4819 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4820 if (strcmp(self->encoding, "bytes") == 0) {
4821 obj = PyBytes_FromStringAndSize(s, size);
4822 }
4823 else {
4824 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
4825 }
4826 if (obj == NULL) {
4827 return -1;
4828 }
4829
4830 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004831 return 0;
4832}
4833
4834static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004835load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004836{
4837 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004838 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004839 char *s;
4840
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004841 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004842 return -1;
4843
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004844 size = calc_binsize(s, nbytes);
4845 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004846 PyErr_Format(PyExc_OverflowError,
4847 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004848 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004849 return -1;
4850 }
4851
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004852 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004853 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004854
4855 bytes = PyBytes_FromStringAndSize(s, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004856 if (bytes == NULL)
4857 return -1;
4858
4859 PDATA_PUSH(self->stack, bytes, -1);
4860 return 0;
4861}
4862
4863static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004864load_unicode(UnpicklerObject *self)
4865{
4866 PyObject *str;
4867 Py_ssize_t len;
4868 char *s;
4869
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004870 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004871 return -1;
4872 if (len < 1)
4873 return bad_readline();
4874
4875 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
4876 if (str == NULL)
4877 return -1;
4878
4879 PDATA_PUSH(self->stack, str, -1);
4880 return 0;
4881}
4882
4883static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004884load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004885{
4886 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004887 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004888 char *s;
4889
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004890 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004891 return -1;
4892
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004893 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004894 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004895 PyErr_Format(PyExc_OverflowError,
4896 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004897 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004898 return -1;
4899 }
4900
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004901 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004902 return -1;
4903
Victor Stinner485fb562010-04-13 11:07:24 +00004904 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004905 if (str == NULL)
4906 return -1;
4907
4908 PDATA_PUSH(self->stack, str, -1);
4909 return 0;
4910}
4911
4912static int
4913load_tuple(UnpicklerObject *self)
4914{
4915 PyObject *tuple;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004916 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004917
4918 if ((i = marker(self)) < 0)
4919 return -1;
4920
4921 tuple = Pdata_poptuple(self->stack, i);
4922 if (tuple == NULL)
4923 return -1;
4924 PDATA_PUSH(self->stack, tuple, -1);
4925 return 0;
4926}
4927
4928static int
4929load_counted_tuple(UnpicklerObject *self, int len)
4930{
4931 PyObject *tuple;
4932
4933 tuple = PyTuple_New(len);
4934 if (tuple == NULL)
4935 return -1;
4936
4937 while (--len >= 0) {
4938 PyObject *item;
4939
4940 PDATA_POP(self->stack, item);
4941 if (item == NULL)
4942 return -1;
4943 PyTuple_SET_ITEM(tuple, len, item);
4944 }
4945 PDATA_PUSH(self->stack, tuple, -1);
4946 return 0;
4947}
4948
4949static int
4950load_empty_list(UnpicklerObject *self)
4951{
4952 PyObject *list;
4953
4954 if ((list = PyList_New(0)) == NULL)
4955 return -1;
4956 PDATA_PUSH(self->stack, list, -1);
4957 return 0;
4958}
4959
4960static int
4961load_empty_dict(UnpicklerObject *self)
4962{
4963 PyObject *dict;
4964
4965 if ((dict = PyDict_New()) == NULL)
4966 return -1;
4967 PDATA_PUSH(self->stack, dict, -1);
4968 return 0;
4969}
4970
4971static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004972load_empty_set(UnpicklerObject *self)
4973{
4974 PyObject *set;
4975
4976 if ((set = PySet_New(NULL)) == NULL)
4977 return -1;
4978 PDATA_PUSH(self->stack, set, -1);
4979 return 0;
4980}
4981
4982static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004983load_list(UnpicklerObject *self)
4984{
4985 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004986 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004987
4988 if ((i = marker(self)) < 0)
4989 return -1;
4990
4991 list = Pdata_poplist(self->stack, i);
4992 if (list == NULL)
4993 return -1;
4994 PDATA_PUSH(self->stack, list, -1);
4995 return 0;
4996}
4997
4998static int
4999load_dict(UnpicklerObject *self)
5000{
5001 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005002 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005003
5004 if ((i = marker(self)) < 0)
5005 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005006 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005007
5008 if ((dict = PyDict_New()) == NULL)
5009 return -1;
5010
5011 for (k = i + 1; k < j; k += 2) {
5012 key = self->stack->data[k - 1];
5013 value = self->stack->data[k];
5014 if (PyDict_SetItem(dict, key, value) < 0) {
5015 Py_DECREF(dict);
5016 return -1;
5017 }
5018 }
5019 Pdata_clear(self->stack, i);
5020 PDATA_PUSH(self->stack, dict, -1);
5021 return 0;
5022}
5023
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005024static int
5025load_frozenset(UnpicklerObject *self)
5026{
5027 PyObject *items;
5028 PyObject *frozenset;
5029 Py_ssize_t i;
5030
5031 if ((i = marker(self)) < 0)
5032 return -1;
5033
5034 items = Pdata_poptuple(self->stack, i);
5035 if (items == NULL)
5036 return -1;
5037
5038 frozenset = PyFrozenSet_New(items);
5039 Py_DECREF(items);
5040 if (frozenset == NULL)
5041 return -1;
5042
5043 PDATA_PUSH(self->stack, frozenset, -1);
5044 return 0;
5045}
5046
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005047static PyObject *
5048instantiate(PyObject *cls, PyObject *args)
5049{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005050 PyObject *result = NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005051 _Py_IDENTIFIER(__getinitargs__);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005052 /* Caller must assure args are a tuple. Normally, args come from
5053 Pdata_poptuple which packs objects from the top of the stack
5054 into a newly created tuple. */
5055 assert(PyTuple_Check(args));
5056 if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005057 _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005058 result = PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005059 }
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005060 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005061 _Py_IDENTIFIER(__new__);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005062
5063 result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005064 }
5065 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005066}
5067
5068static int
5069load_obj(UnpicklerObject *self)
5070{
5071 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005072 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005073
5074 if ((i = marker(self)) < 0)
5075 return -1;
5076
5077 args = Pdata_poptuple(self->stack, i + 1);
5078 if (args == NULL)
5079 return -1;
5080
5081 PDATA_POP(self->stack, cls);
5082 if (cls) {
5083 obj = instantiate(cls, args);
5084 Py_DECREF(cls);
5085 }
5086 Py_DECREF(args);
5087 if (obj == NULL)
5088 return -1;
5089
5090 PDATA_PUSH(self->stack, obj, -1);
5091 return 0;
5092}
5093
5094static int
5095load_inst(UnpicklerObject *self)
5096{
5097 PyObject *cls = NULL;
5098 PyObject *args = NULL;
5099 PyObject *obj = NULL;
5100 PyObject *module_name;
5101 PyObject *class_name;
5102 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005103 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005104 char *s;
5105
5106 if ((i = marker(self)) < 0)
5107 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005108 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005109 return -1;
5110 if (len < 2)
5111 return bad_readline();
5112
5113 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5114 identifiers are permitted in Python 3.0, since the INST opcode is only
5115 supported by older protocols on Python 2.x. */
5116 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5117 if (module_name == NULL)
5118 return -1;
5119
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005120 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005121 if (len < 2)
5122 return bad_readline();
5123 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005124 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005125 cls = find_class(self, module_name, class_name);
5126 Py_DECREF(class_name);
5127 }
5128 }
5129 Py_DECREF(module_name);
5130
5131 if (cls == NULL)
5132 return -1;
5133
5134 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5135 obj = instantiate(cls, args);
5136 Py_DECREF(args);
5137 }
5138 Py_DECREF(cls);
5139
5140 if (obj == NULL)
5141 return -1;
5142
5143 PDATA_PUSH(self->stack, obj, -1);
5144 return 0;
5145}
5146
5147static int
5148load_newobj(UnpicklerObject *self)
5149{
5150 PyObject *args = NULL;
5151 PyObject *clsraw = NULL;
5152 PyTypeObject *cls; /* clsraw cast to its true type */
5153 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005154 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005155
5156 /* Stack is ... cls argtuple, and we want to call
5157 * cls.__new__(cls, *argtuple).
5158 */
5159 PDATA_POP(self->stack, args);
5160 if (args == NULL)
5161 goto error;
5162 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005163 PyErr_SetString(st->UnpicklingError,
5164 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005165 goto error;
5166 }
5167
5168 PDATA_POP(self->stack, clsraw);
5169 cls = (PyTypeObject *)clsraw;
5170 if (cls == NULL)
5171 goto error;
5172 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005173 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005174 "isn't a type object");
5175 goto error;
5176 }
5177 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005178 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005179 "has NULL tp_new");
5180 goto error;
5181 }
5182
5183 /* Call __new__. */
5184 obj = cls->tp_new(cls, args, NULL);
5185 if (obj == NULL)
5186 goto error;
5187
5188 Py_DECREF(args);
5189 Py_DECREF(clsraw);
5190 PDATA_PUSH(self->stack, obj, -1);
5191 return 0;
5192
5193 error:
5194 Py_XDECREF(args);
5195 Py_XDECREF(clsraw);
5196 return -1;
5197}
5198
5199static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005200load_newobj_ex(UnpicklerObject *self)
5201{
5202 PyObject *cls, *args, *kwargs;
5203 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005204 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005205
5206 PDATA_POP(self->stack, kwargs);
5207 if (kwargs == NULL) {
5208 return -1;
5209 }
5210 PDATA_POP(self->stack, args);
5211 if (args == NULL) {
5212 Py_DECREF(kwargs);
5213 return -1;
5214 }
5215 PDATA_POP(self->stack, cls);
5216 if (cls == NULL) {
5217 Py_DECREF(kwargs);
5218 Py_DECREF(args);
5219 return -1;
5220 }
Larry Hastings61272b72014-01-07 12:41:53 -08005221
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005222 if (!PyType_Check(cls)) {
5223 Py_DECREF(kwargs);
5224 Py_DECREF(args);
5225 Py_DECREF(cls);
Larry Hastings61272b72014-01-07 12:41:53 -08005226 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005227 "NEWOBJ_EX class argument must be a type, not %.200s",
5228 Py_TYPE(cls)->tp_name);
5229 return -1;
5230 }
5231
5232 if (((PyTypeObject *)cls)->tp_new == NULL) {
5233 Py_DECREF(kwargs);
5234 Py_DECREF(args);
5235 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005236 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005237 "NEWOBJ_EX class argument doesn't have __new__");
5238 return -1;
5239 }
5240 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5241 Py_DECREF(kwargs);
5242 Py_DECREF(args);
5243 Py_DECREF(cls);
5244 if (obj == NULL) {
5245 return -1;
5246 }
5247 PDATA_PUSH(self->stack, obj, -1);
5248 return 0;
5249}
5250
5251static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005252load_global(UnpicklerObject *self)
5253{
5254 PyObject *global = NULL;
5255 PyObject *module_name;
5256 PyObject *global_name;
5257 Py_ssize_t len;
5258 char *s;
5259
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005260 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005261 return -1;
5262 if (len < 2)
5263 return bad_readline();
5264 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5265 if (!module_name)
5266 return -1;
5267
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005268 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005269 if (len < 2) {
5270 Py_DECREF(module_name);
5271 return bad_readline();
5272 }
5273 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5274 if (global_name) {
5275 global = find_class(self, module_name, global_name);
5276 Py_DECREF(global_name);
5277 }
5278 }
5279 Py_DECREF(module_name);
5280
5281 if (global == NULL)
5282 return -1;
5283 PDATA_PUSH(self->stack, global, -1);
5284 return 0;
5285}
5286
5287static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005288load_stack_global(UnpicklerObject *self)
5289{
5290 PyObject *global;
5291 PyObject *module_name;
5292 PyObject *global_name;
5293
5294 PDATA_POP(self->stack, global_name);
5295 PDATA_POP(self->stack, module_name);
5296 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5297 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005298 PickleState *st = _Pickle_GetGlobalState();
5299 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005300 Py_XDECREF(global_name);
5301 Py_XDECREF(module_name);
5302 return -1;
5303 }
5304 global = find_class(self, module_name, global_name);
5305 Py_DECREF(global_name);
5306 Py_DECREF(module_name);
5307 if (global == NULL)
5308 return -1;
5309 PDATA_PUSH(self->stack, global, -1);
5310 return 0;
5311}
5312
5313static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005314load_persid(UnpicklerObject *self)
5315{
5316 PyObject *pid;
5317 Py_ssize_t len;
5318 char *s;
5319
5320 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005321 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005322 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08005323 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005324 return bad_readline();
5325
5326 pid = PyBytes_FromStringAndSize(s, len - 1);
5327 if (pid == NULL)
5328 return -1;
5329
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005330 /* This does not leak since _Pickle_FastCall() steals the reference
5331 to pid first. */
5332 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005333 if (pid == NULL)
5334 return -1;
5335
5336 PDATA_PUSH(self->stack, pid, -1);
5337 return 0;
5338 }
5339 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005340 PickleState *st = _Pickle_GetGlobalState();
5341 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005342 "A load persistent id instruction was encountered,\n"
5343 "but no persistent_load function was specified.");
5344 return -1;
5345 }
5346}
5347
5348static int
5349load_binpersid(UnpicklerObject *self)
5350{
5351 PyObject *pid;
5352
5353 if (self->pers_func) {
5354 PDATA_POP(self->stack, pid);
5355 if (pid == NULL)
5356 return -1;
5357
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005358 /* This does not leak since _Pickle_FastCall() steals the
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005359 reference to pid first. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005360 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005361 if (pid == NULL)
5362 return -1;
5363
5364 PDATA_PUSH(self->stack, pid, -1);
5365 return 0;
5366 }
5367 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005368 PickleState *st = _Pickle_GetGlobalState();
5369 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005370 "A load persistent id instruction was encountered,\n"
5371 "but no persistent_load function was specified.");
5372 return -1;
5373 }
5374}
5375
5376static int
5377load_pop(UnpicklerObject *self)
5378{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005379 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005380
5381 /* Note that we split the (pickle.py) stack into two stacks,
5382 * an object stack and a mark stack. We have to be clever and
5383 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005384 * mark stack first, and only signalling a stack underflow if
5385 * the object stack is empty and the mark stack doesn't match
5386 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005387 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005388 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005389 self->num_marks--;
Antoine Pitrou01a15ea2010-01-07 17:57:31 +00005390 } else if (len > 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005391 len--;
5392 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005393 Py_SIZE(self->stack) = len;
Collin Winter8ca69de2009-05-26 16:53:41 +00005394 } else {
5395 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005396 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005397 return 0;
5398}
5399
5400static int
5401load_pop_mark(UnpicklerObject *self)
5402{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005403 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005404
5405 if ((i = marker(self)) < 0)
5406 return -1;
5407
5408 Pdata_clear(self->stack, i);
5409
5410 return 0;
5411}
5412
5413static int
5414load_dup(UnpicklerObject *self)
5415{
5416 PyObject *last;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005417 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005418
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005419 if ((len = Py_SIZE(self->stack)) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005420 return stack_underflow();
5421 last = self->stack->data[len - 1];
5422 PDATA_APPEND(self->stack, last, -1);
5423 return 0;
5424}
5425
5426static int
5427load_get(UnpicklerObject *self)
5428{
5429 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005430 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005431 Py_ssize_t len;
5432 char *s;
5433
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005434 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005435 return -1;
5436 if (len < 2)
5437 return bad_readline();
5438
5439 key = PyLong_FromString(s, NULL, 10);
5440 if (key == NULL)
5441 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005442 idx = PyLong_AsSsize_t(key);
5443 if (idx == -1 && PyErr_Occurred()) {
5444 Py_DECREF(key);
5445 return -1;
5446 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005447
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005448 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005449 if (value == NULL) {
5450 if (!PyErr_Occurred())
5451 PyErr_SetObject(PyExc_KeyError, key);
5452 Py_DECREF(key);
5453 return -1;
5454 }
5455 Py_DECREF(key);
5456
5457 PDATA_APPEND(self->stack, value, -1);
5458 return 0;
5459}
5460
5461static int
5462load_binget(UnpicklerObject *self)
5463{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005464 PyObject *value;
5465 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005466 char *s;
5467
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005468 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005469 return -1;
5470
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005471 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005472
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005473 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005474 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005475 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005476 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005477 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005478 Py_DECREF(key);
5479 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005480 return -1;
5481 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005482
5483 PDATA_APPEND(self->stack, value, -1);
5484 return 0;
5485}
5486
5487static int
5488load_long_binget(UnpicklerObject *self)
5489{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005490 PyObject *value;
5491 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005492 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005493
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005494 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005495 return -1;
5496
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005497 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005498
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005499 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005500 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005501 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005502 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005503 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005504 Py_DECREF(key);
5505 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005506 return -1;
5507 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005508
5509 PDATA_APPEND(self->stack, value, -1);
5510 return 0;
5511}
5512
5513/* Push an object from the extension registry (EXT[124]). nbytes is
5514 * the number of bytes following the opcode, holding the index (code) value.
5515 */
5516static int
5517load_extension(UnpicklerObject *self, int nbytes)
5518{
5519 char *codebytes; /* the nbytes bytes after the opcode */
5520 long code; /* calc_binint returns long */
5521 PyObject *py_code; /* code as a Python int */
5522 PyObject *obj; /* the object to push */
5523 PyObject *pair; /* (module_name, class_name) */
5524 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005525 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005526
5527 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005528 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005529 return -1;
5530 code = calc_binint(codebytes, nbytes);
5531 if (code <= 0) { /* note that 0 is forbidden */
5532 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005533 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005534 return -1;
5535 }
5536
5537 /* Look for the code in the cache. */
5538 py_code = PyLong_FromLong(code);
5539 if (py_code == NULL)
5540 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005541 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005542 if (obj != NULL) {
5543 /* Bingo. */
5544 Py_DECREF(py_code);
5545 PDATA_APPEND(self->stack, obj, -1);
5546 return 0;
5547 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005548 if (PyErr_Occurred()) {
5549 Py_DECREF(py_code);
5550 return -1;
5551 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005552
5553 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005554 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005555 if (pair == NULL) {
5556 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005557 if (!PyErr_Occurred()) {
5558 PyErr_Format(PyExc_ValueError, "unregistered extension "
5559 "code %ld", code);
5560 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005561 return -1;
5562 }
5563 /* Since the extension registry is manipulable via Python code,
5564 * confirm that pair is really a 2-tuple of strings.
5565 */
5566 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5567 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5568 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5569 Py_DECREF(py_code);
5570 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5571 "isn't a 2-tuple of strings", code);
5572 return -1;
5573 }
5574 /* Load the object. */
5575 obj = find_class(self, module_name, class_name);
5576 if (obj == NULL) {
5577 Py_DECREF(py_code);
5578 return -1;
5579 }
5580 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005581 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005582 Py_DECREF(py_code);
5583 if (code < 0) {
5584 Py_DECREF(obj);
5585 return -1;
5586 }
5587 PDATA_PUSH(self->stack, obj, -1);
5588 return 0;
5589}
5590
5591static int
5592load_put(UnpicklerObject *self)
5593{
5594 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005595 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005596 Py_ssize_t len;
5597 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005598
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005599 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005600 return -1;
5601 if (len < 2)
5602 return bad_readline();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005603 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005604 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005605 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005606
5607 key = PyLong_FromString(s, NULL, 10);
5608 if (key == NULL)
5609 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005610 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005611 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005612 if (idx < 0) {
5613 if (!PyErr_Occurred())
5614 PyErr_SetString(PyExc_ValueError,
5615 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005616 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005617 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005618
5619 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005620}
5621
5622static int
5623load_binput(UnpicklerObject *self)
5624{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005625 PyObject *value;
5626 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005627 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005628
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005629 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005630 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005631
5632 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005633 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005634 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005635
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005636 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005637
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005638 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005639}
5640
5641static int
5642load_long_binput(UnpicklerObject *self)
5643{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005644 PyObject *value;
5645 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005646 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005647
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005648 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005649 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005650
5651 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005652 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005653 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005654
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005655 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005656 if (idx < 0) {
5657 PyErr_SetString(PyExc_ValueError,
5658 "negative LONG_BINPUT argument");
5659 return -1;
5660 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005661
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005662 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005663}
5664
5665static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005666load_memoize(UnpicklerObject *self)
5667{
5668 PyObject *value;
5669
5670 if (Py_SIZE(self->stack) <= 0)
5671 return stack_underflow();
5672 value = self->stack->data[Py_SIZE(self->stack) - 1];
5673
5674 return _Unpickler_MemoPut(self, self->memo_len, value);
5675}
5676
5677static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005678do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005679{
5680 PyObject *value;
5681 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005682 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005683
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005684 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005685 if (x > len || x <= 0)
5686 return stack_underflow();
5687 if (len == x) /* nothing to do */
5688 return 0;
5689
5690 list = self->stack->data[x - 1];
5691
5692 if (PyList_Check(list)) {
5693 PyObject *slice;
5694 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005695 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005696
5697 slice = Pdata_poplist(self->stack, x);
5698 if (!slice)
5699 return -1;
5700 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005701 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005702 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005703 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005704 }
5705 else {
5706 PyObject *append_func;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005707 _Py_IDENTIFIER(append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005708
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005709 append_func = _PyObject_GetAttrId(list, &PyId_append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005710 if (append_func == NULL)
5711 return -1;
5712 for (i = x; i < len; i++) {
5713 PyObject *result;
5714
5715 value = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005716 result = _Pickle_FastCall(append_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005717 if (result == NULL) {
5718 Pdata_clear(self->stack, i + 1);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005719 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005720 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005721 return -1;
5722 }
5723 Py_DECREF(result);
5724 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005725 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005726 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005727 }
5728
5729 return 0;
5730}
5731
5732static int
5733load_append(UnpicklerObject *self)
5734{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005735 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005736}
5737
5738static int
5739load_appends(UnpicklerObject *self)
5740{
5741 return do_append(self, marker(self));
5742}
5743
5744static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005745do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005746{
5747 PyObject *value, *key;
5748 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005749 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005750 int status = 0;
5751
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005752 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005753 if (x > len || x <= 0)
5754 return stack_underflow();
5755 if (len == x) /* nothing to do */
5756 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005757 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005758 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005759 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005760 PyErr_SetString(st->UnpicklingError,
5761 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005762 return -1;
5763 }
5764
5765 /* Here, dict does not actually need to be a PyDict; it could be anything
5766 that supports the __setitem__ attribute. */
5767 dict = self->stack->data[x - 1];
5768
5769 for (i = x + 1; i < len; i += 2) {
5770 key = self->stack->data[i - 1];
5771 value = self->stack->data[i];
5772 if (PyObject_SetItem(dict, key, value) < 0) {
5773 status = -1;
5774 break;
5775 }
5776 }
5777
5778 Pdata_clear(self->stack, x);
5779 return status;
5780}
5781
5782static int
5783load_setitem(UnpicklerObject *self)
5784{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005785 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005786}
5787
5788static int
5789load_setitems(UnpicklerObject *self)
5790{
5791 return do_setitems(self, marker(self));
5792}
5793
5794static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005795load_additems(UnpicklerObject *self)
5796{
5797 PyObject *set;
5798 Py_ssize_t mark, len, i;
5799
5800 mark = marker(self);
5801 len = Py_SIZE(self->stack);
5802 if (mark > len || mark <= 0)
5803 return stack_underflow();
5804 if (len == mark) /* nothing to do */
5805 return 0;
5806
5807 set = self->stack->data[mark - 1];
5808
5809 if (PySet_Check(set)) {
5810 PyObject *items;
5811 int status;
5812
5813 items = Pdata_poptuple(self->stack, mark);
5814 if (items == NULL)
5815 return -1;
5816
5817 status = _PySet_Update(set, items);
5818 Py_DECREF(items);
5819 return status;
5820 }
5821 else {
5822 PyObject *add_func;
5823 _Py_IDENTIFIER(add);
5824
5825 add_func = _PyObject_GetAttrId(set, &PyId_add);
5826 if (add_func == NULL)
5827 return -1;
5828 for (i = mark; i < len; i++) {
5829 PyObject *result;
5830 PyObject *item;
5831
5832 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005833 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005834 if (result == NULL) {
5835 Pdata_clear(self->stack, i + 1);
5836 Py_SIZE(self->stack) = mark;
5837 return -1;
5838 }
5839 Py_DECREF(result);
5840 }
5841 Py_SIZE(self->stack) = mark;
5842 }
5843
5844 return 0;
5845}
5846
5847static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005848load_build(UnpicklerObject *self)
5849{
5850 PyObject *state, *inst, *slotstate;
5851 PyObject *setstate;
5852 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005853 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005854
5855 /* Stack is ... instance, state. We want to leave instance at
5856 * the stack top, possibly mutated via instance.__setstate__(state).
5857 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005858 if (Py_SIZE(self->stack) < 2)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005859 return stack_underflow();
5860
5861 PDATA_POP(self->stack, state);
5862 if (state == NULL)
5863 return -1;
5864
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005865 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005866
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005867 setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005868 if (setstate == NULL) {
5869 if (PyErr_ExceptionMatches(PyExc_AttributeError))
5870 PyErr_Clear();
Antoine Pitroud79dc622008-09-05 00:03:33 +00005871 else {
5872 Py_DECREF(state);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005873 return -1;
Antoine Pitroud79dc622008-09-05 00:03:33 +00005874 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005875 }
5876 else {
5877 PyObject *result;
5878
5879 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005880 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005881 Py_DECREF(setstate);
5882 if (result == NULL)
5883 return -1;
5884 Py_DECREF(result);
5885 return 0;
5886 }
5887
5888 /* A default __setstate__. First see whether state embeds a
5889 * slot state dict too (a proto 2 addition).
5890 */
5891 if (PyTuple_Check(state) && Py_SIZE(state) == 2) {
5892 PyObject *tmp = state;
5893
5894 state = PyTuple_GET_ITEM(tmp, 0);
5895 slotstate = PyTuple_GET_ITEM(tmp, 1);
5896 Py_INCREF(state);
5897 Py_INCREF(slotstate);
5898 Py_DECREF(tmp);
5899 }
5900 else
5901 slotstate = NULL;
5902
5903 /* Set inst.__dict__ from the state dict (if any). */
5904 if (state != Py_None) {
5905 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005906 PyObject *d_key, *d_value;
5907 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005908 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005909
5910 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005911 PickleState *st = _Pickle_GetGlobalState();
5912 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005913 goto error;
5914 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005915 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005916 if (dict == NULL)
5917 goto error;
5918
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005919 i = 0;
5920 while (PyDict_Next(state, &i, &d_key, &d_value)) {
5921 /* normally the keys for instance attributes are
5922 interned. we should try to do that here. */
5923 Py_INCREF(d_key);
5924 if (PyUnicode_CheckExact(d_key))
5925 PyUnicode_InternInPlace(&d_key);
5926 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
5927 Py_DECREF(d_key);
5928 goto error;
5929 }
5930 Py_DECREF(d_key);
5931 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005932 Py_DECREF(dict);
5933 }
5934
5935 /* Also set instance attributes from the slotstate dict (if any). */
5936 if (slotstate != NULL) {
5937 PyObject *d_key, *d_value;
5938 Py_ssize_t i;
5939
5940 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005941 PickleState *st = _Pickle_GetGlobalState();
5942 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005943 "slot state is not a dictionary");
5944 goto error;
5945 }
5946 i = 0;
5947 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
5948 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
5949 goto error;
5950 }
5951 }
5952
5953 if (0) {
5954 error:
5955 status = -1;
5956 }
5957
5958 Py_DECREF(state);
5959 Py_XDECREF(slotstate);
5960 return status;
5961}
5962
5963static int
5964load_mark(UnpicklerObject *self)
5965{
5966
5967 /* Note that we split the (pickle.py) stack into two stacks, an
5968 * object stack and a mark stack. Here we push a mark onto the
5969 * mark stack.
5970 */
5971
5972 if ((self->num_marks + 1) >= self->marks_size) {
5973 size_t alloc;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005974 Py_ssize_t *marks;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005975
5976 /* Use the size_t type to check for overflow. */
5977 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005978 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00005979 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005980 PyErr_NoMemory();
5981 return -1;
5982 }
5983
5984 if (self->marks == NULL)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005985 marks = (Py_ssize_t *) PyMem_Malloc(alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005986 else
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005987 marks = (Py_ssize_t *) PyMem_Realloc(self->marks,
5988 alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005989 if (marks == NULL) {
5990 PyErr_NoMemory();
5991 return -1;
5992 }
5993 self->marks = marks;
5994 self->marks_size = (Py_ssize_t)alloc;
5995 }
5996
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005997 self->marks[self->num_marks++] = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005998
5999 return 0;
6000}
6001
6002static int
6003load_reduce(UnpicklerObject *self)
6004{
6005 PyObject *callable = NULL;
6006 PyObject *argtup = NULL;
6007 PyObject *obj = NULL;
6008
6009 PDATA_POP(self->stack, argtup);
6010 if (argtup == NULL)
6011 return -1;
6012 PDATA_POP(self->stack, callable);
6013 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006014 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006015 Py_DECREF(callable);
6016 }
6017 Py_DECREF(argtup);
6018
6019 if (obj == NULL)
6020 return -1;
6021
6022 PDATA_PUSH(self->stack, obj, -1);
6023 return 0;
6024}
6025
6026/* Just raises an error if we don't know the protocol specified. PROTO
6027 * is the first opcode for protocols >= 2.
6028 */
6029static int
6030load_proto(UnpicklerObject *self)
6031{
6032 char *s;
6033 int i;
6034
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006035 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006036 return -1;
6037
6038 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006039 if (i <= HIGHEST_PROTOCOL) {
6040 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006041 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006042 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006043
6044 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6045 return -1;
6046}
6047
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006048static int
6049load_frame(UnpicklerObject *self)
6050{
6051 char *s;
6052 Py_ssize_t frame_len;
6053
6054 if (_Unpickler_Read(self, &s, 8) < 0)
6055 return -1;
6056
6057 frame_len = calc_binsize(s, 8);
6058 if (frame_len < 0) {
6059 PyErr_Format(PyExc_OverflowError,
6060 "FRAME length exceeds system's maximum of %zd bytes",
6061 PY_SSIZE_T_MAX);
6062 return -1;
6063 }
6064
6065 if (_Unpickler_Read(self, &s, frame_len) < 0)
6066 return -1;
6067
6068 /* Rewind to start of frame */
6069 self->next_read_idx -= frame_len;
6070 return 0;
6071}
6072
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006073static PyObject *
6074load(UnpicklerObject *self)
6075{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006076 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006077 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006078
6079 self->num_marks = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006080 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006081 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006082 Pdata_clear(self->stack, 0);
6083
6084 /* Convenient macros for the dispatch while-switch loop just below. */
6085#define OP(opcode, load_func) \
6086 case opcode: if (load_func(self) < 0) break; continue;
6087
6088#define OP_ARG(opcode, load_func, arg) \
6089 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6090
6091 while (1) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006092 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006093 break;
6094
6095 switch ((enum opcode)s[0]) {
6096 OP(NONE, load_none)
6097 OP(BININT, load_binint)
6098 OP(BININT1, load_binint1)
6099 OP(BININT2, load_binint2)
6100 OP(INT, load_int)
6101 OP(LONG, load_long)
6102 OP_ARG(LONG1, load_counted_long, 1)
6103 OP_ARG(LONG4, load_counted_long, 4)
6104 OP(FLOAT, load_float)
6105 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006106 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6107 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6108 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6109 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6110 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006111 OP(STRING, load_string)
6112 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006113 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6114 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6115 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006116 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6117 OP_ARG(TUPLE1, load_counted_tuple, 1)
6118 OP_ARG(TUPLE2, load_counted_tuple, 2)
6119 OP_ARG(TUPLE3, load_counted_tuple, 3)
6120 OP(TUPLE, load_tuple)
6121 OP(EMPTY_LIST, load_empty_list)
6122 OP(LIST, load_list)
6123 OP(EMPTY_DICT, load_empty_dict)
6124 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006125 OP(EMPTY_SET, load_empty_set)
6126 OP(ADDITEMS, load_additems)
6127 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006128 OP(OBJ, load_obj)
6129 OP(INST, load_inst)
6130 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006131 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006132 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006133 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006134 OP(APPEND, load_append)
6135 OP(APPENDS, load_appends)
6136 OP(BUILD, load_build)
6137 OP(DUP, load_dup)
6138 OP(BINGET, load_binget)
6139 OP(LONG_BINGET, load_long_binget)
6140 OP(GET, load_get)
6141 OP(MARK, load_mark)
6142 OP(BINPUT, load_binput)
6143 OP(LONG_BINPUT, load_long_binput)
6144 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006145 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006146 OP(POP, load_pop)
6147 OP(POP_MARK, load_pop_mark)
6148 OP(SETITEM, load_setitem)
6149 OP(SETITEMS, load_setitems)
6150 OP(PERSID, load_persid)
6151 OP(BINPERSID, load_binpersid)
6152 OP(REDUCE, load_reduce)
6153 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006154 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006155 OP_ARG(EXT1, load_extension, 1)
6156 OP_ARG(EXT2, load_extension, 2)
6157 OP_ARG(EXT4, load_extension, 4)
6158 OP_ARG(NEWTRUE, load_bool, Py_True)
6159 OP_ARG(NEWFALSE, load_bool, Py_False)
6160
6161 case STOP:
6162 break;
6163
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006164 default:
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006165 if (s[0] == '\0') {
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006166 PyErr_SetNone(PyExc_EOFError);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006167 }
6168 else {
6169 PickleState *st = _Pickle_GetGlobalState();
6170 PyErr_Format(st->UnpicklingError,
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006171 "invalid load key, '%c'.", s[0]);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006172 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006173 return NULL;
6174 }
6175
6176 break; /* and we are done! */
6177 }
6178
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006179 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006180 return NULL;
6181 }
6182
Victor Stinner2ae57e32013-10-31 13:39:23 +01006183 if (_Unpickler_SkipConsumed(self) < 0)
6184 return NULL;
6185
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006186 PDATA_POP(self->stack, value);
6187 return value;
6188}
6189
Larry Hastings61272b72014-01-07 12:41:53 -08006190/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006191
6192_pickle.Unpickler.load
6193
6194Load a pickle.
6195
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006196Read a pickled object representation from the open file object given
6197in the constructor, and return the reconstituted object hierarchy
6198specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006199[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006200
Larry Hastings3cceb382014-01-04 11:09:09 -08006201static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006202_pickle_Unpickler_load_impl(UnpicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006203/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006204{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006205 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006206
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006207 /* Check whether the Unpickler was initialized correctly. This prevents
6208 segfaulting if a subclass overridden __init__ with a function that does
6209 not call Unpickler.__init__(). Here, we simply ensure that self->read
6210 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006211 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006212 PickleState *st = _Pickle_GetGlobalState();
6213 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006214 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006215 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006216 return NULL;
6217 }
6218
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006219 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006220}
6221
6222/* The name of find_class() is misleading. In newer pickle protocols, this
6223 function is used for loading any global (i.e., functions), not just
6224 classes. The name is kept only for backward compatibility. */
6225
Larry Hastings61272b72014-01-07 12:41:53 -08006226/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006227
6228_pickle.Unpickler.find_class
6229
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006230 module_name: object
6231 global_name: object
6232 /
6233
6234Return an object from a specified module.
6235
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006236If necessary, the module will be imported. Subclasses may override
6237this method (e.g. to restrict unpickling of arbitrary classes and
6238functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006239
6240This method is called whenever a class or a function object is
6241needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006242[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006243
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006244static PyObject *
6245_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
Larry Hastings581ee362014-01-28 05:00:08 -08006246/*[clinic end generated code: output=64c77437e088e188 input=e2e6a865de093ef4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006247{
6248 PyObject *global;
6249 PyObject *modules_dict;
6250 PyObject *module;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006251 _Py_IDENTIFIER(modules);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006252
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006253 /* Try to map the old names used in Python 2.x to the new ones used in
6254 Python 3.x. We do this only with old pickle protocols and when the
6255 user has not disabled the feature. */
6256 if (self->proto < 3 && self->fix_imports) {
6257 PyObject *key;
6258 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006259 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006260
6261 /* Check if the global (i.e., a function or a class) was renamed
6262 or moved to another module. */
6263 key = PyTuple_Pack(2, module_name, global_name);
6264 if (key == NULL)
6265 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006266 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006267 Py_DECREF(key);
6268 if (item) {
6269 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6270 PyErr_Format(PyExc_RuntimeError,
6271 "_compat_pickle.NAME_MAPPING values should be "
6272 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6273 return NULL;
6274 }
6275 module_name = PyTuple_GET_ITEM(item, 0);
6276 global_name = PyTuple_GET_ITEM(item, 1);
6277 if (!PyUnicode_Check(module_name) ||
6278 !PyUnicode_Check(global_name)) {
6279 PyErr_Format(PyExc_RuntimeError,
6280 "_compat_pickle.NAME_MAPPING values should be "
6281 "pairs of str, not (%.200s, %.200s)",
6282 Py_TYPE(module_name)->tp_name,
6283 Py_TYPE(global_name)->tp_name);
6284 return NULL;
6285 }
6286 }
6287 else if (PyErr_Occurred()) {
6288 return NULL;
6289 }
6290
6291 /* Check if the module was renamed. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006292 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006293 if (item) {
6294 if (!PyUnicode_Check(item)) {
6295 PyErr_Format(PyExc_RuntimeError,
6296 "_compat_pickle.IMPORT_MAPPING values should be "
6297 "strings, not %.200s", Py_TYPE(item)->tp_name);
6298 return NULL;
6299 }
6300 module_name = item;
6301 }
6302 else if (PyErr_Occurred()) {
6303 return NULL;
6304 }
6305 }
6306
Victor Stinnerbb520202013-11-06 22:40:41 +01006307 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02006308 if (modules_dict == NULL) {
6309 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006310 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02006311 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006312
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006313 module = PyDict_GetItemWithError(modules_dict, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006314 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006315 if (PyErr_Occurred())
6316 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006317 module = PyImport_Import(module_name);
6318 if (module == NULL)
6319 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006320 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006321 Py_DECREF(module);
6322 }
Victor Stinner121aab42011-09-29 23:40:53 +02006323 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006324 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006325 }
6326 return global;
6327}
6328
6329static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006330 _PICKLE_UNPICKLER_LOAD_METHODDEF
6331 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006332 {NULL, NULL} /* sentinel */
6333};
6334
6335static void
6336Unpickler_dealloc(UnpicklerObject *self)
6337{
6338 PyObject_GC_UnTrack((PyObject *)self);
6339 Py_XDECREF(self->readline);
6340 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006341 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006342 Py_XDECREF(self->stack);
6343 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006344 if (self->buffer.buf != NULL) {
6345 PyBuffer_Release(&self->buffer);
6346 self->buffer.buf = NULL;
6347 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006348
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006349 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006350 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006351 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006352 PyMem_Free(self->encoding);
6353 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006354
6355 Py_TYPE(self)->tp_free((PyObject *)self);
6356}
6357
6358static int
6359Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6360{
6361 Py_VISIT(self->readline);
6362 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006363 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006364 Py_VISIT(self->stack);
6365 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006366 return 0;
6367}
6368
6369static int
6370Unpickler_clear(UnpicklerObject *self)
6371{
6372 Py_CLEAR(self->readline);
6373 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006374 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006375 Py_CLEAR(self->stack);
6376 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006377 if (self->buffer.buf != NULL) {
6378 PyBuffer_Release(&self->buffer);
6379 self->buffer.buf = NULL;
6380 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006381
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006382 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006383 PyMem_Free(self->marks);
6384 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006385 PyMem_Free(self->input_line);
6386 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006387 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006388 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006389 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006390 self->errors = NULL;
6391
6392 return 0;
6393}
6394
Larry Hastings61272b72014-01-07 12:41:53 -08006395/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006396
6397_pickle.Unpickler.__init__
6398
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006399 file: object
6400 *
6401 fix_imports: bool = True
6402 encoding: str = 'ASCII'
6403 errors: str = 'strict'
6404
6405This takes a binary file for reading a pickle data stream.
6406
6407The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006408protocol argument is needed. Bytes past the pickled object's
6409representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006410
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006411The argument *file* must have two methods, a read() method that takes
6412an integer argument, and a readline() method that requires no
6413arguments. Both methods should return bytes. Thus *file* can be a
6414binary file object opened for reading, a io.BytesIO object, or any
6415other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006416
6417Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6418which are used to control compatiblity support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006419generated by Python 2. If *fix_imports* is True, pickle will try to
6420map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006421*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006422instances pickled by Python 2; these default to 'ASCII' and 'strict',
6423respectively. The *encoding* can be 'bytes' to read these 8-bit
6424string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006425[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006426
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006427static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006428_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, const char *errors)
Larry Hastings581ee362014-01-28 05:00:08 -08006429/*[clinic end generated code: output=b9ed1d84d315f3b5 input=30b4dc9e976b890c]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006430{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006431 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006432
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006433 /* In case of multiple __init__() calls, clear previous content. */
6434 if (self->read != NULL)
6435 (void)Unpickler_clear(self);
6436
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006437 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006438 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006439
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006440 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006441 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006442
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006443 self->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006444 if (self->fix_imports == -1)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006445 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006446
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006447 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006448 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
6449 &PyId_persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006450 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006451 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006452 }
6453 else {
6454 self->pers_func = NULL;
6455 }
6456
6457 self->stack = (Pdata *)Pdata_New();
6458 if (self->stack == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006459 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006460
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006461 self->memo_size = 32;
6462 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006463 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006464 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006465
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006466 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006467
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006468 return 0;
6469}
6470
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006471
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006472/* Define a proxy object for the Unpickler's internal memo object. This is to
6473 * avoid breaking code like:
6474 * unpickler.memo.clear()
6475 * and
6476 * unpickler.memo = saved_memo
6477 * Is this a good idea? Not really, but we don't want to break code that uses
6478 * it. Note that we don't implement the entire mapping API here. This is
6479 * intentional, as these should be treated as black-box implementation details.
6480 *
6481 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006482 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006483 */
6484
Larry Hastings61272b72014-01-07 12:41:53 -08006485/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006486_pickle.UnpicklerMemoProxy.clear
6487
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006488Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08006489[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006490
Larry Hastings3cceb382014-01-04 11:09:09 -08006491static PyObject *
6492_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006493/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006494{
6495 _Unpickler_MemoCleanup(self->unpickler);
6496 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6497 if (self->unpickler->memo == NULL)
6498 return NULL;
6499 Py_RETURN_NONE;
6500}
6501
Larry Hastings61272b72014-01-07 12:41:53 -08006502/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006503_pickle.UnpicklerMemoProxy.copy
6504
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006505Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08006506[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006507
Larry Hastings3cceb382014-01-04 11:09:09 -08006508static PyObject *
6509_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006510/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006511{
6512 Py_ssize_t i;
6513 PyObject *new_memo = PyDict_New();
6514 if (new_memo == NULL)
6515 return NULL;
6516
6517 for (i = 0; i < self->unpickler->memo_size; i++) {
6518 int status;
6519 PyObject *key, *value;
6520
6521 value = self->unpickler->memo[i];
6522 if (value == NULL)
6523 continue;
6524
6525 key = PyLong_FromSsize_t(i);
6526 if (key == NULL)
6527 goto error;
6528 status = PyDict_SetItem(new_memo, key, value);
6529 Py_DECREF(key);
6530 if (status < 0)
6531 goto error;
6532 }
6533 return new_memo;
6534
6535error:
6536 Py_DECREF(new_memo);
6537 return NULL;
6538}
6539
Larry Hastings61272b72014-01-07 12:41:53 -08006540/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006541_pickle.UnpicklerMemoProxy.__reduce__
6542
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006543Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08006544[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006545
Larry Hastings3cceb382014-01-04 11:09:09 -08006546static PyObject *
6547_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006548/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006549{
6550 PyObject *reduce_value;
6551 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08006552 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006553 if (contents == NULL)
6554 return NULL;
6555
6556 reduce_value = PyTuple_New(2);
6557 if (reduce_value == NULL) {
6558 Py_DECREF(contents);
6559 return NULL;
6560 }
6561 constructor_args = PyTuple_New(1);
6562 if (constructor_args == NULL) {
6563 Py_DECREF(contents);
6564 Py_DECREF(reduce_value);
6565 return NULL;
6566 }
6567 PyTuple_SET_ITEM(constructor_args, 0, contents);
6568 Py_INCREF((PyObject *)&PyDict_Type);
6569 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6570 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6571 return reduce_value;
6572}
6573
6574static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006575 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6576 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6577 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006578 {NULL, NULL} /* sentinel */
6579};
6580
6581static void
6582UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6583{
6584 PyObject_GC_UnTrack(self);
6585 Py_XDECREF(self->unpickler);
6586 PyObject_GC_Del((PyObject *)self);
6587}
6588
6589static int
6590UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6591 visitproc visit, void *arg)
6592{
6593 Py_VISIT(self->unpickler);
6594 return 0;
6595}
6596
6597static int
6598UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6599{
6600 Py_CLEAR(self->unpickler);
6601 return 0;
6602}
6603
6604static PyTypeObject UnpicklerMemoProxyType = {
6605 PyVarObject_HEAD_INIT(NULL, 0)
6606 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6607 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6608 0,
6609 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6610 0, /* tp_print */
6611 0, /* tp_getattr */
6612 0, /* tp_setattr */
6613 0, /* tp_compare */
6614 0, /* tp_repr */
6615 0, /* tp_as_number */
6616 0, /* tp_as_sequence */
6617 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006618 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006619 0, /* tp_call */
6620 0, /* tp_str */
6621 PyObject_GenericGetAttr, /* tp_getattro */
6622 PyObject_GenericSetAttr, /* tp_setattro */
6623 0, /* tp_as_buffer */
6624 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6625 0, /* tp_doc */
6626 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6627 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6628 0, /* tp_richcompare */
6629 0, /* tp_weaklistoffset */
6630 0, /* tp_iter */
6631 0, /* tp_iternext */
6632 unpicklerproxy_methods, /* tp_methods */
6633};
6634
6635static PyObject *
6636UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6637{
6638 UnpicklerMemoProxyObject *self;
6639
6640 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6641 &UnpicklerMemoProxyType);
6642 if (self == NULL)
6643 return NULL;
6644 Py_INCREF(unpickler);
6645 self->unpickler = unpickler;
6646 PyObject_GC_Track(self);
6647 return (PyObject *)self;
6648}
6649
6650/*****************************************************************************/
6651
6652
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006653static PyObject *
6654Unpickler_get_memo(UnpicklerObject *self)
6655{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006656 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006657}
6658
6659static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006660Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006661{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006662 PyObject **new_memo;
6663 Py_ssize_t new_memo_size = 0;
6664 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006665
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006666 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006667 PyErr_SetString(PyExc_TypeError,
6668 "attribute deletion is not supported");
6669 return -1;
6670 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006671
6672 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6673 UnpicklerObject *unpickler =
6674 ((UnpicklerMemoProxyObject *)obj)->unpickler;
6675
6676 new_memo_size = unpickler->memo_size;
6677 new_memo = _Unpickler_NewMemo(new_memo_size);
6678 if (new_memo == NULL)
6679 return -1;
6680
6681 for (i = 0; i < new_memo_size; i++) {
6682 Py_XINCREF(unpickler->memo[i]);
6683 new_memo[i] = unpickler->memo[i];
6684 }
6685 }
6686 else if (PyDict_Check(obj)) {
6687 Py_ssize_t i = 0;
6688 PyObject *key, *value;
6689
6690 new_memo_size = PyDict_Size(obj);
6691 new_memo = _Unpickler_NewMemo(new_memo_size);
6692 if (new_memo == NULL)
6693 return -1;
6694
6695 while (PyDict_Next(obj, &i, &key, &value)) {
6696 Py_ssize_t idx;
6697 if (!PyLong_Check(key)) {
6698 PyErr_SetString(PyExc_TypeError,
6699 "memo key must be integers");
6700 goto error;
6701 }
6702 idx = PyLong_AsSsize_t(key);
6703 if (idx == -1 && PyErr_Occurred())
6704 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02006705 if (idx < 0) {
6706 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02006707 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02006708 goto error;
6709 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006710 if (_Unpickler_MemoPut(self, idx, value) < 0)
6711 goto error;
6712 }
6713 }
6714 else {
6715 PyErr_Format(PyExc_TypeError,
6716 "'memo' attribute must be an UnpicklerMemoProxy object"
6717 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006718 return -1;
6719 }
6720
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006721 _Unpickler_MemoCleanup(self);
6722 self->memo_size = new_memo_size;
6723 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006724
6725 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006726
6727 error:
6728 if (new_memo_size) {
6729 i = new_memo_size;
6730 while (--i >= 0) {
6731 Py_XDECREF(new_memo[i]);
6732 }
6733 PyMem_FREE(new_memo);
6734 }
6735 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006736}
6737
6738static PyObject *
6739Unpickler_get_persload(UnpicklerObject *self)
6740{
6741 if (self->pers_func == NULL)
6742 PyErr_SetString(PyExc_AttributeError, "persistent_load");
6743 else
6744 Py_INCREF(self->pers_func);
6745 return self->pers_func;
6746}
6747
6748static int
6749Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
6750{
6751 PyObject *tmp;
6752
6753 if (value == NULL) {
6754 PyErr_SetString(PyExc_TypeError,
6755 "attribute deletion is not supported");
6756 return -1;
6757 }
6758 if (!PyCallable_Check(value)) {
6759 PyErr_SetString(PyExc_TypeError,
6760 "persistent_load must be a callable taking "
6761 "one argument");
6762 return -1;
6763 }
6764
6765 tmp = self->pers_func;
6766 Py_INCREF(value);
6767 self->pers_func = value;
6768 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
6769
6770 return 0;
6771}
6772
6773static PyGetSetDef Unpickler_getsets[] = {
6774 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
6775 {"persistent_load", (getter)Unpickler_get_persload,
6776 (setter)Unpickler_set_persload},
6777 {NULL}
6778};
6779
6780static PyTypeObject Unpickler_Type = {
6781 PyVarObject_HEAD_INIT(NULL, 0)
6782 "_pickle.Unpickler", /*tp_name*/
6783 sizeof(UnpicklerObject), /*tp_basicsize*/
6784 0, /*tp_itemsize*/
6785 (destructor)Unpickler_dealloc, /*tp_dealloc*/
6786 0, /*tp_print*/
6787 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006788 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00006789 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006790 0, /*tp_repr*/
6791 0, /*tp_as_number*/
6792 0, /*tp_as_sequence*/
6793 0, /*tp_as_mapping*/
6794 0, /*tp_hash*/
6795 0, /*tp_call*/
6796 0, /*tp_str*/
6797 0, /*tp_getattro*/
6798 0, /*tp_setattro*/
6799 0, /*tp_as_buffer*/
6800 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006801 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006802 (traverseproc)Unpickler_traverse, /*tp_traverse*/
6803 (inquiry)Unpickler_clear, /*tp_clear*/
6804 0, /*tp_richcompare*/
6805 0, /*tp_weaklistoffset*/
6806 0, /*tp_iter*/
6807 0, /*tp_iternext*/
6808 Unpickler_methods, /*tp_methods*/
6809 0, /*tp_members*/
6810 Unpickler_getsets, /*tp_getset*/
6811 0, /*tp_base*/
6812 0, /*tp_dict*/
6813 0, /*tp_descr_get*/
6814 0, /*tp_descr_set*/
6815 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006816 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006817 PyType_GenericAlloc, /*tp_alloc*/
6818 PyType_GenericNew, /*tp_new*/
6819 PyObject_GC_Del, /*tp_free*/
6820 0, /*tp_is_gc*/
6821};
6822
Larry Hastings61272b72014-01-07 12:41:53 -08006823/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006824
6825_pickle.dump
6826
6827 obj: object
6828 file: object
6829 protocol: object = NULL
6830 *
6831 fix_imports: bool = True
6832
6833Write a pickled representation of obj to the open file object file.
6834
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006835This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
6836be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006837
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006838The optional *protocol* argument tells the pickler to use the given
6839protocol supported protocols are 0, 1, 2, 3 and 4. The default
6840protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006841
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006842Specifying a negative protocol version selects the highest protocol
6843version supported. The higher the protocol used, the more recent the
6844version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006845
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006846The *file* argument must have a write() method that accepts a single
6847bytes argument. It can thus be a file object opened for binary
6848writing, a io.BytesIO instance, or any other custom object that meets
6849this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006850
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006851If *fix_imports* is True and protocol is less than 3, pickle will try
6852to map the new Python 3 names to the old module names used in Python
68532, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006854[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006855
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006856static PyObject *
6857_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports)
Larry Hastings581ee362014-01-28 05:00:08 -08006858/*[clinic end generated code: output=a606e626d553850d input=e9e5fdd48de92eae]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006859{
6860 PicklerObject *pickler = _Pickler_New();
6861
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006862 if (pickler == NULL)
6863 return NULL;
6864
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006865 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006866 goto error;
6867
6868 if (_Pickler_SetOutputStream(pickler, file) < 0)
6869 goto error;
6870
6871 if (dump(pickler, obj) < 0)
6872 goto error;
6873
6874 if (_Pickler_FlushToFile(pickler) < 0)
6875 goto error;
6876
6877 Py_DECREF(pickler);
6878 Py_RETURN_NONE;
6879
6880 error:
6881 Py_XDECREF(pickler);
6882 return NULL;
6883}
6884
Larry Hastings61272b72014-01-07 12:41:53 -08006885/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006886
6887_pickle.dumps
6888
6889 obj: object
6890 protocol: object = NULL
6891 *
6892 fix_imports: bool = True
6893
6894Return the pickled representation of the object as a bytes object.
6895
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006896The optional *protocol* argument tells the pickler to use the given
6897protocol; supported protocols are 0, 1, 2, 3 and 4. The default
6898protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006899
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006900Specifying a negative protocol version selects the highest protocol
6901version supported. The higher the protocol used, the more recent the
6902version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006903
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006904If *fix_imports* is True and *protocol* is less than 3, pickle will
6905try to map the new Python 3 names to the old module names used in
6906Python 2, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006907[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006908
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006909static PyObject *
6910_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol, int fix_imports)
Larry Hastings581ee362014-01-28 05:00:08 -08006911/*[clinic end generated code: output=777f0deefe5b88ee input=293dbeda181580b7]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006912{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006913 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006914 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006915
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006916 if (pickler == NULL)
6917 return NULL;
6918
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006919 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006920 goto error;
6921
6922 if (dump(pickler, obj) < 0)
6923 goto error;
6924
6925 result = _Pickler_GetString(pickler);
6926 Py_DECREF(pickler);
6927 return result;
6928
6929 error:
6930 Py_XDECREF(pickler);
6931 return NULL;
6932}
6933
Larry Hastings61272b72014-01-07 12:41:53 -08006934/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006935
6936_pickle.load
6937
6938 file: object
6939 *
6940 fix_imports: bool = True
6941 encoding: str = 'ASCII'
6942 errors: str = 'strict'
6943
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006944Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006945
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006946This is equivalent to ``Unpickler(file).load()``, but may be more
6947efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006948
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006949The protocol version of the pickle is detected automatically, so no
6950protocol argument is needed. Bytes past the pickled object's
6951representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006952
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006953The argument *file* must have two methods, a read() method that takes
6954an integer argument, and a readline() method that requires no
6955arguments. Both methods should return bytes. Thus *file* can be a
6956binary file object opened for reading, a io.BytesIO object, or any
6957other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006958
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006959Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6960which are used to control compatiblity support for pickle stream
6961generated by Python 2. If *fix_imports* is True, pickle will try to
6962map the old Python 2 names to the new names used in Python 3. The
6963*encoding* and *errors* tell pickle how to decode 8-bit string
6964instances pickled by Python 2; these default to 'ASCII' and 'strict',
6965respectively. The *encoding* can be 'bytes' to read these 8-bit
6966string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006967[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006968
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006969static PyObject *
6970_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports, const char *encoding, const char *errors)
Larry Hastings581ee362014-01-28 05:00:08 -08006971/*[clinic end generated code: output=568c61356c172654 input=da97372e38e510a6]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006972{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006973 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006974 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006975
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006976 if (unpickler == NULL)
6977 return NULL;
6978
6979 if (_Unpickler_SetInputStream(unpickler, file) < 0)
6980 goto error;
6981
6982 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
6983 goto error;
6984
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006985 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006986
6987 result = load(unpickler);
6988 Py_DECREF(unpickler);
6989 return result;
6990
6991 error:
6992 Py_XDECREF(unpickler);
6993 return NULL;
6994}
6995
Larry Hastings61272b72014-01-07 12:41:53 -08006996/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006997
6998_pickle.loads
6999
7000 data: object
7001 *
7002 fix_imports: bool = True
7003 encoding: str = 'ASCII'
7004 errors: str = 'strict'
7005
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007006Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007007
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007008The protocol version of the pickle is detected automatically, so no
7009protocol argument is needed. Bytes past the pickled object's
7010representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007011
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007012Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
7013which are used to control compatiblity support for pickle stream
7014generated by Python 2. If *fix_imports* is True, pickle will try to
7015map the old Python 2 names to the new names used in Python 3. The
7016*encoding* and *errors* tell pickle how to decode 8-bit string
7017instances pickled by Python 2; these default to 'ASCII' and 'strict',
7018respectively. The *encoding* can be 'bytes' to read these 8-bit
7019string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007020[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007021
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007022static PyObject *
7023_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports, const char *encoding, const char *errors)
Larry Hastings581ee362014-01-28 05:00:08 -08007024/*[clinic end generated code: output=0b3845ad110b2522 input=f57f0fdaa2b4cb8b]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007025{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007026 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007027 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007028
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007029 if (unpickler == NULL)
7030 return NULL;
7031
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007032 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007033 goto error;
7034
7035 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7036 goto error;
7037
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007038 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007039
7040 result = load(unpickler);
7041 Py_DECREF(unpickler);
7042 return result;
7043
7044 error:
7045 Py_XDECREF(unpickler);
7046 return NULL;
7047}
7048
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007049static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007050 _PICKLE_DUMP_METHODDEF
7051 _PICKLE_DUMPS_METHODDEF
7052 _PICKLE_LOAD_METHODDEF
7053 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007054 {NULL, NULL} /* sentinel */
7055};
7056
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007057static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007058pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007059{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007060 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007061 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007062}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007063
Stefan Krahf483b0f2013-12-14 13:43:10 +01007064static void
7065pickle_free(PyObject *m)
7066{
7067 _Pickle_ClearState(_Pickle_GetState(m));
7068}
7069
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007070static int
7071pickle_traverse(PyObject *m, visitproc visit, void *arg)
7072{
7073 PickleState *st = _Pickle_GetState(m);
7074 Py_VISIT(st->PickleError);
7075 Py_VISIT(st->PicklingError);
7076 Py_VISIT(st->UnpicklingError);
7077 Py_VISIT(st->dispatch_table);
7078 Py_VISIT(st->extension_registry);
7079 Py_VISIT(st->extension_cache);
7080 Py_VISIT(st->inverted_registry);
7081 Py_VISIT(st->name_mapping_2to3);
7082 Py_VISIT(st->import_mapping_2to3);
7083 Py_VISIT(st->name_mapping_3to2);
7084 Py_VISIT(st->import_mapping_3to2);
7085 Py_VISIT(st->codecs_encode);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007086 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007087}
7088
7089static struct PyModuleDef _picklemodule = {
7090 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007091 "_pickle", /* m_name */
7092 pickle_module_doc, /* m_doc */
7093 sizeof(PickleState), /* m_size */
7094 pickle_methods, /* m_methods */
7095 NULL, /* m_reload */
7096 pickle_traverse, /* m_traverse */
7097 pickle_clear, /* m_clear */
7098 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007099};
7100
7101PyMODINIT_FUNC
7102PyInit__pickle(void)
7103{
7104 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007105 PickleState *st;
7106
7107 m = PyState_FindModule(&_picklemodule);
7108 if (m) {
7109 Py_INCREF(m);
7110 return m;
7111 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007112
7113 if (PyType_Ready(&Unpickler_Type) < 0)
7114 return NULL;
7115 if (PyType_Ready(&Pickler_Type) < 0)
7116 return NULL;
7117 if (PyType_Ready(&Pdata_Type) < 0)
7118 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007119 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7120 return NULL;
7121 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7122 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007123
7124 /* Create the module and add the functions. */
7125 m = PyModule_Create(&_picklemodule);
7126 if (m == NULL)
7127 return NULL;
7128
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007129 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007130 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7131 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007132 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007133 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7134 return NULL;
7135
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007136 st = _Pickle_GetState(m);
7137
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007138 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007139 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7140 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007141 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007142 st->PicklingError = \
7143 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7144 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007145 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007146 st->UnpicklingError = \
7147 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7148 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007149 return NULL;
7150
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007151 Py_INCREF(st->PickleError);
7152 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007153 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007154 Py_INCREF(st->PicklingError);
7155 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007156 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007157 Py_INCREF(st->UnpicklingError);
7158 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007159 return NULL;
7160
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007161 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007162 return NULL;
7163
7164 return m;
7165}