blob: ecf0c6ca9533c73f30a51f9703ae67e542e497ca [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 Pitrou6cd5eda2014-12-02 00:20:03 +01001550 if (obj == NULL)
1551 PyErr_Format(PyExc_AttributeError,
1552 "Can't pickle qualified object %R; "
1553 "use protocols >= 4 to enable support",
1554 name);
1555 else
1556 PyErr_Format(PyExc_AttributeError,
1557 "Can't pickle qualified attribute %R on %R; "
1558 "use protocols >= 4 to enable support",
1559 name, obj);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001560 Py_DECREF(dotted_path);
1561 return NULL;
1562 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001563 for (i = 0; i < n; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001564 PyObject *subpath = PyList_GET_ITEM(dotted_path, i);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001565 PyObject *result = PyUnicode_RichCompare(
1566 subpath, _PyUnicode_FromId(&PyId_locals), Py_EQ);
1567 int is_equal = (result == Py_True);
1568 assert(PyBool_Check(result));
1569 Py_DECREF(result);
1570 if (is_equal) {
Antoine Pitrou6cd5eda2014-12-02 00:20:03 +01001571 if (obj == NULL)
1572 PyErr_Format(PyExc_AttributeError,
1573 "Can't pickle local object %R", name);
1574 else
1575 PyErr_Format(PyExc_AttributeError,
1576 "Can't pickle local attribute %R on %R", name, obj);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001577 Py_DECREF(dotted_path);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001578 return NULL;
1579 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001580 }
1581 return dotted_path;
1582}
1583
1584static PyObject *
1585get_deep_attribute(PyObject *obj, PyObject *names)
1586{
1587 Py_ssize_t i, n;
1588
1589 assert(PyList_CheckExact(names));
1590 Py_INCREF(obj);
1591 n = PyList_GET_SIZE(names);
1592 for (i = 0; i < n; i++) {
1593 PyObject *name = PyList_GET_ITEM(names, i);
1594 PyObject *tmp;
1595 tmp = PyObject_GetAttr(obj, name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001596 Py_DECREF(obj);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001597 if (tmp == NULL)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001598 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001599 obj = tmp;
1600 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001601 return obj;
1602}
1603
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001604static void
1605reformat_attribute_error(PyObject *obj, PyObject *name)
1606{
1607 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1608 PyErr_Clear();
1609 PyErr_Format(PyExc_AttributeError,
1610 "Can't get attribute %R on %R", name, obj);
1611 }
1612}
1613
1614
1615static PyObject *
1616getattribute(PyObject *obj, PyObject *name, int allow_qualname)
1617{
1618 PyObject *dotted_path, *attr;
1619
1620 dotted_path = get_dotted_path(obj, name, allow_qualname);
1621 if (dotted_path == NULL)
1622 return NULL;
1623 attr = get_deep_attribute(obj, dotted_path);
1624 Py_DECREF(dotted_path);
1625 if (attr == NULL)
1626 reformat_attribute_error(obj, name);
1627 return attr;
1628}
1629
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001630static PyObject *
1631whichmodule(PyObject *global, PyObject *global_name, int allow_qualname)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001632{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001633 PyObject *module_name;
1634 PyObject *modules_dict;
1635 PyObject *module;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001636 Py_ssize_t i;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001637 _Py_IDENTIFIER(__module__);
1638 _Py_IDENTIFIER(modules);
1639 _Py_IDENTIFIER(__main__);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001640 PyObject *dotted_path;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001641
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001642 module_name = _PyObject_GetAttrId(global, &PyId___module__);
1643
1644 if (module_name == NULL) {
1645 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001646 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001647 PyErr_Clear();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001648 }
1649 else {
1650 /* In some rare cases (e.g., bound methods of extension types),
1651 __module__ can be None. If it is so, then search sys.modules for
1652 the module of global. */
1653 if (module_name != Py_None)
1654 return module_name;
1655 Py_CLEAR(module_name);
1656 }
1657 assert(module_name == NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001658
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001659 /* Fallback on walking sys.modules */
Victor Stinnerbb520202013-11-06 22:40:41 +01001660 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02001661 if (modules_dict == NULL) {
1662 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001663 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02001664 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001665
Antoine Pitrou6cd5eda2014-12-02 00:20:03 +01001666 dotted_path = get_dotted_path(NULL, global_name, allow_qualname);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001667 if (dotted_path == NULL)
1668 return NULL;
1669
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001670 i = 0;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001671 while (PyDict_Next(modules_dict, &i, &module_name, &module)) {
1672 PyObject *candidate;
1673 if (PyUnicode_Check(module_name) &&
1674 !PyUnicode_CompareWithASCIIString(module_name, "__main__"))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001675 continue;
1676 if (module == Py_None)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001677 continue;
1678
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001679 candidate = get_deep_attribute(module, dotted_path);
1680 if (candidate == NULL) {
1681 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1682 Py_DECREF(dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001683 return NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001684 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001685 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001686 continue;
1687 }
1688
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001689 if (candidate == global) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001690 Py_INCREF(module_name);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001691 Py_DECREF(dotted_path);
1692 Py_DECREF(candidate);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001693 return module_name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001694 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001695 Py_DECREF(candidate);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001696 }
1697
1698 /* If no module is found, use __main__. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001699 module_name = _PyUnicode_FromId(&PyId___main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001700 Py_INCREF(module_name);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001701 Py_DECREF(dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001702 return module_name;
1703}
1704
1705/* fast_save_enter() and fast_save_leave() are guards against recursive
1706 objects when Pickler is used with the "fast mode" (i.e., with object
1707 memoization disabled). If the nesting of a list or dict object exceed
1708 FAST_NESTING_LIMIT, these guards will start keeping an internal
1709 reference to the seen list or dict objects and check whether these objects
1710 are recursive. These are not strictly necessary, since save() has a
1711 hard-coded recursion limit, but they give a nicer error message than the
1712 typical RuntimeError. */
1713static int
1714fast_save_enter(PicklerObject *self, PyObject *obj)
1715{
1716 /* if fast_nesting < 0, we're doing an error exit. */
1717 if (++self->fast_nesting >= FAST_NESTING_LIMIT) {
1718 PyObject *key = NULL;
1719 if (self->fast_memo == NULL) {
1720 self->fast_memo = PyDict_New();
1721 if (self->fast_memo == NULL) {
1722 self->fast_nesting = -1;
1723 return 0;
1724 }
1725 }
1726 key = PyLong_FromVoidPtr(obj);
1727 if (key == NULL)
1728 return 0;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001729 if (PyDict_GetItemWithError(self->fast_memo, key)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001730 Py_DECREF(key);
1731 PyErr_Format(PyExc_ValueError,
1732 "fast mode: can't pickle cyclic objects "
1733 "including object type %.200s at %p",
1734 obj->ob_type->tp_name, obj);
1735 self->fast_nesting = -1;
1736 return 0;
1737 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001738 if (PyErr_Occurred()) {
1739 return 0;
1740 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001741 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
1742 Py_DECREF(key);
1743 self->fast_nesting = -1;
1744 return 0;
1745 }
1746 Py_DECREF(key);
1747 }
1748 return 1;
1749}
1750
1751static int
1752fast_save_leave(PicklerObject *self, PyObject *obj)
1753{
1754 if (self->fast_nesting-- >= FAST_NESTING_LIMIT) {
1755 PyObject *key = PyLong_FromVoidPtr(obj);
1756 if (key == NULL)
1757 return 0;
1758 if (PyDict_DelItem(self->fast_memo, key) < 0) {
1759 Py_DECREF(key);
1760 return 0;
1761 }
1762 Py_DECREF(key);
1763 }
1764 return 1;
1765}
1766
1767static int
1768save_none(PicklerObject *self, PyObject *obj)
1769{
1770 const char none_op = NONE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001771 if (_Pickler_Write(self, &none_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001772 return -1;
1773
1774 return 0;
1775}
1776
1777static int
1778save_bool(PicklerObject *self, PyObject *obj)
1779{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001780 if (self->proto >= 2) {
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001781 const char bool_op = (obj == Py_True) ? NEWTRUE : NEWFALSE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001782 if (_Pickler_Write(self, &bool_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001783 return -1;
1784 }
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001785 else {
1786 /* These aren't opcodes -- they're ways to pickle bools before protocol 2
1787 * so that unpicklers written before bools were introduced unpickle them
1788 * as ints, but unpicklers after can recognize that bools were intended.
1789 * Note that protocol 2 added direct ways to pickle bools.
1790 */
1791 const char *bool_str = (obj == Py_True) ? "I01\n" : "I00\n";
1792 if (_Pickler_Write(self, bool_str, strlen(bool_str)) < 0)
1793 return -1;
1794 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001795 return 0;
1796}
1797
1798static int
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001799save_long(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001800{
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001801 PyObject *repr = NULL;
1802 Py_ssize_t size;
1803 long val;
1804 int status = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001805
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001806 const char long_op = LONG;
1807
1808 val= PyLong_AsLong(obj);
1809 if (val == -1 && PyErr_Occurred()) {
1810 /* out of range for int pickling */
1811 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001812 }
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001813 else if (self->bin &&
1814 (sizeof(long) <= 4 ||
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001815 (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1)))) {
Larry Hastings61272b72014-01-07 12:41:53 -08001816 /* result fits in a signed 4-byte integer.
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001817
1818 Note: we can't use -0x80000000L in the above condition because some
1819 compilers (e.g., MSVC) will promote 0x80000000L to an unsigned type
1820 before applying the unary minus when sizeof(long) <= 4. The
1821 resulting value stays unsigned which is commonly not what we want,
1822 so MSVC happily warns us about it. However, that result would have
1823 been fine because we guard for sizeof(long) <= 4 which turns the
1824 condition true in that particular case. */
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001825 char pdata[32];
1826 Py_ssize_t len = 0;
1827
1828 pdata[1] = (unsigned char)(val & 0xff);
1829 pdata[2] = (unsigned char)((val >> 8) & 0xff);
1830 pdata[3] = (unsigned char)((val >> 16) & 0xff);
1831 pdata[4] = (unsigned char)((val >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001832
1833 if ((pdata[4] == 0) && (pdata[3] == 0)) {
1834 if (pdata[2] == 0) {
1835 pdata[0] = BININT1;
1836 len = 2;
1837 }
1838 else {
1839 pdata[0] = BININT2;
1840 len = 3;
1841 }
1842 }
1843 else {
1844 pdata[0] = BININT;
1845 len = 5;
1846 }
1847
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001848 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001849 return -1;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001850
1851 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001852 }
1853
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001854 if (self->proto >= 2) {
1855 /* Linear-time pickling. */
1856 size_t nbits;
1857 size_t nbytes;
1858 unsigned char *pdata;
1859 char header[5];
1860 int i;
1861 int sign = _PyLong_Sign(obj);
1862
1863 if (sign == 0) {
1864 header[0] = LONG1;
1865 header[1] = 0; /* It's 0 -- an empty bytestring. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001866 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001867 goto error;
1868 return 0;
1869 }
1870 nbits = _PyLong_NumBits(obj);
1871 if (nbits == (size_t)-1 && PyErr_Occurred())
1872 goto error;
1873 /* How many bytes do we need? There are nbits >> 3 full
1874 * bytes of data, and nbits & 7 leftover bits. If there
1875 * are any leftover bits, then we clearly need another
1876 * byte. Wnat's not so obvious is that we *probably*
1877 * need another byte even if there aren't any leftovers:
1878 * the most-significant bit of the most-significant byte
1879 * acts like a sign bit, and it's usually got a sense
Serhiy Storchaka95949422013-08-27 19:40:23 +03001880 * opposite of the one we need. The exception is ints
1881 * of the form -(2**(8*j-1)) for j > 0. Such an int is
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001882 * its own 256's-complement, so has the right sign bit
1883 * even without the extra byte. That's a pain to check
1884 * for in advance, though, so we always grab an extra
1885 * byte at the start, and cut it back later if possible.
1886 */
1887 nbytes = (nbits >> 3) + 1;
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001888 if (nbytes > 0x7fffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001889 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03001890 "int too large to pickle");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001891 goto error;
1892 }
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001893 repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001894 if (repr == NULL)
1895 goto error;
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001896 pdata = (unsigned char *)PyBytes_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001897 i = _PyLong_AsByteArray((PyLongObject *)obj,
1898 pdata, nbytes,
1899 1 /* little endian */ , 1 /* signed */ );
1900 if (i < 0)
1901 goto error;
Serhiy Storchaka95949422013-08-27 19:40:23 +03001902 /* If the int is negative, this may be a byte more than
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001903 * needed. This is so iff the MSB is all redundant sign
1904 * bits.
1905 */
1906 if (sign < 0 &&
Victor Stinner121aab42011-09-29 23:40:53 +02001907 nbytes > 1 &&
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001908 pdata[nbytes - 1] == 0xff &&
1909 (pdata[nbytes - 2] & 0x80) != 0) {
1910 nbytes--;
1911 }
1912
1913 if (nbytes < 256) {
1914 header[0] = LONG1;
1915 header[1] = (unsigned char)nbytes;
1916 size = 2;
1917 }
1918 else {
1919 header[0] = LONG4;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001920 size = (Py_ssize_t) nbytes;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001921 for (i = 1; i < 5; i++) {
1922 header[i] = (unsigned char)(size & 0xff);
1923 size >>= 8;
1924 }
1925 size = 5;
1926 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001927 if (_Pickler_Write(self, header, size) < 0 ||
1928 _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001929 goto error;
1930 }
1931 else {
1932 char *string;
1933
Mark Dickinson8dd05142009-01-20 20:43:58 +00001934 /* proto < 2: write the repr and newline. This is quadratic-time (in
1935 the number of digits), in both directions. We add a trailing 'L'
1936 to the repr, for compatibility with Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001937
1938 repr = PyObject_Repr(obj);
1939 if (repr == NULL)
1940 goto error;
1941
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001942 string = _PyUnicode_AsStringAndSize(repr, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001943 if (string == NULL)
1944 goto error;
1945
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001946 if (_Pickler_Write(self, &long_op, 1) < 0 ||
1947 _Pickler_Write(self, string, size) < 0 ||
1948 _Pickler_Write(self, "L\n", 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001949 goto error;
1950 }
1951
1952 if (0) {
1953 error:
1954 status = -1;
1955 }
1956 Py_XDECREF(repr);
1957
1958 return status;
1959}
1960
1961static int
1962save_float(PicklerObject *self, PyObject *obj)
1963{
1964 double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj);
1965
1966 if (self->bin) {
1967 char pdata[9];
1968 pdata[0] = BINFLOAT;
1969 if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0)
1970 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001971 if (_Pickler_Write(self, pdata, 9) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001972 return -1;
Victor Stinner121aab42011-09-29 23:40:53 +02001973 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001974 else {
Eric Smith0923d1d2009-04-16 20:16:10 +00001975 int result = -1;
1976 char *buf = NULL;
1977 char op = FLOAT;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001978
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001979 if (_Pickler_Write(self, &op, 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001980 goto done;
1981
Mark Dickinson3e09f432009-04-17 08:41:23 +00001982 buf = PyOS_double_to_string(x, 'g', 17, 0, NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +00001983 if (!buf) {
1984 PyErr_NoMemory();
1985 goto done;
1986 }
1987
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001988 if (_Pickler_Write(self, buf, strlen(buf)) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001989 goto done;
1990
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001991 if (_Pickler_Write(self, "\n", 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001992 goto done;
1993
1994 result = 0;
1995done:
1996 PyMem_Free(buf);
1997 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001998 }
1999
2000 return 0;
2001}
2002
2003static int
2004save_bytes(PicklerObject *self, PyObject *obj)
2005{
2006 if (self->proto < 3) {
2007 /* Older pickle protocols do not have an opcode for pickling bytes
2008 objects. Therefore, we need to fake the copy protocol (i.e.,
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002009 the __reduce__ method) to permit bytes object unpickling.
2010
2011 Here we use a hack to be compatible with Python 2. Since in Python
2012 2 'bytes' is just an alias for 'str' (which has different
2013 parameters than the actual bytes object), we use codecs.encode
2014 to create the appropriate 'str' object when unpickled using
2015 Python 2 *and* the appropriate 'bytes' object when unpickled
2016 using Python 3. Again this is a hack and we don't need to do this
2017 with newer protocols. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002018 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002019 int status;
2020
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002021 if (PyBytes_GET_SIZE(obj) == 0) {
2022 reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type);
2023 }
2024 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002025 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002026 PyObject *unicode_str =
2027 PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj),
2028 PyBytes_GET_SIZE(obj),
2029 "strict");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002030 _Py_IDENTIFIER(latin1);
2031
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002032 if (unicode_str == NULL)
2033 return -1;
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002034 reduce_value = Py_BuildValue("(O(OO))",
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002035 st->codecs_encode, unicode_str,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002036 _PyUnicode_FromId(&PyId_latin1));
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002037 Py_DECREF(unicode_str);
2038 }
2039
2040 if (reduce_value == NULL)
2041 return -1;
2042
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002043 /* save_reduce() will memoize the object automatically. */
2044 status = save_reduce(self, reduce_value, obj);
2045 Py_DECREF(reduce_value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002046 return status;
2047 }
2048 else {
2049 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002050 char header[9];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002051 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002052
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002053 size = PyBytes_GET_SIZE(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002054 if (size < 0)
2055 return -1;
2056
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002057 if (size <= 0xff) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002058 header[0] = SHORT_BINBYTES;
2059 header[1] = (unsigned char)size;
2060 len = 2;
2061 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03002062 else if ((size_t)size <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002063 header[0] = BINBYTES;
2064 header[1] = (unsigned char)(size & 0xff);
2065 header[2] = (unsigned char)((size >> 8) & 0xff);
2066 header[3] = (unsigned char)((size >> 16) & 0xff);
2067 header[4] = (unsigned char)((size >> 24) & 0xff);
2068 len = 5;
2069 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002070 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002071 header[0] = BINBYTES8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002072 _write_size64(header + 1, size);
Alexandre Vassalotti6e73ff12013-12-05 19:29:32 -08002073 len = 9;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002074 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002075 else {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002076 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakaf8def282013-02-16 17:29:56 +02002077 "cannot serialize a bytes object larger than 4 GiB");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002078 return -1; /* string too large */
2079 }
2080
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002081 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002082 return -1;
2083
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002084 if (_Pickler_Write(self, PyBytes_AS_STRING(obj), size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002085 return -1;
2086
2087 if (memo_put(self, obj) < 0)
2088 return -1;
2089
2090 return 0;
2091 }
2092}
2093
2094/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
2095 backslash and newline characters to \uXXXX escapes. */
2096static PyObject *
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002097raw_unicode_escape(PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002098{
Victor Stinner7270b7f2014-08-17 21:14:46 +02002099 PyObject *repr;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002100 char *p;
Victor Stinner049e5092014-08-17 22:20:00 +02002101 Py_ssize_t i, size;
2102 size_t expandsize;
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002103 void *data;
2104 unsigned int kind;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002105
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002106 if (PyUnicode_READY(obj))
2107 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002108
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002109 size = PyUnicode_GET_LENGTH(obj);
2110 data = PyUnicode_DATA(obj);
2111 kind = PyUnicode_KIND(obj);
2112 if (kind == PyUnicode_4BYTE_KIND)
2113 expandsize = 10;
2114 else
2115 expandsize = 6;
Victor Stinner121aab42011-09-29 23:40:53 +02002116
Victor Stinner049e5092014-08-17 22:20:00 +02002117 if ((size_t)size > (size_t)PY_SSIZE_T_MAX / expandsize)
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002118 return PyErr_NoMemory();
Victor Stinner7270b7f2014-08-17 21:14:46 +02002119 repr = PyBytes_FromStringAndSize(NULL, expandsize * size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002120 if (repr == NULL)
2121 return NULL;
2122 if (size == 0)
Victor Stinner7270b7f2014-08-17 21:14:46 +02002123 return repr;
2124 assert(Py_REFCNT(repr) == 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002125
Victor Stinner7270b7f2014-08-17 21:14:46 +02002126 p = PyBytes_AS_STRING(repr);
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002127 for (i=0; i < size; i++) {
2128 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002129 /* Map 32-bit characters to '\Uxxxxxxxx' */
2130 if (ch >= 0x10000) {
2131 *p++ = '\\';
2132 *p++ = 'U';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002133 *p++ = Py_hexdigits[(ch >> 28) & 0xf];
2134 *p++ = Py_hexdigits[(ch >> 24) & 0xf];
2135 *p++ = Py_hexdigits[(ch >> 20) & 0xf];
2136 *p++ = Py_hexdigits[(ch >> 16) & 0xf];
2137 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2138 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2139 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2140 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002141 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002142 /* Map 16-bit characters to '\uxxxx' */
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002143 else if (ch >= 256 || ch == '\\' || ch == '\n') {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002144 *p++ = '\\';
2145 *p++ = 'u';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002146 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2147 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2148 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2149 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002150 }
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002151 /* Copy everything else as-is */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002152 else
2153 *p++ = (char) ch;
2154 }
Victor Stinner7270b7f2014-08-17 21:14:46 +02002155 size = p - PyBytes_AS_STRING(repr);
2156 if (_PyBytes_Resize(&repr, size) < 0)
2157 return NULL;
2158 return repr;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002159}
2160
2161static int
Antoine Pitrou299978d2013-04-07 17:38:11 +02002162write_utf8(PicklerObject *self, char *data, Py_ssize_t size)
2163{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002164 char header[9];
2165 Py_ssize_t len;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002166
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002167 assert(size >= 0);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002168 if (size <= 0xff && self->proto >= 4) {
2169 header[0] = SHORT_BINUNICODE;
2170 header[1] = (unsigned char)(size & 0xff);
2171 len = 2;
2172 }
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002173 else if ((size_t)size <= 0xffffffffUL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002174 header[0] = BINUNICODE;
2175 header[1] = (unsigned char)(size & 0xff);
2176 header[2] = (unsigned char)((size >> 8) & 0xff);
2177 header[3] = (unsigned char)((size >> 16) & 0xff);
2178 header[4] = (unsigned char)((size >> 24) & 0xff);
2179 len = 5;
2180 }
2181 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002182 header[0] = BINUNICODE8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002183 _write_size64(header + 1, size);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002184 len = 9;
2185 }
2186 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002187 PyErr_SetString(PyExc_OverflowError,
Antoine Pitrou4b7b0f02013-04-07 23:46:52 +02002188 "cannot serialize a string larger than 4GiB");
Antoine Pitrou299978d2013-04-07 17:38:11 +02002189 return -1;
2190 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002191
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002192 if (_Pickler_Write(self, header, len) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002193 return -1;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002194 if (_Pickler_Write(self, data, size) < 0)
2195 return -1;
2196
2197 return 0;
2198}
2199
2200static int
2201write_unicode_binary(PicklerObject *self, PyObject *obj)
2202{
2203 PyObject *encoded = NULL;
2204 Py_ssize_t size;
2205 char *data;
2206 int r;
2207
2208 if (PyUnicode_READY(obj))
2209 return -1;
2210
2211 data = PyUnicode_AsUTF8AndSize(obj, &size);
2212 if (data != NULL)
2213 return write_utf8(self, data, size);
2214
2215 /* Issue #8383: for strings with lone surrogates, fallback on the
2216 "surrogatepass" error handler. */
2217 PyErr_Clear();
2218 encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
2219 if (encoded == NULL)
2220 return -1;
2221
2222 r = write_utf8(self, PyBytes_AS_STRING(encoded),
2223 PyBytes_GET_SIZE(encoded));
2224 Py_DECREF(encoded);
2225 return r;
2226}
2227
2228static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002229save_unicode(PicklerObject *self, PyObject *obj)
2230{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002231 if (self->bin) {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002232 if (write_unicode_binary(self, obj) < 0)
2233 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002234 }
2235 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002236 PyObject *encoded;
2237 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002238 const char unicode_op = UNICODE;
2239
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002240 encoded = raw_unicode_escape(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002241 if (encoded == NULL)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002242 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002243
Antoine Pitrou299978d2013-04-07 17:38:11 +02002244 if (_Pickler_Write(self, &unicode_op, 1) < 0) {
2245 Py_DECREF(encoded);
2246 return -1;
2247 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002248
2249 size = PyBytes_GET_SIZE(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002250 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
2251 Py_DECREF(encoded);
2252 return -1;
2253 }
2254 Py_DECREF(encoded);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002255
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002256 if (_Pickler_Write(self, "\n", 1) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002257 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002258 }
2259 if (memo_put(self, obj) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002260 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002261
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002262 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002263}
2264
2265/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
2266static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002267store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002268{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002269 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002270
2271 assert(PyTuple_Size(t) == len);
2272
2273 for (i = 0; i < len; i++) {
2274 PyObject *element = PyTuple_GET_ITEM(t, i);
2275
2276 if (element == NULL)
2277 return -1;
2278 if (save(self, element, 0) < 0)
2279 return -1;
2280 }
2281
2282 return 0;
2283}
2284
2285/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2286 * used across protocols to minimize the space needed to pickle them.
2287 * Tuples are also the only builtin immutable type that can be recursive
2288 * (a tuple can be reached from itself), and that requires some subtle
2289 * magic so that it works in all cases. IOW, this is a long routine.
2290 */
2291static int
2292save_tuple(PicklerObject *self, PyObject *obj)
2293{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002294 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002295
2296 const char mark_op = MARK;
2297 const char tuple_op = TUPLE;
2298 const char pop_op = POP;
2299 const char pop_mark_op = POP_MARK;
2300 const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2301
2302 if ((len = PyTuple_Size(obj)) < 0)
2303 return -1;
2304
2305 if (len == 0) {
2306 char pdata[2];
2307
2308 if (self->proto) {
2309 pdata[0] = EMPTY_TUPLE;
2310 len = 1;
2311 }
2312 else {
2313 pdata[0] = MARK;
2314 pdata[1] = TUPLE;
2315 len = 2;
2316 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002317 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002318 return -1;
2319 return 0;
2320 }
2321
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002322 /* The tuple isn't in the memo now. If it shows up there after
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002323 * saving the tuple elements, the tuple must be recursive, in
2324 * which case we'll pop everything we put on the stack, and fetch
2325 * its value from the memo.
2326 */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002327 if (len <= 3 && self->proto >= 2) {
2328 /* Use TUPLE{1,2,3} opcodes. */
2329 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002330 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002331
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002332 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002333 /* pop the len elements */
2334 for (i = 0; i < len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002335 if (_Pickler_Write(self, &pop_op, 1) < 0)
2336 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002337 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002338 if (memo_get(self, obj) < 0)
2339 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002340
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002341 return 0;
2342 }
2343 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002344 if (_Pickler_Write(self, len2opcode + len, 1) < 0)
2345 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002346 }
2347 goto memoize;
2348 }
2349
2350 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2351 * Generate MARK e1 e2 ... TUPLE
2352 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002353 if (_Pickler_Write(self, &mark_op, 1) < 0)
2354 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002355
2356 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002357 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002358
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002359 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002360 /* pop the stack stuff we pushed */
2361 if (self->bin) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002362 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2363 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002364 }
2365 else {
2366 /* Note that we pop one more than len, to remove
2367 * the MARK too.
2368 */
2369 for (i = 0; i <= len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002370 if (_Pickler_Write(self, &pop_op, 1) < 0)
2371 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002372 }
2373 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002374 if (memo_get(self, obj) < 0)
2375 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002376
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002377 return 0;
2378 }
2379 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002380 if (_Pickler_Write(self, &tuple_op, 1) < 0)
2381 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002382 }
2383
2384 memoize:
2385 if (memo_put(self, obj) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002386 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002387
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002388 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002389}
2390
2391/* iter is an iterator giving items, and we batch up chunks of
2392 * MARK item item ... item APPENDS
2393 * opcode sequences. Calling code should have arranged to first create an
2394 * empty list, or list-like object, for the APPENDS to operate on.
2395 * Returns 0 on success, <0 on error.
2396 */
2397static int
2398batch_list(PicklerObject *self, PyObject *iter)
2399{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002400 PyObject *obj = NULL;
2401 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002402 int i, n;
2403
2404 const char mark_op = MARK;
2405 const char append_op = APPEND;
2406 const char appends_op = APPENDS;
2407
2408 assert(iter != NULL);
2409
2410 /* XXX: I think this function could be made faster by avoiding the
2411 iterator interface and fetching objects directly from list using
2412 PyList_GET_ITEM.
2413 */
2414
2415 if (self->proto == 0) {
2416 /* APPENDS isn't available; do one at a time. */
2417 for (;;) {
2418 obj = PyIter_Next(iter);
2419 if (obj == NULL) {
2420 if (PyErr_Occurred())
2421 return -1;
2422 break;
2423 }
2424 i = save(self, obj, 0);
2425 Py_DECREF(obj);
2426 if (i < 0)
2427 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002428 if (_Pickler_Write(self, &append_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002429 return -1;
2430 }
2431 return 0;
2432 }
2433
2434 /* proto > 0: write in batches of BATCHSIZE. */
2435 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002436 /* Get first item */
2437 firstitem = PyIter_Next(iter);
2438 if (firstitem == NULL) {
2439 if (PyErr_Occurred())
2440 goto error;
2441
2442 /* nothing more to add */
2443 break;
2444 }
2445
2446 /* Try to get a second item */
2447 obj = PyIter_Next(iter);
2448 if (obj == NULL) {
2449 if (PyErr_Occurred())
2450 goto error;
2451
2452 /* Only one item to write */
2453 if (save(self, firstitem, 0) < 0)
2454 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002455 if (_Pickler_Write(self, &append_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002456 goto error;
2457 Py_CLEAR(firstitem);
2458 break;
2459 }
2460
2461 /* More than one item to write */
2462
2463 /* Pump out MARK, items, APPENDS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002464 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002465 goto error;
2466
2467 if (save(self, firstitem, 0) < 0)
2468 goto error;
2469 Py_CLEAR(firstitem);
2470 n = 1;
2471
2472 /* Fetch and save up to BATCHSIZE items */
2473 while (obj) {
2474 if (save(self, obj, 0) < 0)
2475 goto error;
2476 Py_CLEAR(obj);
2477 n += 1;
2478
2479 if (n == BATCHSIZE)
2480 break;
2481
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002482 obj = PyIter_Next(iter);
2483 if (obj == NULL) {
2484 if (PyErr_Occurred())
2485 goto error;
2486 break;
2487 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002488 }
2489
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002490 if (_Pickler_Write(self, &appends_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002491 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002492
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002493 } while (n == BATCHSIZE);
2494 return 0;
2495
2496 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002497 Py_XDECREF(firstitem);
2498 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002499 return -1;
2500}
2501
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002502/* This is a variant of batch_list() above, specialized for lists (with no
2503 * support for list subclasses). Like batch_list(), we batch up chunks of
2504 * MARK item item ... item APPENDS
2505 * opcode sequences. Calling code should have arranged to first create an
2506 * empty list, or list-like object, for the APPENDS to operate on.
2507 * Returns 0 on success, -1 on error.
2508 *
2509 * This version is considerably faster than batch_list(), if less general.
2510 *
2511 * Note that this only works for protocols > 0.
2512 */
2513static int
2514batch_list_exact(PicklerObject *self, PyObject *obj)
2515{
2516 PyObject *item = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002517 Py_ssize_t this_batch, total;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002518
2519 const char append_op = APPEND;
2520 const char appends_op = APPENDS;
2521 const char mark_op = MARK;
2522
2523 assert(obj != NULL);
2524 assert(self->proto > 0);
2525 assert(PyList_CheckExact(obj));
2526
2527 if (PyList_GET_SIZE(obj) == 1) {
2528 item = PyList_GET_ITEM(obj, 0);
2529 if (save(self, item, 0) < 0)
2530 return -1;
2531 if (_Pickler_Write(self, &append_op, 1) < 0)
2532 return -1;
2533 return 0;
2534 }
2535
2536 /* Write in batches of BATCHSIZE. */
2537 total = 0;
2538 do {
2539 this_batch = 0;
2540 if (_Pickler_Write(self, &mark_op, 1) < 0)
2541 return -1;
2542 while (total < PyList_GET_SIZE(obj)) {
2543 item = PyList_GET_ITEM(obj, total);
2544 if (save(self, item, 0) < 0)
2545 return -1;
2546 total++;
2547 if (++this_batch == BATCHSIZE)
2548 break;
2549 }
2550 if (_Pickler_Write(self, &appends_op, 1) < 0)
2551 return -1;
2552
2553 } while (total < PyList_GET_SIZE(obj));
2554
2555 return 0;
2556}
2557
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002558static int
2559save_list(PicklerObject *self, PyObject *obj)
2560{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002561 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002562 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002563 int status = 0;
2564
2565 if (self->fast && !fast_save_enter(self, obj))
2566 goto error;
2567
2568 /* Create an empty list. */
2569 if (self->bin) {
2570 header[0] = EMPTY_LIST;
2571 len = 1;
2572 }
2573 else {
2574 header[0] = MARK;
2575 header[1] = LIST;
2576 len = 2;
2577 }
2578
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002579 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002580 goto error;
2581
2582 /* Get list length, and bow out early if empty. */
2583 if ((len = PyList_Size(obj)) < 0)
2584 goto error;
2585
2586 if (memo_put(self, obj) < 0)
2587 goto error;
2588
2589 if (len != 0) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002590 /* Materialize the list elements. */
2591 if (PyList_CheckExact(obj) && self->proto > 0) {
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002592 if (Py_EnterRecursiveCall(" while pickling an object"))
2593 goto error;
2594 status = batch_list_exact(self, obj);
2595 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002596 } else {
2597 PyObject *iter = PyObject_GetIter(obj);
2598 if (iter == NULL)
2599 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002600
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002601 if (Py_EnterRecursiveCall(" while pickling an object")) {
2602 Py_DECREF(iter);
2603 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002604 }
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002605 status = batch_list(self, iter);
2606 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002607 Py_DECREF(iter);
2608 }
2609 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002610 if (0) {
2611 error:
2612 status = -1;
2613 }
2614
2615 if (self->fast && !fast_save_leave(self, obj))
2616 status = -1;
2617
2618 return status;
2619}
2620
2621/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
2622 * MARK key value ... key value SETITEMS
2623 * opcode sequences. Calling code should have arranged to first create an
2624 * empty dict, or dict-like object, for the SETITEMS to operate on.
2625 * Returns 0 on success, <0 on error.
2626 *
2627 * This is very much like batch_list(). The difference between saving
2628 * elements directly, and picking apart two-tuples, is so long-winded at
2629 * the C level, though, that attempts to combine these routines were too
2630 * ugly to bear.
2631 */
2632static int
2633batch_dict(PicklerObject *self, PyObject *iter)
2634{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002635 PyObject *obj = NULL;
2636 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002637 int i, n;
2638
2639 const char mark_op = MARK;
2640 const char setitem_op = SETITEM;
2641 const char setitems_op = SETITEMS;
2642
2643 assert(iter != NULL);
2644
2645 if (self->proto == 0) {
2646 /* SETITEMS isn't available; do one at a time. */
2647 for (;;) {
2648 obj = PyIter_Next(iter);
2649 if (obj == NULL) {
2650 if (PyErr_Occurred())
2651 return -1;
2652 break;
2653 }
2654 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2655 PyErr_SetString(PyExc_TypeError, "dict items "
2656 "iterator must return 2-tuples");
2657 return -1;
2658 }
2659 i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
2660 if (i >= 0)
2661 i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
2662 Py_DECREF(obj);
2663 if (i < 0)
2664 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002665 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002666 return -1;
2667 }
2668 return 0;
2669 }
2670
2671 /* proto > 0: write in batches of BATCHSIZE. */
2672 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002673 /* Get first item */
2674 firstitem = PyIter_Next(iter);
2675 if (firstitem == NULL) {
2676 if (PyErr_Occurred())
2677 goto error;
2678
2679 /* nothing more to add */
2680 break;
2681 }
2682 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
2683 PyErr_SetString(PyExc_TypeError, "dict items "
2684 "iterator must return 2-tuples");
2685 goto error;
2686 }
2687
2688 /* Try to get a second item */
2689 obj = PyIter_Next(iter);
2690 if (obj == NULL) {
2691 if (PyErr_Occurred())
2692 goto error;
2693
2694 /* Only one item to write */
2695 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2696 goto error;
2697 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2698 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002699 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002700 goto error;
2701 Py_CLEAR(firstitem);
2702 break;
2703 }
2704
2705 /* More than one item to write */
2706
2707 /* Pump out MARK, items, SETITEMS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002708 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002709 goto error;
2710
2711 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2712 goto error;
2713 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2714 goto error;
2715 Py_CLEAR(firstitem);
2716 n = 1;
2717
2718 /* Fetch and save up to BATCHSIZE items */
2719 while (obj) {
2720 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2721 PyErr_SetString(PyExc_TypeError, "dict items "
2722 "iterator must return 2-tuples");
2723 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002724 }
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002725 if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
2726 save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0)
2727 goto error;
2728 Py_CLEAR(obj);
2729 n += 1;
2730
2731 if (n == BATCHSIZE)
2732 break;
2733
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002734 obj = PyIter_Next(iter);
2735 if (obj == NULL) {
2736 if (PyErr_Occurred())
2737 goto error;
2738 break;
2739 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002740 }
2741
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002742 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002743 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002744
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002745 } while (n == BATCHSIZE);
2746 return 0;
2747
2748 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002749 Py_XDECREF(firstitem);
2750 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002751 return -1;
2752}
2753
Collin Winter5c9b02d2009-05-25 05:43:30 +00002754/* This is a variant of batch_dict() above that specializes for dicts, with no
2755 * support for dict subclasses. Like batch_dict(), we batch up chunks of
2756 * MARK key value ... key value SETITEMS
2757 * opcode sequences. Calling code should have arranged to first create an
2758 * empty dict, or dict-like object, for the SETITEMS to operate on.
2759 * Returns 0 on success, -1 on error.
2760 *
2761 * Note that this currently doesn't work for protocol 0.
2762 */
2763static int
2764batch_dict_exact(PicklerObject *self, PyObject *obj)
2765{
2766 PyObject *key = NULL, *value = NULL;
2767 int i;
2768 Py_ssize_t dict_size, ppos = 0;
2769
Alexandre Vassalottif70b1292009-05-25 18:00:52 +00002770 const char mark_op = MARK;
2771 const char setitem_op = SETITEM;
2772 const char setitems_op = SETITEMS;
Collin Winter5c9b02d2009-05-25 05:43:30 +00002773
2774 assert(obj != NULL);
2775 assert(self->proto > 0);
2776
2777 dict_size = PyDict_Size(obj);
2778
2779 /* Special-case len(d) == 1 to save space. */
2780 if (dict_size == 1) {
2781 PyDict_Next(obj, &ppos, &key, &value);
2782 if (save(self, key, 0) < 0)
2783 return -1;
2784 if (save(self, value, 0) < 0)
2785 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002786 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002787 return -1;
2788 return 0;
2789 }
2790
2791 /* Write in batches of BATCHSIZE. */
2792 do {
2793 i = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002794 if (_Pickler_Write(self, &mark_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002795 return -1;
2796 while (PyDict_Next(obj, &ppos, &key, &value)) {
2797 if (save(self, key, 0) < 0)
2798 return -1;
2799 if (save(self, value, 0) < 0)
2800 return -1;
2801 if (++i == BATCHSIZE)
2802 break;
2803 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002804 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002805 return -1;
2806 if (PyDict_Size(obj) != dict_size) {
2807 PyErr_Format(
2808 PyExc_RuntimeError,
2809 "dictionary changed size during iteration");
2810 return -1;
2811 }
2812
2813 } while (i == BATCHSIZE);
2814 return 0;
2815}
2816
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002817static int
2818save_dict(PicklerObject *self, PyObject *obj)
2819{
2820 PyObject *items, *iter;
2821 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002822 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002823 int status = 0;
2824
2825 if (self->fast && !fast_save_enter(self, obj))
2826 goto error;
2827
2828 /* Create an empty dict. */
2829 if (self->bin) {
2830 header[0] = EMPTY_DICT;
2831 len = 1;
2832 }
2833 else {
2834 header[0] = MARK;
2835 header[1] = DICT;
2836 len = 2;
2837 }
2838
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002839 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002840 goto error;
2841
2842 /* Get dict size, and bow out early if empty. */
2843 if ((len = PyDict_Size(obj)) < 0)
2844 goto error;
2845
2846 if (memo_put(self, obj) < 0)
2847 goto error;
2848
2849 if (len != 0) {
2850 /* Save the dict items. */
Collin Winter5c9b02d2009-05-25 05:43:30 +00002851 if (PyDict_CheckExact(obj) && self->proto > 0) {
2852 /* We can take certain shortcuts if we know this is a dict and
2853 not a dict subclass. */
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002854 if (Py_EnterRecursiveCall(" while pickling an object"))
2855 goto error;
2856 status = batch_dict_exact(self, obj);
2857 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002858 } else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002859 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002860
2861 items = _PyObject_CallMethodId(obj, &PyId_items, "()");
Collin Winter5c9b02d2009-05-25 05:43:30 +00002862 if (items == NULL)
2863 goto error;
2864 iter = PyObject_GetIter(items);
2865 Py_DECREF(items);
2866 if (iter == NULL)
2867 goto error;
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002868 if (Py_EnterRecursiveCall(" while pickling an object")) {
2869 Py_DECREF(iter);
2870 goto error;
2871 }
Collin Winter5c9b02d2009-05-25 05:43:30 +00002872 status = batch_dict(self, iter);
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002873 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002874 Py_DECREF(iter);
2875 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002876 }
2877
2878 if (0) {
2879 error:
2880 status = -1;
2881 }
2882
2883 if (self->fast && !fast_save_leave(self, obj))
2884 status = -1;
2885
2886 return status;
2887}
2888
2889static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002890save_set(PicklerObject *self, PyObject *obj)
2891{
2892 PyObject *item;
2893 int i;
2894 Py_ssize_t set_size, ppos = 0;
2895 Py_hash_t hash;
2896
2897 const char empty_set_op = EMPTY_SET;
2898 const char mark_op = MARK;
2899 const char additems_op = ADDITEMS;
2900
2901 if (self->proto < 4) {
2902 PyObject *items;
2903 PyObject *reduce_value;
2904 int status;
2905
2906 items = PySequence_List(obj);
2907 if (items == NULL) {
2908 return -1;
2909 }
2910 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
2911 Py_DECREF(items);
2912 if (reduce_value == NULL) {
2913 return -1;
2914 }
2915 /* save_reduce() will memoize the object automatically. */
2916 status = save_reduce(self, reduce_value, obj);
2917 Py_DECREF(reduce_value);
2918 return status;
2919 }
2920
2921 if (_Pickler_Write(self, &empty_set_op, 1) < 0)
2922 return -1;
2923
2924 if (memo_put(self, obj) < 0)
2925 return -1;
2926
2927 set_size = PySet_GET_SIZE(obj);
2928 if (set_size == 0)
2929 return 0; /* nothing to do */
2930
2931 /* Write in batches of BATCHSIZE. */
2932 do {
2933 i = 0;
2934 if (_Pickler_Write(self, &mark_op, 1) < 0)
2935 return -1;
2936 while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
2937 if (save(self, item, 0) < 0)
2938 return -1;
2939 if (++i == BATCHSIZE)
2940 break;
2941 }
2942 if (_Pickler_Write(self, &additems_op, 1) < 0)
2943 return -1;
2944 if (PySet_GET_SIZE(obj) != set_size) {
2945 PyErr_Format(
2946 PyExc_RuntimeError,
2947 "set changed size during iteration");
2948 return -1;
2949 }
2950 } while (i == BATCHSIZE);
2951
2952 return 0;
2953}
2954
2955static int
2956save_frozenset(PicklerObject *self, PyObject *obj)
2957{
2958 PyObject *iter;
2959
2960 const char mark_op = MARK;
2961 const char frozenset_op = FROZENSET;
2962
2963 if (self->fast && !fast_save_enter(self, obj))
2964 return -1;
2965
2966 if (self->proto < 4) {
2967 PyObject *items;
2968 PyObject *reduce_value;
2969 int status;
2970
2971 items = PySequence_List(obj);
2972 if (items == NULL) {
2973 return -1;
2974 }
2975 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
2976 items);
2977 Py_DECREF(items);
2978 if (reduce_value == NULL) {
2979 return -1;
2980 }
2981 /* save_reduce() will memoize the object automatically. */
2982 status = save_reduce(self, reduce_value, obj);
2983 Py_DECREF(reduce_value);
2984 return status;
2985 }
2986
2987 if (_Pickler_Write(self, &mark_op, 1) < 0)
2988 return -1;
2989
2990 iter = PyObject_GetIter(obj);
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002991 if (iter == NULL) {
Christian Heimes74d8d632013-11-23 21:05:31 +01002992 return -1;
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002993 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002994 for (;;) {
2995 PyObject *item;
2996
2997 item = PyIter_Next(iter);
2998 if (item == NULL) {
2999 if (PyErr_Occurred()) {
3000 Py_DECREF(iter);
3001 return -1;
3002 }
3003 break;
3004 }
3005 if (save(self, item, 0) < 0) {
3006 Py_DECREF(item);
3007 Py_DECREF(iter);
3008 return -1;
3009 }
3010 Py_DECREF(item);
3011 }
3012 Py_DECREF(iter);
3013
3014 /* If the object is already in the memo, this means it is
3015 recursive. In this case, throw away everything we put on the
3016 stack, and fetch the object back from the memo. */
3017 if (PyMemoTable_Get(self->memo, obj)) {
3018 const char pop_mark_op = POP_MARK;
3019
3020 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
3021 return -1;
3022 if (memo_get(self, obj) < 0)
3023 return -1;
3024 return 0;
3025 }
3026
3027 if (_Pickler_Write(self, &frozenset_op, 1) < 0)
3028 return -1;
3029 if (memo_put(self, obj) < 0)
3030 return -1;
3031
3032 return 0;
3033}
3034
3035static int
3036fix_imports(PyObject **module_name, PyObject **global_name)
3037{
3038 PyObject *key;
3039 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003040 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003041
3042 key = PyTuple_Pack(2, *module_name, *global_name);
3043 if (key == NULL)
3044 return -1;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003045 item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003046 Py_DECREF(key);
3047 if (item) {
3048 PyObject *fixed_module_name;
3049 PyObject *fixed_global_name;
3050
3051 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
3052 PyErr_Format(PyExc_RuntimeError,
3053 "_compat_pickle.REVERSE_NAME_MAPPING values "
3054 "should be 2-tuples, not %.200s",
3055 Py_TYPE(item)->tp_name);
3056 return -1;
3057 }
3058 fixed_module_name = PyTuple_GET_ITEM(item, 0);
3059 fixed_global_name = PyTuple_GET_ITEM(item, 1);
3060 if (!PyUnicode_Check(fixed_module_name) ||
3061 !PyUnicode_Check(fixed_global_name)) {
3062 PyErr_Format(PyExc_RuntimeError,
3063 "_compat_pickle.REVERSE_NAME_MAPPING values "
3064 "should be pairs of str, not (%.200s, %.200s)",
3065 Py_TYPE(fixed_module_name)->tp_name,
3066 Py_TYPE(fixed_global_name)->tp_name);
3067 return -1;
3068 }
3069
3070 Py_CLEAR(*module_name);
3071 Py_CLEAR(*global_name);
3072 Py_INCREF(fixed_module_name);
3073 Py_INCREF(fixed_global_name);
3074 *module_name = fixed_module_name;
3075 *global_name = fixed_global_name;
3076 }
3077 else if (PyErr_Occurred()) {
3078 return -1;
3079 }
3080
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003081 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003082 if (item) {
3083 if (!PyUnicode_Check(item)) {
3084 PyErr_Format(PyExc_RuntimeError,
3085 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3086 "should be strings, not %.200s",
3087 Py_TYPE(item)->tp_name);
3088 return -1;
3089 }
3090 Py_CLEAR(*module_name);
3091 Py_INCREF(item);
3092 *module_name = item;
3093 }
3094 else if (PyErr_Occurred()) {
3095 return -1;
3096 }
3097
3098 return 0;
3099}
3100
3101static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003102save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3103{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003104 PyObject *global_name = NULL;
3105 PyObject *module_name = NULL;
3106 PyObject *module = NULL;
3107 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003108 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003109 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003110 _Py_IDENTIFIER(__name__);
3111 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003112
3113 const char global_op = GLOBAL;
3114
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003115 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003116 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003117 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003118 }
3119 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003120 if (self->proto >= 4) {
3121 global_name = _PyObject_GetAttrId(obj, &PyId___qualname__);
3122 if (global_name == NULL) {
3123 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3124 goto error;
3125 PyErr_Clear();
3126 }
3127 }
3128 if (global_name == NULL) {
3129 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3130 if (global_name == NULL)
3131 goto error;
3132 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003133 }
3134
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003135 module_name = whichmodule(obj, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003136 if (module_name == NULL)
3137 goto error;
3138
3139 /* XXX: Change to use the import C API directly with level=0 to disallow
3140 relative imports.
3141
3142 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3143 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3144 custom import functions (IMHO, this would be a nice security
3145 feature). The import C API would need to be extended to support the
3146 extra parameters of __import__ to fix that. */
3147 module = PyImport_Import(module_name);
3148 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003149 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003150 "Can't pickle %R: import of module %R failed",
3151 obj, module_name);
3152 goto error;
3153 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003154 cls = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003155 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003156 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003157 "Can't pickle %R: attribute lookup %S on %S failed",
3158 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003159 goto error;
3160 }
3161 if (cls != obj) {
3162 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003163 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003164 "Can't pickle %R: it's not the same object as %S.%S",
3165 obj, module_name, global_name);
3166 goto error;
3167 }
3168 Py_DECREF(cls);
3169
3170 if (self->proto >= 2) {
3171 /* See whether this is in the extension registry, and if
3172 * so generate an EXT opcode.
3173 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003174 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003175 PyObject *code_obj; /* extension code as Python object */
3176 long code; /* extension code as C value */
3177 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003178 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003179
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003180 extension_key = PyTuple_Pack(2, module_name, global_name);
3181 if (extension_key == NULL) {
3182 goto error;
3183 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003184 code_obj = PyDict_GetItemWithError(st->extension_registry,
3185 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003186 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003187 /* The object is not registered in the extension registry.
3188 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003189 if (code_obj == NULL) {
3190 if (PyErr_Occurred()) {
3191 goto error;
3192 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003193 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003194 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003195
3196 /* XXX: pickle.py doesn't check neither the type, nor the range
3197 of the value returned by the extension_registry. It should for
3198 consistency. */
3199
3200 /* Verify code_obj has the right type and value. */
3201 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003202 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003203 "Can't pickle %R: extension code %R isn't an integer",
3204 obj, code_obj);
3205 goto error;
3206 }
3207 code = PyLong_AS_LONG(code_obj);
3208 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003209 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003210 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3211 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003212 goto error;
3213 }
3214
3215 /* Generate an EXT opcode. */
3216 if (code <= 0xff) {
3217 pdata[0] = EXT1;
3218 pdata[1] = (unsigned char)code;
3219 n = 2;
3220 }
3221 else if (code <= 0xffff) {
3222 pdata[0] = EXT2;
3223 pdata[1] = (unsigned char)(code & 0xff);
3224 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3225 n = 3;
3226 }
3227 else {
3228 pdata[0] = EXT4;
3229 pdata[1] = (unsigned char)(code & 0xff);
3230 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3231 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3232 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3233 n = 5;
3234 }
3235
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003236 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003237 goto error;
3238 }
3239 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003240 gen_global:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003241 if (self->proto >= 4) {
3242 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003243
Christian Heimese8b1ba12013-11-23 21:13:39 +01003244 if (save(self, module_name, 0) < 0)
3245 goto error;
3246 if (save(self, global_name, 0) < 0)
3247 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003248
3249 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3250 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003251 }
3252 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003253 /* Generate a normal global opcode if we are using a pickle
3254 protocol < 4, or if the object is not registered in the
3255 extension registry. */
3256 PyObject *encoded;
3257 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003258
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003259 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003260 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003261
3262 /* For protocol < 3 and if the user didn't request against doing
3263 so, we convert module names to the old 2.x module names. */
3264 if (self->proto < 3 && self->fix_imports) {
3265 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003266 goto error;
3267 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003268 }
3269
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003270 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3271 both the module name and the global name using UTF-8. We do so
3272 only when we are using the pickle protocol newer than version
3273 3. This is to ensure compatibility with older Unpickler running
3274 on Python 2.x. */
3275 if (self->proto == 3) {
3276 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003277 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003278 else {
3279 unicode_encoder = PyUnicode_AsASCIIString;
3280 }
3281 encoded = unicode_encoder(module_name);
3282 if (encoded == NULL) {
3283 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003284 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003285 "can't pickle module identifier '%S' using "
3286 "pickle protocol %i",
3287 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003288 goto error;
3289 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003290 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3291 PyBytes_GET_SIZE(encoded)) < 0) {
3292 Py_DECREF(encoded);
3293 goto error;
3294 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003295 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003296 if(_Pickler_Write(self, "\n", 1) < 0)
3297 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003298
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003299 /* Save the name of the module. */
3300 encoded = unicode_encoder(global_name);
3301 if (encoded == NULL) {
3302 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003303 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003304 "can't pickle global identifier '%S' using "
3305 "pickle protocol %i",
3306 global_name, self->proto);
3307 goto error;
3308 }
3309 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3310 PyBytes_GET_SIZE(encoded)) < 0) {
3311 Py_DECREF(encoded);
3312 goto error;
3313 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003314 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003315 if (_Pickler_Write(self, "\n", 1) < 0)
3316 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003317 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003318 /* Memoize the object. */
3319 if (memo_put(self, obj) < 0)
3320 goto error;
3321 }
3322
3323 if (0) {
3324 error:
3325 status = -1;
3326 }
3327 Py_XDECREF(module_name);
3328 Py_XDECREF(global_name);
3329 Py_XDECREF(module);
3330
3331 return status;
3332}
3333
3334static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003335save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3336{
3337 PyObject *reduce_value;
3338 int status;
3339
3340 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3341 if (reduce_value == NULL) {
3342 return -1;
3343 }
3344 status = save_reduce(self, reduce_value, obj);
3345 Py_DECREF(reduce_value);
3346 return status;
3347}
3348
3349static int
3350save_type(PicklerObject *self, PyObject *obj)
3351{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003352 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003353 return save_singleton_type(self, obj, Py_None);
3354 }
3355 else if (obj == (PyObject *)&PyEllipsis_Type) {
3356 return save_singleton_type(self, obj, Py_Ellipsis);
3357 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003358 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003359 return save_singleton_type(self, obj, Py_NotImplemented);
3360 }
3361 return save_global(self, obj, NULL);
3362}
3363
3364static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003365save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
3366{
3367 PyObject *pid = NULL;
3368 int status = 0;
3369
3370 const char persid_op = PERSID;
3371 const char binpersid_op = BINPERSID;
3372
3373 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003374 pid = _Pickle_FastCall(func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003375 if (pid == NULL)
3376 return -1;
3377
3378 if (pid != Py_None) {
3379 if (self->bin) {
3380 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003381 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003382 goto error;
3383 }
3384 else {
3385 PyObject *pid_str = NULL;
3386 char *pid_ascii_bytes;
3387 Py_ssize_t size;
3388
3389 pid_str = PyObject_Str(pid);
3390 if (pid_str == NULL)
3391 goto error;
3392
3393 /* XXX: Should it check whether the persistent id only contains
3394 ASCII characters? And what if the pid contains embedded
3395 newlines? */
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00003396 pid_ascii_bytes = _PyUnicode_AsStringAndSize(pid_str, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003397 Py_DECREF(pid_str);
3398 if (pid_ascii_bytes == NULL)
3399 goto error;
3400
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003401 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
3402 _Pickler_Write(self, pid_ascii_bytes, size) < 0 ||
3403 _Pickler_Write(self, "\n", 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003404 goto error;
3405 }
3406 status = 1;
3407 }
3408
3409 if (0) {
3410 error:
3411 status = -1;
3412 }
3413 Py_XDECREF(pid);
3414
3415 return status;
3416}
3417
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003418static PyObject *
3419get_class(PyObject *obj)
3420{
3421 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003422 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003423
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003424 cls = _PyObject_GetAttrId(obj, &PyId___class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003425 if (cls == NULL) {
3426 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3427 PyErr_Clear();
3428 cls = (PyObject *) Py_TYPE(obj);
3429 Py_INCREF(cls);
3430 }
3431 }
3432 return cls;
3433}
3434
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003435/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3436 * appropriate __reduce__ method for obj.
3437 */
3438static int
3439save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3440{
3441 PyObject *callable;
3442 PyObject *argtup;
3443 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003444 PyObject *listitems = Py_None;
3445 PyObject *dictitems = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003446 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003447 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003448 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003449
3450 const char reduce_op = REDUCE;
3451 const char build_op = BUILD;
3452 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003453 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003454
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003455 size = PyTuple_Size(args);
3456 if (size < 2 || size > 5) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003457 PyErr_SetString(st->PicklingError, "tuple returned by "
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003458 "__reduce__ must contain 2 through 5 elements");
3459 return -1;
3460 }
3461
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003462 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
3463 &callable, &argtup, &state, &listitems, &dictitems))
3464 return -1;
3465
3466 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003467 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003468 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003469 return -1;
3470 }
3471 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003472 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003473 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003474 return -1;
3475 }
3476
3477 if (state == Py_None)
3478 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003479
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003480 if (listitems == Py_None)
3481 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003482 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003483 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003484 "returned by __reduce__ must be an iterator, not %s",
3485 Py_TYPE(listitems)->tp_name);
3486 return -1;
3487 }
3488
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003489 if (dictitems == Py_None)
3490 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003491 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003492 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003493 "returned by __reduce__ must be an iterator, not %s",
3494 Py_TYPE(dictitems)->tp_name);
3495 return -1;
3496 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003497
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003498 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003499 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003500 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003501
Victor Stinner804e05e2013-11-14 01:26:17 +01003502 name = _PyObject_GetAttrId(callable, &PyId___name__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003503 if (name == NULL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003504 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003505 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003506 }
3507 PyErr_Clear();
3508 }
3509 else if (self->proto >= 4) {
3510 _Py_IDENTIFIER(__newobj_ex__);
3511 use_newobj_ex = PyUnicode_Check(name) &&
3512 PyUnicode_Compare(
3513 name, _PyUnicode_FromId(&PyId___newobj_ex__)) == 0;
3514 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003515 }
3516 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003517 _Py_IDENTIFIER(__newobj__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003518 use_newobj = PyUnicode_Check(name) &&
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003519 PyUnicode_Compare(
3520 name, _PyUnicode_FromId(&PyId___newobj__)) == 0;
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003521 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003522 }
3523 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003524
3525 if (use_newobj_ex) {
3526 PyObject *cls;
3527 PyObject *args;
3528 PyObject *kwargs;
3529
3530 if (Py_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003531 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003532 "length of the NEWOBJ_EX argument tuple must be "
3533 "exactly 3, not %zd", Py_SIZE(argtup));
3534 return -1;
3535 }
3536
3537 cls = PyTuple_GET_ITEM(argtup, 0);
3538 if (!PyType_Check(cls)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003539 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003540 "first item from NEWOBJ_EX argument tuple must "
3541 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
3542 return -1;
3543 }
3544 args = PyTuple_GET_ITEM(argtup, 1);
3545 if (!PyTuple_Check(args)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003546 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003547 "second item from NEWOBJ_EX argument tuple must "
3548 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
3549 return -1;
3550 }
3551 kwargs = PyTuple_GET_ITEM(argtup, 2);
3552 if (!PyDict_Check(kwargs)) {
Larry Hastings61272b72014-01-07 12:41:53 -08003553 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003554 "third item from NEWOBJ_EX argument tuple must "
3555 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
3556 return -1;
3557 }
3558
3559 if (save(self, cls, 0) < 0 ||
3560 save(self, args, 0) < 0 ||
3561 save(self, kwargs, 0) < 0 ||
3562 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
3563 return -1;
3564 }
3565 }
3566 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003567 PyObject *cls;
3568 PyObject *newargtup;
3569 PyObject *obj_class;
3570 int p;
3571
3572 /* Sanity checks. */
3573 if (Py_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003574 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003575 return -1;
3576 }
3577
3578 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003579 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003580 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003581 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003582 return -1;
3583 }
3584
3585 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003586 obj_class = get_class(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003587 p = obj_class != cls; /* true iff a problem */
3588 Py_DECREF(obj_class);
3589 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003590 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003591 "__newobj__ args has the wrong class");
3592 return -1;
3593 }
3594 }
3595 /* XXX: These calls save() are prone to infinite recursion. Imagine
3596 what happen if the value returned by the __reduce__() method of
3597 some extension type contains another object of the same type. Ouch!
3598
3599 Here is a quick example, that I ran into, to illustrate what I
3600 mean:
3601
3602 >>> import pickle, copyreg
3603 >>> copyreg.dispatch_table.pop(complex)
3604 >>> pickle.dumps(1+2j)
3605 Traceback (most recent call last):
3606 ...
3607 RuntimeError: maximum recursion depth exceeded
3608
3609 Removing the complex class from copyreg.dispatch_table made the
3610 __reduce_ex__() method emit another complex object:
3611
3612 >>> (1+1j).__reduce_ex__(2)
3613 (<function __newobj__ at 0xb7b71c3c>,
3614 (<class 'complex'>, (1+1j)), None, None, None)
3615
3616 Thus when save() was called on newargstup (the 2nd item) recursion
3617 ensued. Of course, the bug was in the complex class which had a
3618 broken __getnewargs__() that emitted another complex object. But,
3619 the point, here, is it is quite easy to end up with a broken reduce
3620 function. */
3621
3622 /* Save the class and its __new__ arguments. */
3623 if (save(self, cls, 0) < 0)
3624 return -1;
3625
3626 newargtup = PyTuple_GetSlice(argtup, 1, Py_SIZE(argtup));
3627 if (newargtup == NULL)
3628 return -1;
3629
3630 p = save(self, newargtup, 0);
3631 Py_DECREF(newargtup);
3632 if (p < 0)
3633 return -1;
3634
3635 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003636 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003637 return -1;
3638 }
3639 else { /* Not using NEWOBJ. */
3640 if (save(self, callable, 0) < 0 ||
3641 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003642 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003643 return -1;
3644 }
3645
3646 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
3647 the caller do not want to memoize the object. Not particularly useful,
3648 but that is to mimic the behavior save_reduce() in pickle.py when
3649 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003650 if (obj != NULL) {
3651 /* If the object is already in the memo, this means it is
3652 recursive. In this case, throw away everything we put on the
3653 stack, and fetch the object back from the memo. */
3654 if (PyMemoTable_Get(self->memo, obj)) {
3655 const char pop_op = POP;
3656
3657 if (_Pickler_Write(self, &pop_op, 1) < 0)
3658 return -1;
3659 if (memo_get(self, obj) < 0)
3660 return -1;
3661
3662 return 0;
3663 }
3664 else if (memo_put(self, obj) < 0)
3665 return -1;
3666 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003667
3668 if (listitems && batch_list(self, listitems) < 0)
3669 return -1;
3670
3671 if (dictitems && batch_dict(self, dictitems) < 0)
3672 return -1;
3673
3674 if (state) {
Victor Stinner121aab42011-09-29 23:40:53 +02003675 if (save(self, state, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003676 _Pickler_Write(self, &build_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003677 return -1;
3678 }
3679
3680 return 0;
3681}
3682
3683static int
3684save(PicklerObject *self, PyObject *obj, int pers_save)
3685{
3686 PyTypeObject *type;
3687 PyObject *reduce_func = NULL;
3688 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003689 int status = 0;
3690
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003691 if (_Pickler_OpcodeBoundary(self) < 0)
3692 return -1;
3693
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003694 if (Py_EnterRecursiveCall(" while pickling an object"))
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003695 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003696
3697 /* The extra pers_save argument is necessary to avoid calling save_pers()
3698 on its returned object. */
3699 if (!pers_save && self->pers_func) {
3700 /* save_pers() returns:
3701 -1 to signal an error;
3702 0 if it did nothing successfully;
3703 1 if a persistent id was saved.
3704 */
3705 if ((status = save_pers(self, obj, self->pers_func)) != 0)
3706 goto done;
3707 }
3708
3709 type = Py_TYPE(obj);
3710
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003711 /* The old cPickle had an optimization that used switch-case statement
3712 dispatching on the first letter of the type name. This has was removed
3713 since benchmarks shown that this optimization was actually slowing
3714 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003715
3716 /* Atom types; these aren't memoized, so don't check the memo. */
3717
3718 if (obj == Py_None) {
3719 status = save_none(self, obj);
3720 goto done;
3721 }
3722 else if (obj == Py_False || obj == Py_True) {
3723 status = save_bool(self, obj);
3724 goto done;
3725 }
3726 else if (type == &PyLong_Type) {
3727 status = save_long(self, obj);
3728 goto done;
3729 }
3730 else if (type == &PyFloat_Type) {
3731 status = save_float(self, obj);
3732 goto done;
3733 }
3734
3735 /* Check the memo to see if it has the object. If so, generate
3736 a GET (or BINGET) opcode, instead of pickling the object
3737 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003738 if (PyMemoTable_Get(self->memo, obj)) {
3739 if (memo_get(self, obj) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003740 goto error;
3741 goto done;
3742 }
3743
3744 if (type == &PyBytes_Type) {
3745 status = save_bytes(self, obj);
3746 goto done;
3747 }
3748 else if (type == &PyUnicode_Type) {
3749 status = save_unicode(self, obj);
3750 goto done;
3751 }
3752 else if (type == &PyDict_Type) {
3753 status = save_dict(self, obj);
3754 goto done;
3755 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003756 else if (type == &PySet_Type) {
3757 status = save_set(self, obj);
3758 goto done;
3759 }
3760 else if (type == &PyFrozenSet_Type) {
3761 status = save_frozenset(self, obj);
3762 goto done;
3763 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003764 else if (type == &PyList_Type) {
3765 status = save_list(self, obj);
3766 goto done;
3767 }
3768 else if (type == &PyTuple_Type) {
3769 status = save_tuple(self, obj);
3770 goto done;
3771 }
3772 else if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003773 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003774 goto done;
3775 }
3776 else if (type == &PyFunction_Type) {
3777 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08003778 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003779 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003780
3781 /* XXX: This part needs some unit tests. */
3782
3783 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003784 * self.dispatch_table, copyreg.dispatch_table, the object's
3785 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003786 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003787 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003788 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003789 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
3790 (PyObject *)type);
3791 if (reduce_func == NULL) {
3792 if (PyErr_Occurred()) {
3793 goto error;
3794 }
3795 } else {
3796 /* PyDict_GetItemWithError() returns a borrowed reference.
3797 Increase the reference count to be consistent with
3798 PyObject_GetItem and _PyObject_GetAttrId used below. */
3799 Py_INCREF(reduce_func);
3800 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003801 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003802 reduce_func = PyObject_GetItem(self->dispatch_table,
3803 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003804 if (reduce_func == NULL) {
3805 if (PyErr_ExceptionMatches(PyExc_KeyError))
3806 PyErr_Clear();
3807 else
3808 goto error;
3809 }
3810 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003811 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003812 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003813 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003814 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02003815 else if (PyType_IsSubtype(type, &PyType_Type)) {
3816 status = save_global(self, obj, NULL);
3817 goto done;
3818 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003819 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003820 _Py_IDENTIFIER(__reduce__);
3821 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003822
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003823
3824 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
3825 automatically defined as __reduce__. While this is convenient, this
3826 make it impossible to know which method was actually called. Of
3827 course, this is not a big deal. But still, it would be nice to let
3828 the user know which method was called when something go
3829 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
3830 don't actually have to check for a __reduce__ method. */
3831
3832 /* Check for a __reduce_ex__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003833 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003834 if (reduce_func != NULL) {
3835 PyObject *proto;
3836 proto = PyLong_FromLong(self->proto);
3837 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003838 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003839 }
3840 }
3841 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003842 PickleState *st = _Pickle_GetGlobalState();
3843
3844 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003845 PyErr_Clear();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003846 }
3847 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003848 goto error;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003849 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003850 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003851 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003852 if (reduce_func != NULL) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003853 PyObject *empty_tuple = PyTuple_New(0);
3854 reduce_value = PyObject_Call(reduce_func, empty_tuple,
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003855 NULL);
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003856 Py_DECREF(empty_tuple);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003857 }
3858 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003859 PyErr_Format(st->PicklingError,
3860 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003861 type->tp_name, obj);
3862 goto error;
3863 }
3864 }
3865 }
3866
3867 if (reduce_value == NULL)
3868 goto error;
3869
3870 if (PyUnicode_Check(reduce_value)) {
3871 status = save_global(self, obj, reduce_value);
3872 goto done;
3873 }
3874
3875 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003876 PickleState *st = _Pickle_GetGlobalState();
3877 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003878 "__reduce__ must return a string or tuple");
3879 goto error;
3880 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003881
3882 status = save_reduce(self, reduce_value, obj);
3883
3884 if (0) {
3885 error:
3886 status = -1;
3887 }
3888 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003889
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003890 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003891 Py_XDECREF(reduce_func);
3892 Py_XDECREF(reduce_value);
3893
3894 return status;
3895}
3896
3897static int
3898dump(PicklerObject *self, PyObject *obj)
3899{
3900 const char stop_op = STOP;
3901
3902 if (self->proto >= 2) {
3903 char header[2];
3904
3905 header[0] = PROTO;
3906 assert(self->proto >= 0 && self->proto < 256);
3907 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003908 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003909 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003910 if (self->proto >= 4)
3911 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003912 }
3913
3914 if (save(self, obj, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003915 _Pickler_Write(self, &stop_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003916 return -1;
3917
3918 return 0;
3919}
3920
Larry Hastings61272b72014-01-07 12:41:53 -08003921/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003922
3923_pickle.Pickler.clear_memo
3924
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003925Clears the pickler's "memo".
3926
3927The memo is the data structure that remembers which objects the
3928pickler has already seen, so that shared or recursive objects are
3929pickled by reference and not by value. This method is useful when
3930re-using picklers.
Larry Hastings61272b72014-01-07 12:41:53 -08003931[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003932
Larry Hastings3cceb382014-01-04 11:09:09 -08003933static PyObject *
3934_pickle_Pickler_clear_memo_impl(PicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08003935/*[clinic end generated code: output=8665c8658aaa094b input=01bdad52f3d93e56]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003936{
3937 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003938 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003939
3940 Py_RETURN_NONE;
3941}
3942
Larry Hastings61272b72014-01-07 12:41:53 -08003943/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003944
3945_pickle.Pickler.dump
3946
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003947 obj: object
3948 /
3949
3950Write a pickled representation of the given object to the open file.
Larry Hastings61272b72014-01-07 12:41:53 -08003951[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003952
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003953static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003954_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
Larry Hastings581ee362014-01-28 05:00:08 -08003955/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003956{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003957 /* Check whether the Pickler was initialized correctly (issue3664).
3958 Developers often forget to call __init__() in their subclasses, which
3959 would trigger a segfault without this check. */
3960 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003961 PickleState *st = _Pickle_GetGlobalState();
3962 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003963 "Pickler.__init__() was not called by %s.__init__()",
3964 Py_TYPE(self)->tp_name);
3965 return NULL;
3966 }
3967
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003968 if (_Pickler_ClearBuffer(self) < 0)
3969 return NULL;
3970
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003971 if (dump(self, obj) < 0)
3972 return NULL;
3973
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003974 if (_Pickler_FlushToFile(self) < 0)
3975 return NULL;
3976
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003977 Py_RETURN_NONE;
3978}
3979
3980static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003981 _PICKLE_PICKLER_DUMP_METHODDEF
3982 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003983 {NULL, NULL} /* sentinel */
3984};
3985
3986static void
3987Pickler_dealloc(PicklerObject *self)
3988{
3989 PyObject_GC_UnTrack(self);
3990
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003991 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003992 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003993 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003994 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003995 Py_XDECREF(self->fast_memo);
3996
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003997 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003998
3999 Py_TYPE(self)->tp_free((PyObject *)self);
4000}
4001
4002static int
4003Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
4004{
4005 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004006 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004007 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004008 Py_VISIT(self->fast_memo);
4009 return 0;
4010}
4011
4012static int
4013Pickler_clear(PicklerObject *self)
4014{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004015 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004016 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004017 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004018 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004019 Py_CLEAR(self->fast_memo);
4020
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004021 if (self->memo != NULL) {
4022 PyMemoTable *memo = self->memo;
4023 self->memo = NULL;
4024 PyMemoTable_Del(memo);
4025 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004026 return 0;
4027}
4028
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004029
Larry Hastings61272b72014-01-07 12:41:53 -08004030/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004031
4032_pickle.Pickler.__init__
4033
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004034 file: object
4035 protocol: object = NULL
4036 fix_imports: bool = True
4037
4038This takes a binary file for writing a pickle data stream.
4039
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004040The optional *protocol* argument tells the pickler to use the given
4041protocol; supported protocols are 0, 1, 2, 3 and 4. The default
4042protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004043
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004044Specifying a negative protocol version selects the highest protocol
4045version supported. The higher the protocol used, the more recent the
4046version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004047
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004048The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004049bytes argument. It can thus be a file object opened for binary
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004050writing, a io.BytesIO instance, or any other custom object that meets
4051this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004052
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004053If *fix_imports* is True and protocol is less than 3, pickle will try
4054to map the new Python 3 names to the old module names used in Python
40552, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08004056[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004057
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004058static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004059_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports)
Larry Hastings581ee362014-01-28 05:00:08 -08004060/*[clinic end generated code: output=56e229f3b1f4332f input=b8cdeb7e3f5ee674]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004061{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004062 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004063 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004064
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004065 /* In case of multiple __init__() calls, clear previous content. */
4066 if (self->write != NULL)
4067 (void)Pickler_clear(self);
4068
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004069 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004070 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004071
4072 if (_Pickler_SetOutputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004073 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004074
4075 /* memo and output_buffer may have already been created in _Pickler_New */
4076 if (self->memo == NULL) {
4077 self->memo = PyMemoTable_New();
4078 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004079 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004080 }
4081 self->output_len = 0;
4082 if (self->output_buffer == NULL) {
4083 self->max_output_len = WRITE_BUF_SIZE;
4084 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4085 self->max_output_len);
4086 if (self->output_buffer == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004087 return -1;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004088 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004089
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004090 self->fast = 0;
4091 self->fast_nesting = 0;
4092 self->fast_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004093 self->pers_func = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004094 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) {
4095 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
4096 &PyId_persistent_id);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004097 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004098 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004099 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004100 self->dispatch_table = NULL;
4101 if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) {
4102 self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
4103 &PyId_dispatch_table);
4104 if (self->dispatch_table == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004105 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004106 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004107
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004108 return 0;
4109}
4110
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004111
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004112/* Define a proxy object for the Pickler's internal memo object. This is to
4113 * avoid breaking code like:
4114 * pickler.memo.clear()
4115 * and
4116 * pickler.memo = saved_memo
4117 * Is this a good idea? Not really, but we don't want to break code that uses
4118 * it. Note that we don't implement the entire mapping API here. This is
4119 * intentional, as these should be treated as black-box implementation details.
4120 */
4121
Larry Hastings61272b72014-01-07 12:41:53 -08004122/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004123_pickle.PicklerMemoProxy.clear
4124
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004125Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08004126[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004127
Larry Hastings3cceb382014-01-04 11:09:09 -08004128static PyObject *
4129_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004130/*[clinic end generated code: output=5fb9370d48ae8b05 input=ccc186dacd0f1405]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004131{
4132 if (self->pickler->memo)
4133 PyMemoTable_Clear(self->pickler->memo);
4134 Py_RETURN_NONE;
4135}
4136
Larry Hastings61272b72014-01-07 12:41:53 -08004137/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004138_pickle.PicklerMemoProxy.copy
4139
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004140Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08004141[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004142
Larry Hastings3cceb382014-01-04 11:09:09 -08004143static PyObject *
4144_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004145/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004146{
4147 Py_ssize_t i;
4148 PyMemoTable *memo;
4149 PyObject *new_memo = PyDict_New();
4150 if (new_memo == NULL)
4151 return NULL;
4152
4153 memo = self->pickler->memo;
4154 for (i = 0; i < memo->mt_allocated; ++i) {
4155 PyMemoEntry entry = memo->mt_table[i];
4156 if (entry.me_key != NULL) {
4157 int status;
4158 PyObject *key, *value;
4159
4160 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004161 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004162
4163 if (key == NULL || value == NULL) {
4164 Py_XDECREF(key);
4165 Py_XDECREF(value);
4166 goto error;
4167 }
4168 status = PyDict_SetItem(new_memo, key, value);
4169 Py_DECREF(key);
4170 Py_DECREF(value);
4171 if (status < 0)
4172 goto error;
4173 }
4174 }
4175 return new_memo;
4176
4177 error:
4178 Py_XDECREF(new_memo);
4179 return NULL;
4180}
4181
Larry Hastings61272b72014-01-07 12:41:53 -08004182/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004183_pickle.PicklerMemoProxy.__reduce__
4184
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004185Implement pickle support.
Larry Hastings61272b72014-01-07 12:41:53 -08004186[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004187
Larry Hastings3cceb382014-01-04 11:09:09 -08004188static PyObject *
4189_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004190/*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004191{
4192 PyObject *reduce_value, *dict_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08004193 PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004194 if (contents == NULL)
4195 return NULL;
4196
4197 reduce_value = PyTuple_New(2);
4198 if (reduce_value == NULL) {
4199 Py_DECREF(contents);
4200 return NULL;
4201 }
4202 dict_args = PyTuple_New(1);
4203 if (dict_args == NULL) {
4204 Py_DECREF(contents);
4205 Py_DECREF(reduce_value);
4206 return NULL;
4207 }
4208 PyTuple_SET_ITEM(dict_args, 0, contents);
4209 Py_INCREF((PyObject *)&PyDict_Type);
4210 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4211 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4212 return reduce_value;
4213}
4214
4215static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004216 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4217 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4218 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004219 {NULL, NULL} /* sentinel */
4220};
4221
4222static void
4223PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4224{
4225 PyObject_GC_UnTrack(self);
4226 Py_XDECREF(self->pickler);
4227 PyObject_GC_Del((PyObject *)self);
4228}
4229
4230static int
4231PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4232 visitproc visit, void *arg)
4233{
4234 Py_VISIT(self->pickler);
4235 return 0;
4236}
4237
4238static int
4239PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4240{
4241 Py_CLEAR(self->pickler);
4242 return 0;
4243}
4244
4245static PyTypeObject PicklerMemoProxyType = {
4246 PyVarObject_HEAD_INIT(NULL, 0)
4247 "_pickle.PicklerMemoProxy", /*tp_name*/
4248 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4249 0,
4250 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4251 0, /* tp_print */
4252 0, /* tp_getattr */
4253 0, /* tp_setattr */
4254 0, /* tp_compare */
4255 0, /* tp_repr */
4256 0, /* tp_as_number */
4257 0, /* tp_as_sequence */
4258 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004259 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004260 0, /* tp_call */
4261 0, /* tp_str */
4262 PyObject_GenericGetAttr, /* tp_getattro */
4263 PyObject_GenericSetAttr, /* tp_setattro */
4264 0, /* tp_as_buffer */
4265 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4266 0, /* tp_doc */
4267 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4268 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4269 0, /* tp_richcompare */
4270 0, /* tp_weaklistoffset */
4271 0, /* tp_iter */
4272 0, /* tp_iternext */
4273 picklerproxy_methods, /* tp_methods */
4274};
4275
4276static PyObject *
4277PicklerMemoProxy_New(PicklerObject *pickler)
4278{
4279 PicklerMemoProxyObject *self;
4280
4281 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4282 if (self == NULL)
4283 return NULL;
4284 Py_INCREF(pickler);
4285 self->pickler = pickler;
4286 PyObject_GC_Track(self);
4287 return (PyObject *)self;
4288}
4289
4290/*****************************************************************************/
4291
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004292static PyObject *
4293Pickler_get_memo(PicklerObject *self)
4294{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004295 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004296}
4297
4298static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004299Pickler_set_memo(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004300{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004301 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004302
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004303 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004304 PyErr_SetString(PyExc_TypeError,
4305 "attribute deletion is not supported");
4306 return -1;
4307 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004308
4309 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4310 PicklerObject *pickler =
4311 ((PicklerMemoProxyObject *)obj)->pickler;
4312
4313 new_memo = PyMemoTable_Copy(pickler->memo);
4314 if (new_memo == NULL)
4315 return -1;
4316 }
4317 else if (PyDict_Check(obj)) {
4318 Py_ssize_t i = 0;
4319 PyObject *key, *value;
4320
4321 new_memo = PyMemoTable_New();
4322 if (new_memo == NULL)
4323 return -1;
4324
4325 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004326 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004327 PyObject *memo_obj;
4328
4329 if (!PyTuple_Check(value) || Py_SIZE(value) != 2) {
4330 PyErr_SetString(PyExc_TypeError,
4331 "'memo' values must be 2-item tuples");
4332 goto error;
4333 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004334 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004335 if (memo_id == -1 && PyErr_Occurred())
4336 goto error;
4337 memo_obj = PyTuple_GET_ITEM(value, 1);
4338 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4339 goto error;
4340 }
4341 }
4342 else {
4343 PyErr_Format(PyExc_TypeError,
4344 "'memo' attribute must be an PicklerMemoProxy object"
4345 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004346 return -1;
4347 }
4348
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004349 PyMemoTable_Del(self->memo);
4350 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004351
4352 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004353
4354 error:
4355 if (new_memo)
4356 PyMemoTable_Del(new_memo);
4357 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004358}
4359
4360static PyObject *
4361Pickler_get_persid(PicklerObject *self)
4362{
4363 if (self->pers_func == NULL)
4364 PyErr_SetString(PyExc_AttributeError, "persistent_id");
4365 else
4366 Py_INCREF(self->pers_func);
4367 return self->pers_func;
4368}
4369
4370static int
4371Pickler_set_persid(PicklerObject *self, PyObject *value)
4372{
4373 PyObject *tmp;
4374
4375 if (value == NULL) {
4376 PyErr_SetString(PyExc_TypeError,
4377 "attribute deletion is not supported");
4378 return -1;
4379 }
4380 if (!PyCallable_Check(value)) {
4381 PyErr_SetString(PyExc_TypeError,
4382 "persistent_id must be a callable taking one argument");
4383 return -1;
4384 }
4385
4386 tmp = self->pers_func;
4387 Py_INCREF(value);
4388 self->pers_func = value;
4389 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
4390
4391 return 0;
4392}
4393
4394static PyMemberDef Pickler_members[] = {
4395 {"bin", T_INT, offsetof(PicklerObject, bin)},
4396 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004397 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004398 {NULL}
4399};
4400
4401static PyGetSetDef Pickler_getsets[] = {
4402 {"memo", (getter)Pickler_get_memo,
4403 (setter)Pickler_set_memo},
4404 {"persistent_id", (getter)Pickler_get_persid,
4405 (setter)Pickler_set_persid},
4406 {NULL}
4407};
4408
4409static PyTypeObject Pickler_Type = {
4410 PyVarObject_HEAD_INIT(NULL, 0)
4411 "_pickle.Pickler" , /*tp_name*/
4412 sizeof(PicklerObject), /*tp_basicsize*/
4413 0, /*tp_itemsize*/
4414 (destructor)Pickler_dealloc, /*tp_dealloc*/
4415 0, /*tp_print*/
4416 0, /*tp_getattr*/
4417 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00004418 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004419 0, /*tp_repr*/
4420 0, /*tp_as_number*/
4421 0, /*tp_as_sequence*/
4422 0, /*tp_as_mapping*/
4423 0, /*tp_hash*/
4424 0, /*tp_call*/
4425 0, /*tp_str*/
4426 0, /*tp_getattro*/
4427 0, /*tp_setattro*/
4428 0, /*tp_as_buffer*/
4429 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004430 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004431 (traverseproc)Pickler_traverse, /*tp_traverse*/
4432 (inquiry)Pickler_clear, /*tp_clear*/
4433 0, /*tp_richcompare*/
4434 0, /*tp_weaklistoffset*/
4435 0, /*tp_iter*/
4436 0, /*tp_iternext*/
4437 Pickler_methods, /*tp_methods*/
4438 Pickler_members, /*tp_members*/
4439 Pickler_getsets, /*tp_getset*/
4440 0, /*tp_base*/
4441 0, /*tp_dict*/
4442 0, /*tp_descr_get*/
4443 0, /*tp_descr_set*/
4444 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004445 _pickle_Pickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004446 PyType_GenericAlloc, /*tp_alloc*/
4447 PyType_GenericNew, /*tp_new*/
4448 PyObject_GC_Del, /*tp_free*/
4449 0, /*tp_is_gc*/
4450};
4451
Victor Stinner121aab42011-09-29 23:40:53 +02004452/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004453
4454 XXX: It would be nice to able to avoid Python function call overhead, by
4455 using directly the C version of find_class(), when find_class() is not
4456 overridden by a subclass. Although, this could become rather hackish. A
4457 simpler optimization would be to call the C function when self is not a
4458 subclass instance. */
4459static PyObject *
4460find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4461{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004462 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004463
4464 return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO",
4465 module_name, global_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004466}
4467
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004468static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004469marker(UnpicklerObject *self)
4470{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004471 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004472 if (self->num_marks < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004473 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004474 return -1;
4475 }
4476
4477 return self->marks[--self->num_marks];
4478}
4479
4480static int
4481load_none(UnpicklerObject *self)
4482{
4483 PDATA_APPEND(self->stack, Py_None, -1);
4484 return 0;
4485}
4486
4487static int
4488bad_readline(void)
4489{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004490 PickleState *st = _Pickle_GetGlobalState();
4491 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004492 return -1;
4493}
4494
4495static int
4496load_int(UnpicklerObject *self)
4497{
4498 PyObject *value;
4499 char *endptr, *s;
4500 Py_ssize_t len;
4501 long x;
4502
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004503 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004504 return -1;
4505 if (len < 2)
4506 return bad_readline();
4507
4508 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02004509 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004510 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004511 x = strtol(s, &endptr, 0);
4512
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004513 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004514 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03004515 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004516 errno = 0;
4517 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004518 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004519 if (value == NULL) {
4520 PyErr_SetString(PyExc_ValueError,
4521 "could not convert string to int");
4522 return -1;
4523 }
4524 }
4525 else {
4526 if (len == 3 && (x == 0 || x == 1)) {
4527 if ((value = PyBool_FromLong(x)) == NULL)
4528 return -1;
4529 }
4530 else {
4531 if ((value = PyLong_FromLong(x)) == NULL)
4532 return -1;
4533 }
4534 }
4535
4536 PDATA_PUSH(self->stack, value, -1);
4537 return 0;
4538}
4539
4540static int
4541load_bool(UnpicklerObject *self, PyObject *boolean)
4542{
4543 assert(boolean == Py_True || boolean == Py_False);
4544 PDATA_APPEND(self->stack, boolean, -1);
4545 return 0;
4546}
4547
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004548/* s contains x bytes of an unsigned little-endian integer. Return its value
4549 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4550 */
4551static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004552calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004553{
4554 unsigned char *s = (unsigned char *)bytes;
Victor Stinnerf13c46c2014-08-17 21:05:55 +02004555 Py_ssize_t i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004556 size_t x = 0;
4557
Victor Stinnerf13c46c2014-08-17 21:05:55 +02004558 for (i = 0; i < nbytes && (size_t)i < sizeof(size_t); i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004559 x |= (size_t) s[i] << (8 * i);
4560 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004561
4562 if (x > PY_SSIZE_T_MAX)
4563 return -1;
4564 else
4565 return (Py_ssize_t) x;
4566}
4567
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004568/* s contains x bytes of a little-endian integer. Return its value as a
4569 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
4570 * int, but when x is 4 it's a signed one. This is an historical source
4571 * of x-platform bugs.
4572 */
4573static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004574calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004575{
4576 unsigned char *s = (unsigned char *)bytes;
Victor Stinnerf13c46c2014-08-17 21:05:55 +02004577 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004578 long x = 0;
4579
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004580 for (i = 0; i < nbytes; i++) {
4581 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004582 }
4583
4584 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4585 * is signed, so on a box with longs bigger than 4 bytes we need
4586 * to extend a BININT's sign bit to the full width.
4587 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004588 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004589 x |= -(x & (1L << 31));
4590 }
4591
4592 return x;
4593}
4594
4595static int
4596load_binintx(UnpicklerObject *self, char *s, int size)
4597{
4598 PyObject *value;
4599 long x;
4600
4601 x = calc_binint(s, size);
4602
4603 if ((value = PyLong_FromLong(x)) == NULL)
4604 return -1;
4605
4606 PDATA_PUSH(self->stack, value, -1);
4607 return 0;
4608}
4609
4610static int
4611load_binint(UnpicklerObject *self)
4612{
4613 char *s;
4614
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004615 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004616 return -1;
4617
4618 return load_binintx(self, s, 4);
4619}
4620
4621static int
4622load_binint1(UnpicklerObject *self)
4623{
4624 char *s;
4625
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004626 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004627 return -1;
4628
4629 return load_binintx(self, s, 1);
4630}
4631
4632static int
4633load_binint2(UnpicklerObject *self)
4634{
4635 char *s;
4636
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004637 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004638 return -1;
4639
4640 return load_binintx(self, s, 2);
4641}
4642
4643static int
4644load_long(UnpicklerObject *self)
4645{
4646 PyObject *value;
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004647 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004648 Py_ssize_t len;
4649
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004650 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004651 return -1;
4652 if (len < 2)
4653 return bad_readline();
4654
Mark Dickinson8dd05142009-01-20 20:43:58 +00004655 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4656 the 'L' before calling PyLong_FromString. In order to maintain
4657 compatibility with Python 3.0.0, we don't actually *require*
4658 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004659 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004660 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00004661 /* XXX: Should the base argument explicitly set to 10? */
4662 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00004663 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004664 return -1;
4665
4666 PDATA_PUSH(self->stack, value, -1);
4667 return 0;
4668}
4669
4670/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4671 * data following.
4672 */
4673static int
4674load_counted_long(UnpicklerObject *self, int size)
4675{
4676 PyObject *value;
4677 char *nbytes;
4678 char *pdata;
4679
4680 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004681 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004682 return -1;
4683
4684 size = calc_binint(nbytes, size);
4685 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004686 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004687 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004688 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004689 "LONG pickle has negative byte count");
4690 return -1;
4691 }
4692
4693 if (size == 0)
4694 value = PyLong_FromLong(0L);
4695 else {
4696 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004697 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004698 return -1;
4699 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
4700 1 /* little endian */ , 1 /* signed */ );
4701 }
4702 if (value == NULL)
4703 return -1;
4704 PDATA_PUSH(self->stack, value, -1);
4705 return 0;
4706}
4707
4708static int
4709load_float(UnpicklerObject *self)
4710{
4711 PyObject *value;
4712 char *endptr, *s;
4713 Py_ssize_t len;
4714 double d;
4715
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004716 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004717 return -1;
4718 if (len < 2)
4719 return bad_readline();
4720
4721 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004722 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
4723 if (d == -1.0 && PyErr_Occurred())
4724 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004725 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004726 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
4727 return -1;
4728 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00004729 value = PyFloat_FromDouble(d);
4730 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004731 return -1;
4732
4733 PDATA_PUSH(self->stack, value, -1);
4734 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004735}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004736
4737static int
4738load_binfloat(UnpicklerObject *self)
4739{
4740 PyObject *value;
4741 double x;
4742 char *s;
4743
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004744 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004745 return -1;
4746
4747 x = _PyFloat_Unpack8((unsigned char *)s, 0);
4748 if (x == -1.0 && PyErr_Occurred())
4749 return -1;
4750
4751 if ((value = PyFloat_FromDouble(x)) == NULL)
4752 return -1;
4753
4754 PDATA_PUSH(self->stack, value, -1);
4755 return 0;
4756}
4757
4758static int
4759load_string(UnpicklerObject *self)
4760{
4761 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004762 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004763 Py_ssize_t len;
4764 char *s, *p;
4765
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004766 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004767 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004768 /* Strip the newline */
4769 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004770 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004771 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004772 p = s + 1;
4773 len -= 2;
4774 }
4775 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004776 PickleState *st = _Pickle_GetGlobalState();
4777 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004778 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004779 return -1;
4780 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004781 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004782
4783 /* Use the PyBytes API to decode the string, since that is what is used
4784 to encode, and then coerce the result to Unicode. */
4785 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004786 if (bytes == NULL)
4787 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004788
4789 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
4790 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4791 if (strcmp(self->encoding, "bytes") == 0) {
4792 obj = bytes;
4793 }
4794 else {
4795 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
4796 Py_DECREF(bytes);
4797 if (obj == NULL) {
4798 return -1;
4799 }
4800 }
4801
4802 PDATA_PUSH(self->stack, obj, -1);
4803 return 0;
4804}
4805
4806static int
4807load_counted_binstring(UnpicklerObject *self, int nbytes)
4808{
4809 PyObject *obj;
4810 Py_ssize_t size;
4811 char *s;
4812
4813 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004814 return -1;
4815
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004816 size = calc_binsize(s, nbytes);
4817 if (size < 0) {
4818 PickleState *st = _Pickle_GetGlobalState();
4819 PyErr_Format(st->UnpicklingError,
4820 "BINSTRING exceeds system's maximum size of %zd bytes",
4821 PY_SSIZE_T_MAX);
4822 return -1;
4823 }
4824
4825 if (_Unpickler_Read(self, &s, size) < 0)
4826 return -1;
4827
4828 /* Convert Python 2.x strings to bytes if the *encoding* given to the
4829 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4830 if (strcmp(self->encoding, "bytes") == 0) {
4831 obj = PyBytes_FromStringAndSize(s, size);
4832 }
4833 else {
4834 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
4835 }
4836 if (obj == NULL) {
4837 return -1;
4838 }
4839
4840 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004841 return 0;
4842}
4843
4844static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004845load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004846{
4847 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004848 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004849 char *s;
4850
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004851 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004852 return -1;
4853
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004854 size = calc_binsize(s, nbytes);
4855 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004856 PyErr_Format(PyExc_OverflowError,
4857 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004858 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004859 return -1;
4860 }
4861
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004862 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004863 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004864
4865 bytes = PyBytes_FromStringAndSize(s, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004866 if (bytes == NULL)
4867 return -1;
4868
4869 PDATA_PUSH(self->stack, bytes, -1);
4870 return 0;
4871}
4872
4873static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004874load_unicode(UnpicklerObject *self)
4875{
4876 PyObject *str;
4877 Py_ssize_t len;
4878 char *s;
4879
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004880 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004881 return -1;
4882 if (len < 1)
4883 return bad_readline();
4884
4885 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
4886 if (str == NULL)
4887 return -1;
4888
4889 PDATA_PUSH(self->stack, str, -1);
4890 return 0;
4891}
4892
4893static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004894load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004895{
4896 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004897 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004898 char *s;
4899
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004900 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004901 return -1;
4902
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004903 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004904 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004905 PyErr_Format(PyExc_OverflowError,
4906 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004907 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004908 return -1;
4909 }
4910
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004911 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004912 return -1;
4913
Victor Stinner485fb562010-04-13 11:07:24 +00004914 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004915 if (str == NULL)
4916 return -1;
4917
4918 PDATA_PUSH(self->stack, str, -1);
4919 return 0;
4920}
4921
4922static int
4923load_tuple(UnpicklerObject *self)
4924{
4925 PyObject *tuple;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004926 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004927
4928 if ((i = marker(self)) < 0)
4929 return -1;
4930
4931 tuple = Pdata_poptuple(self->stack, i);
4932 if (tuple == NULL)
4933 return -1;
4934 PDATA_PUSH(self->stack, tuple, -1);
4935 return 0;
4936}
4937
4938static int
4939load_counted_tuple(UnpicklerObject *self, int len)
4940{
4941 PyObject *tuple;
4942
4943 tuple = PyTuple_New(len);
4944 if (tuple == NULL)
4945 return -1;
4946
4947 while (--len >= 0) {
4948 PyObject *item;
4949
4950 PDATA_POP(self->stack, item);
4951 if (item == NULL)
4952 return -1;
4953 PyTuple_SET_ITEM(tuple, len, item);
4954 }
4955 PDATA_PUSH(self->stack, tuple, -1);
4956 return 0;
4957}
4958
4959static int
4960load_empty_list(UnpicklerObject *self)
4961{
4962 PyObject *list;
4963
4964 if ((list = PyList_New(0)) == NULL)
4965 return -1;
4966 PDATA_PUSH(self->stack, list, -1);
4967 return 0;
4968}
4969
4970static int
4971load_empty_dict(UnpicklerObject *self)
4972{
4973 PyObject *dict;
4974
4975 if ((dict = PyDict_New()) == NULL)
4976 return -1;
4977 PDATA_PUSH(self->stack, dict, -1);
4978 return 0;
4979}
4980
4981static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004982load_empty_set(UnpicklerObject *self)
4983{
4984 PyObject *set;
4985
4986 if ((set = PySet_New(NULL)) == NULL)
4987 return -1;
4988 PDATA_PUSH(self->stack, set, -1);
4989 return 0;
4990}
4991
4992static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004993load_list(UnpicklerObject *self)
4994{
4995 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004996 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004997
4998 if ((i = marker(self)) < 0)
4999 return -1;
5000
5001 list = Pdata_poplist(self->stack, i);
5002 if (list == NULL)
5003 return -1;
5004 PDATA_PUSH(self->stack, list, -1);
5005 return 0;
5006}
5007
5008static int
5009load_dict(UnpicklerObject *self)
5010{
5011 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005012 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005013
5014 if ((i = marker(self)) < 0)
5015 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005016 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005017
5018 if ((dict = PyDict_New()) == NULL)
5019 return -1;
5020
5021 for (k = i + 1; k < j; k += 2) {
5022 key = self->stack->data[k - 1];
5023 value = self->stack->data[k];
5024 if (PyDict_SetItem(dict, key, value) < 0) {
5025 Py_DECREF(dict);
5026 return -1;
5027 }
5028 }
5029 Pdata_clear(self->stack, i);
5030 PDATA_PUSH(self->stack, dict, -1);
5031 return 0;
5032}
5033
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005034static int
5035load_frozenset(UnpicklerObject *self)
5036{
5037 PyObject *items;
5038 PyObject *frozenset;
5039 Py_ssize_t i;
5040
5041 if ((i = marker(self)) < 0)
5042 return -1;
5043
5044 items = Pdata_poptuple(self->stack, i);
5045 if (items == NULL)
5046 return -1;
5047
5048 frozenset = PyFrozenSet_New(items);
5049 Py_DECREF(items);
5050 if (frozenset == NULL)
5051 return -1;
5052
5053 PDATA_PUSH(self->stack, frozenset, -1);
5054 return 0;
5055}
5056
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005057static PyObject *
5058instantiate(PyObject *cls, PyObject *args)
5059{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005060 PyObject *result = NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005061 _Py_IDENTIFIER(__getinitargs__);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005062 /* Caller must assure args are a tuple. Normally, args come from
5063 Pdata_poptuple which packs objects from the top of the stack
5064 into a newly created tuple. */
5065 assert(PyTuple_Check(args));
5066 if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005067 _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005068 result = PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005069 }
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005070 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005071 _Py_IDENTIFIER(__new__);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005072
5073 result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005074 }
5075 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005076}
5077
5078static int
5079load_obj(UnpicklerObject *self)
5080{
5081 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005082 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005083
5084 if ((i = marker(self)) < 0)
5085 return -1;
5086
5087 args = Pdata_poptuple(self->stack, i + 1);
5088 if (args == NULL)
5089 return -1;
5090
5091 PDATA_POP(self->stack, cls);
5092 if (cls) {
5093 obj = instantiate(cls, args);
5094 Py_DECREF(cls);
5095 }
5096 Py_DECREF(args);
5097 if (obj == NULL)
5098 return -1;
5099
5100 PDATA_PUSH(self->stack, obj, -1);
5101 return 0;
5102}
5103
5104static int
5105load_inst(UnpicklerObject *self)
5106{
5107 PyObject *cls = NULL;
5108 PyObject *args = NULL;
5109 PyObject *obj = NULL;
5110 PyObject *module_name;
5111 PyObject *class_name;
5112 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005113 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005114 char *s;
5115
5116 if ((i = marker(self)) < 0)
5117 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005118 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005119 return -1;
5120 if (len < 2)
5121 return bad_readline();
5122
5123 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5124 identifiers are permitted in Python 3.0, since the INST opcode is only
5125 supported by older protocols on Python 2.x. */
5126 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5127 if (module_name == NULL)
5128 return -1;
5129
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005130 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005131 if (len < 2)
5132 return bad_readline();
5133 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005134 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005135 cls = find_class(self, module_name, class_name);
5136 Py_DECREF(class_name);
5137 }
5138 }
5139 Py_DECREF(module_name);
5140
5141 if (cls == NULL)
5142 return -1;
5143
5144 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5145 obj = instantiate(cls, args);
5146 Py_DECREF(args);
5147 }
5148 Py_DECREF(cls);
5149
5150 if (obj == NULL)
5151 return -1;
5152
5153 PDATA_PUSH(self->stack, obj, -1);
5154 return 0;
5155}
5156
5157static int
5158load_newobj(UnpicklerObject *self)
5159{
5160 PyObject *args = NULL;
5161 PyObject *clsraw = NULL;
5162 PyTypeObject *cls; /* clsraw cast to its true type */
5163 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005164 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005165
5166 /* Stack is ... cls argtuple, and we want to call
5167 * cls.__new__(cls, *argtuple).
5168 */
5169 PDATA_POP(self->stack, args);
5170 if (args == NULL)
5171 goto error;
5172 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005173 PyErr_SetString(st->UnpicklingError,
5174 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005175 goto error;
5176 }
5177
5178 PDATA_POP(self->stack, clsraw);
5179 cls = (PyTypeObject *)clsraw;
5180 if (cls == NULL)
5181 goto error;
5182 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005183 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005184 "isn't a type object");
5185 goto error;
5186 }
5187 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005188 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005189 "has NULL tp_new");
5190 goto error;
5191 }
5192
5193 /* Call __new__. */
5194 obj = cls->tp_new(cls, args, NULL);
5195 if (obj == NULL)
5196 goto error;
5197
5198 Py_DECREF(args);
5199 Py_DECREF(clsraw);
5200 PDATA_PUSH(self->stack, obj, -1);
5201 return 0;
5202
5203 error:
5204 Py_XDECREF(args);
5205 Py_XDECREF(clsraw);
5206 return -1;
5207}
5208
5209static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005210load_newobj_ex(UnpicklerObject *self)
5211{
5212 PyObject *cls, *args, *kwargs;
5213 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005214 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005215
5216 PDATA_POP(self->stack, kwargs);
5217 if (kwargs == NULL) {
5218 return -1;
5219 }
5220 PDATA_POP(self->stack, args);
5221 if (args == NULL) {
5222 Py_DECREF(kwargs);
5223 return -1;
5224 }
5225 PDATA_POP(self->stack, cls);
5226 if (cls == NULL) {
5227 Py_DECREF(kwargs);
5228 Py_DECREF(args);
5229 return -1;
5230 }
Larry Hastings61272b72014-01-07 12:41:53 -08005231
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005232 if (!PyType_Check(cls)) {
5233 Py_DECREF(kwargs);
5234 Py_DECREF(args);
5235 Py_DECREF(cls);
Larry Hastings61272b72014-01-07 12:41:53 -08005236 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005237 "NEWOBJ_EX class argument must be a type, not %.200s",
5238 Py_TYPE(cls)->tp_name);
5239 return -1;
5240 }
5241
5242 if (((PyTypeObject *)cls)->tp_new == NULL) {
5243 Py_DECREF(kwargs);
5244 Py_DECREF(args);
5245 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005246 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005247 "NEWOBJ_EX class argument doesn't have __new__");
5248 return -1;
5249 }
5250 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5251 Py_DECREF(kwargs);
5252 Py_DECREF(args);
5253 Py_DECREF(cls);
5254 if (obj == NULL) {
5255 return -1;
5256 }
5257 PDATA_PUSH(self->stack, obj, -1);
5258 return 0;
5259}
5260
5261static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005262load_global(UnpicklerObject *self)
5263{
5264 PyObject *global = NULL;
5265 PyObject *module_name;
5266 PyObject *global_name;
5267 Py_ssize_t len;
5268 char *s;
5269
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005270 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005271 return -1;
5272 if (len < 2)
5273 return bad_readline();
5274 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5275 if (!module_name)
5276 return -1;
5277
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005278 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005279 if (len < 2) {
5280 Py_DECREF(module_name);
5281 return bad_readline();
5282 }
5283 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5284 if (global_name) {
5285 global = find_class(self, module_name, global_name);
5286 Py_DECREF(global_name);
5287 }
5288 }
5289 Py_DECREF(module_name);
5290
5291 if (global == NULL)
5292 return -1;
5293 PDATA_PUSH(self->stack, global, -1);
5294 return 0;
5295}
5296
5297static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005298load_stack_global(UnpicklerObject *self)
5299{
5300 PyObject *global;
5301 PyObject *module_name;
5302 PyObject *global_name;
5303
5304 PDATA_POP(self->stack, global_name);
5305 PDATA_POP(self->stack, module_name);
5306 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5307 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005308 PickleState *st = _Pickle_GetGlobalState();
5309 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005310 Py_XDECREF(global_name);
5311 Py_XDECREF(module_name);
5312 return -1;
5313 }
5314 global = find_class(self, module_name, global_name);
5315 Py_DECREF(global_name);
5316 Py_DECREF(module_name);
5317 if (global == NULL)
5318 return -1;
5319 PDATA_PUSH(self->stack, global, -1);
5320 return 0;
5321}
5322
5323static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005324load_persid(UnpicklerObject *self)
5325{
5326 PyObject *pid;
5327 Py_ssize_t len;
5328 char *s;
5329
5330 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005331 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005332 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08005333 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005334 return bad_readline();
5335
5336 pid = PyBytes_FromStringAndSize(s, len - 1);
5337 if (pid == NULL)
5338 return -1;
5339
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005340 /* This does not leak since _Pickle_FastCall() steals the reference
5341 to pid first. */
5342 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005343 if (pid == NULL)
5344 return -1;
5345
5346 PDATA_PUSH(self->stack, pid, -1);
5347 return 0;
5348 }
5349 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005350 PickleState *st = _Pickle_GetGlobalState();
5351 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005352 "A load persistent id instruction was encountered,\n"
5353 "but no persistent_load function was specified.");
5354 return -1;
5355 }
5356}
5357
5358static int
5359load_binpersid(UnpicklerObject *self)
5360{
5361 PyObject *pid;
5362
5363 if (self->pers_func) {
5364 PDATA_POP(self->stack, pid);
5365 if (pid == NULL)
5366 return -1;
5367
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005368 /* This does not leak since _Pickle_FastCall() steals the
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005369 reference to pid first. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005370 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005371 if (pid == NULL)
5372 return -1;
5373
5374 PDATA_PUSH(self->stack, pid, -1);
5375 return 0;
5376 }
5377 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005378 PickleState *st = _Pickle_GetGlobalState();
5379 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005380 "A load persistent id instruction was encountered,\n"
5381 "but no persistent_load function was specified.");
5382 return -1;
5383 }
5384}
5385
5386static int
5387load_pop(UnpicklerObject *self)
5388{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005389 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005390
5391 /* Note that we split the (pickle.py) stack into two stacks,
5392 * an object stack and a mark stack. We have to be clever and
5393 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005394 * mark stack first, and only signalling a stack underflow if
5395 * the object stack is empty and the mark stack doesn't match
5396 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005397 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005398 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005399 self->num_marks--;
Antoine Pitrou01a15ea2010-01-07 17:57:31 +00005400 } else if (len > 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005401 len--;
5402 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005403 Py_SIZE(self->stack) = len;
Collin Winter8ca69de2009-05-26 16:53:41 +00005404 } else {
5405 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005406 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005407 return 0;
5408}
5409
5410static int
5411load_pop_mark(UnpicklerObject *self)
5412{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005413 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005414
5415 if ((i = marker(self)) < 0)
5416 return -1;
5417
5418 Pdata_clear(self->stack, i);
5419
5420 return 0;
5421}
5422
5423static int
5424load_dup(UnpicklerObject *self)
5425{
5426 PyObject *last;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005427 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005428
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005429 if ((len = Py_SIZE(self->stack)) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005430 return stack_underflow();
5431 last = self->stack->data[len - 1];
5432 PDATA_APPEND(self->stack, last, -1);
5433 return 0;
5434}
5435
5436static int
5437load_get(UnpicklerObject *self)
5438{
5439 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005440 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005441 Py_ssize_t len;
5442 char *s;
5443
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005444 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005445 return -1;
5446 if (len < 2)
5447 return bad_readline();
5448
5449 key = PyLong_FromString(s, NULL, 10);
5450 if (key == NULL)
5451 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005452 idx = PyLong_AsSsize_t(key);
5453 if (idx == -1 && PyErr_Occurred()) {
5454 Py_DECREF(key);
5455 return -1;
5456 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005457
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005458 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005459 if (value == NULL) {
5460 if (!PyErr_Occurred())
5461 PyErr_SetObject(PyExc_KeyError, key);
5462 Py_DECREF(key);
5463 return -1;
5464 }
5465 Py_DECREF(key);
5466
5467 PDATA_APPEND(self->stack, value, -1);
5468 return 0;
5469}
5470
5471static int
5472load_binget(UnpicklerObject *self)
5473{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005474 PyObject *value;
5475 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005476 char *s;
5477
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005478 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005479 return -1;
5480
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005481 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005482
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005483 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005484 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005485 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005486 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005487 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005488 Py_DECREF(key);
5489 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005490 return -1;
5491 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005492
5493 PDATA_APPEND(self->stack, value, -1);
5494 return 0;
5495}
5496
5497static int
5498load_long_binget(UnpicklerObject *self)
5499{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005500 PyObject *value;
5501 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005502 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005503
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005504 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005505 return -1;
5506
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005507 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005508
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005509 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005510 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005511 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005512 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005513 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005514 Py_DECREF(key);
5515 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005516 return -1;
5517 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005518
5519 PDATA_APPEND(self->stack, value, -1);
5520 return 0;
5521}
5522
5523/* Push an object from the extension registry (EXT[124]). nbytes is
5524 * the number of bytes following the opcode, holding the index (code) value.
5525 */
5526static int
5527load_extension(UnpicklerObject *self, int nbytes)
5528{
5529 char *codebytes; /* the nbytes bytes after the opcode */
5530 long code; /* calc_binint returns long */
5531 PyObject *py_code; /* code as a Python int */
5532 PyObject *obj; /* the object to push */
5533 PyObject *pair; /* (module_name, class_name) */
5534 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005535 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005536
5537 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005538 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005539 return -1;
5540 code = calc_binint(codebytes, nbytes);
5541 if (code <= 0) { /* note that 0 is forbidden */
5542 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005543 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005544 return -1;
5545 }
5546
5547 /* Look for the code in the cache. */
5548 py_code = PyLong_FromLong(code);
5549 if (py_code == NULL)
5550 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005551 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005552 if (obj != NULL) {
5553 /* Bingo. */
5554 Py_DECREF(py_code);
5555 PDATA_APPEND(self->stack, obj, -1);
5556 return 0;
5557 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005558 if (PyErr_Occurred()) {
5559 Py_DECREF(py_code);
5560 return -1;
5561 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005562
5563 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005564 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005565 if (pair == NULL) {
5566 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005567 if (!PyErr_Occurred()) {
5568 PyErr_Format(PyExc_ValueError, "unregistered extension "
5569 "code %ld", code);
5570 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005571 return -1;
5572 }
5573 /* Since the extension registry is manipulable via Python code,
5574 * confirm that pair is really a 2-tuple of strings.
5575 */
5576 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5577 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5578 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5579 Py_DECREF(py_code);
5580 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5581 "isn't a 2-tuple of strings", code);
5582 return -1;
5583 }
5584 /* Load the object. */
5585 obj = find_class(self, module_name, class_name);
5586 if (obj == NULL) {
5587 Py_DECREF(py_code);
5588 return -1;
5589 }
5590 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005591 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005592 Py_DECREF(py_code);
5593 if (code < 0) {
5594 Py_DECREF(obj);
5595 return -1;
5596 }
5597 PDATA_PUSH(self->stack, obj, -1);
5598 return 0;
5599}
5600
5601static int
5602load_put(UnpicklerObject *self)
5603{
5604 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005605 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005606 Py_ssize_t len;
5607 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005608
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005609 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005610 return -1;
5611 if (len < 2)
5612 return bad_readline();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005613 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005614 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005615 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005616
5617 key = PyLong_FromString(s, NULL, 10);
5618 if (key == NULL)
5619 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005620 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005621 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005622 if (idx < 0) {
5623 if (!PyErr_Occurred())
5624 PyErr_SetString(PyExc_ValueError,
5625 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005626 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005627 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005628
5629 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005630}
5631
5632static int
5633load_binput(UnpicklerObject *self)
5634{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005635 PyObject *value;
5636 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005637 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005638
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005639 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005640 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005641
5642 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005643 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005644 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005645
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005646 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005647
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005648 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005649}
5650
5651static int
5652load_long_binput(UnpicklerObject *self)
5653{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005654 PyObject *value;
5655 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005656 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005657
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005658 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005659 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005660
5661 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005662 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005663 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005664
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005665 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005666 if (idx < 0) {
5667 PyErr_SetString(PyExc_ValueError,
5668 "negative LONG_BINPUT argument");
5669 return -1;
5670 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005671
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005672 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005673}
5674
5675static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005676load_memoize(UnpicklerObject *self)
5677{
5678 PyObject *value;
5679
5680 if (Py_SIZE(self->stack) <= 0)
5681 return stack_underflow();
5682 value = self->stack->data[Py_SIZE(self->stack) - 1];
5683
5684 return _Unpickler_MemoPut(self, self->memo_len, value);
5685}
5686
5687static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005688do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005689{
5690 PyObject *value;
5691 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005692 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005693
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005694 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005695 if (x > len || x <= 0)
5696 return stack_underflow();
5697 if (len == x) /* nothing to do */
5698 return 0;
5699
5700 list = self->stack->data[x - 1];
5701
5702 if (PyList_Check(list)) {
5703 PyObject *slice;
5704 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005705 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005706
5707 slice = Pdata_poplist(self->stack, x);
5708 if (!slice)
5709 return -1;
5710 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005711 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005712 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005713 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005714 }
5715 else {
5716 PyObject *append_func;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005717 _Py_IDENTIFIER(append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005718
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005719 append_func = _PyObject_GetAttrId(list, &PyId_append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005720 if (append_func == NULL)
5721 return -1;
5722 for (i = x; i < len; i++) {
5723 PyObject *result;
5724
5725 value = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005726 result = _Pickle_FastCall(append_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005727 if (result == NULL) {
5728 Pdata_clear(self->stack, i + 1);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005729 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005730 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005731 return -1;
5732 }
5733 Py_DECREF(result);
5734 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005735 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005736 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005737 }
5738
5739 return 0;
5740}
5741
5742static int
5743load_append(UnpicklerObject *self)
5744{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005745 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005746}
5747
5748static int
5749load_appends(UnpicklerObject *self)
5750{
5751 return do_append(self, marker(self));
5752}
5753
5754static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005755do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005756{
5757 PyObject *value, *key;
5758 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005759 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005760 int status = 0;
5761
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005762 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005763 if (x > len || x <= 0)
5764 return stack_underflow();
5765 if (len == x) /* nothing to do */
5766 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005767 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005768 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005769 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005770 PyErr_SetString(st->UnpicklingError,
5771 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005772 return -1;
5773 }
5774
5775 /* Here, dict does not actually need to be a PyDict; it could be anything
5776 that supports the __setitem__ attribute. */
5777 dict = self->stack->data[x - 1];
5778
5779 for (i = x + 1; i < len; i += 2) {
5780 key = self->stack->data[i - 1];
5781 value = self->stack->data[i];
5782 if (PyObject_SetItem(dict, key, value) < 0) {
5783 status = -1;
5784 break;
5785 }
5786 }
5787
5788 Pdata_clear(self->stack, x);
5789 return status;
5790}
5791
5792static int
5793load_setitem(UnpicklerObject *self)
5794{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005795 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005796}
5797
5798static int
5799load_setitems(UnpicklerObject *self)
5800{
5801 return do_setitems(self, marker(self));
5802}
5803
5804static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005805load_additems(UnpicklerObject *self)
5806{
5807 PyObject *set;
5808 Py_ssize_t mark, len, i;
5809
5810 mark = marker(self);
5811 len = Py_SIZE(self->stack);
5812 if (mark > len || mark <= 0)
5813 return stack_underflow();
5814 if (len == mark) /* nothing to do */
5815 return 0;
5816
5817 set = self->stack->data[mark - 1];
5818
5819 if (PySet_Check(set)) {
5820 PyObject *items;
5821 int status;
5822
5823 items = Pdata_poptuple(self->stack, mark);
5824 if (items == NULL)
5825 return -1;
5826
5827 status = _PySet_Update(set, items);
5828 Py_DECREF(items);
5829 return status;
5830 }
5831 else {
5832 PyObject *add_func;
5833 _Py_IDENTIFIER(add);
5834
5835 add_func = _PyObject_GetAttrId(set, &PyId_add);
5836 if (add_func == NULL)
5837 return -1;
5838 for (i = mark; i < len; i++) {
5839 PyObject *result;
5840 PyObject *item;
5841
5842 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005843 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005844 if (result == NULL) {
5845 Pdata_clear(self->stack, i + 1);
5846 Py_SIZE(self->stack) = mark;
5847 return -1;
5848 }
5849 Py_DECREF(result);
5850 }
5851 Py_SIZE(self->stack) = mark;
5852 }
5853
5854 return 0;
5855}
5856
5857static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005858load_build(UnpicklerObject *self)
5859{
5860 PyObject *state, *inst, *slotstate;
5861 PyObject *setstate;
5862 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005863 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005864
5865 /* Stack is ... instance, state. We want to leave instance at
5866 * the stack top, possibly mutated via instance.__setstate__(state).
5867 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005868 if (Py_SIZE(self->stack) < 2)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005869 return stack_underflow();
5870
5871 PDATA_POP(self->stack, state);
5872 if (state == NULL)
5873 return -1;
5874
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005875 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005876
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005877 setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005878 if (setstate == NULL) {
5879 if (PyErr_ExceptionMatches(PyExc_AttributeError))
5880 PyErr_Clear();
Antoine Pitroud79dc622008-09-05 00:03:33 +00005881 else {
5882 Py_DECREF(state);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005883 return -1;
Antoine Pitroud79dc622008-09-05 00:03:33 +00005884 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005885 }
5886 else {
5887 PyObject *result;
5888
5889 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005890 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005891 Py_DECREF(setstate);
5892 if (result == NULL)
5893 return -1;
5894 Py_DECREF(result);
5895 return 0;
5896 }
5897
5898 /* A default __setstate__. First see whether state embeds a
5899 * slot state dict too (a proto 2 addition).
5900 */
5901 if (PyTuple_Check(state) && Py_SIZE(state) == 2) {
5902 PyObject *tmp = state;
5903
5904 state = PyTuple_GET_ITEM(tmp, 0);
5905 slotstate = PyTuple_GET_ITEM(tmp, 1);
5906 Py_INCREF(state);
5907 Py_INCREF(slotstate);
5908 Py_DECREF(tmp);
5909 }
5910 else
5911 slotstate = NULL;
5912
5913 /* Set inst.__dict__ from the state dict (if any). */
5914 if (state != Py_None) {
5915 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005916 PyObject *d_key, *d_value;
5917 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005918 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005919
5920 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005921 PickleState *st = _Pickle_GetGlobalState();
5922 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005923 goto error;
5924 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005925 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005926 if (dict == NULL)
5927 goto error;
5928
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005929 i = 0;
5930 while (PyDict_Next(state, &i, &d_key, &d_value)) {
5931 /* normally the keys for instance attributes are
5932 interned. we should try to do that here. */
5933 Py_INCREF(d_key);
5934 if (PyUnicode_CheckExact(d_key))
5935 PyUnicode_InternInPlace(&d_key);
5936 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
5937 Py_DECREF(d_key);
5938 goto error;
5939 }
5940 Py_DECREF(d_key);
5941 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005942 Py_DECREF(dict);
5943 }
5944
5945 /* Also set instance attributes from the slotstate dict (if any). */
5946 if (slotstate != NULL) {
5947 PyObject *d_key, *d_value;
5948 Py_ssize_t i;
5949
5950 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005951 PickleState *st = _Pickle_GetGlobalState();
5952 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005953 "slot state is not a dictionary");
5954 goto error;
5955 }
5956 i = 0;
5957 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
5958 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
5959 goto error;
5960 }
5961 }
5962
5963 if (0) {
5964 error:
5965 status = -1;
5966 }
5967
5968 Py_DECREF(state);
5969 Py_XDECREF(slotstate);
5970 return status;
5971}
5972
5973static int
5974load_mark(UnpicklerObject *self)
5975{
5976
5977 /* Note that we split the (pickle.py) stack into two stacks, an
5978 * object stack and a mark stack. Here we push a mark onto the
5979 * mark stack.
5980 */
5981
5982 if ((self->num_marks + 1) >= self->marks_size) {
5983 size_t alloc;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005984 Py_ssize_t *marks;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005985
5986 /* Use the size_t type to check for overflow. */
5987 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005988 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00005989 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005990 PyErr_NoMemory();
5991 return -1;
5992 }
5993
5994 if (self->marks == NULL)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005995 marks = (Py_ssize_t *) PyMem_Malloc(alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005996 else
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005997 marks = (Py_ssize_t *) PyMem_Realloc(self->marks,
5998 alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005999 if (marks == NULL) {
6000 PyErr_NoMemory();
6001 return -1;
6002 }
6003 self->marks = marks;
6004 self->marks_size = (Py_ssize_t)alloc;
6005 }
6006
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006007 self->marks[self->num_marks++] = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006008
6009 return 0;
6010}
6011
6012static int
6013load_reduce(UnpicklerObject *self)
6014{
6015 PyObject *callable = NULL;
6016 PyObject *argtup = NULL;
6017 PyObject *obj = NULL;
6018
6019 PDATA_POP(self->stack, argtup);
6020 if (argtup == NULL)
6021 return -1;
6022 PDATA_POP(self->stack, callable);
6023 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006024 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006025 Py_DECREF(callable);
6026 }
6027 Py_DECREF(argtup);
6028
6029 if (obj == NULL)
6030 return -1;
6031
6032 PDATA_PUSH(self->stack, obj, -1);
6033 return 0;
6034}
6035
6036/* Just raises an error if we don't know the protocol specified. PROTO
6037 * is the first opcode for protocols >= 2.
6038 */
6039static int
6040load_proto(UnpicklerObject *self)
6041{
6042 char *s;
6043 int i;
6044
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006045 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006046 return -1;
6047
6048 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006049 if (i <= HIGHEST_PROTOCOL) {
6050 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006051 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006052 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006053
6054 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6055 return -1;
6056}
6057
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006058static int
6059load_frame(UnpicklerObject *self)
6060{
6061 char *s;
6062 Py_ssize_t frame_len;
6063
6064 if (_Unpickler_Read(self, &s, 8) < 0)
6065 return -1;
6066
6067 frame_len = calc_binsize(s, 8);
6068 if (frame_len < 0) {
6069 PyErr_Format(PyExc_OverflowError,
6070 "FRAME length exceeds system's maximum of %zd bytes",
6071 PY_SSIZE_T_MAX);
6072 return -1;
6073 }
6074
6075 if (_Unpickler_Read(self, &s, frame_len) < 0)
6076 return -1;
6077
6078 /* Rewind to start of frame */
6079 self->next_read_idx -= frame_len;
6080 return 0;
6081}
6082
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006083static PyObject *
6084load(UnpicklerObject *self)
6085{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006086 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006087 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006088
6089 self->num_marks = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006090 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006091 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006092 Pdata_clear(self->stack, 0);
6093
6094 /* Convenient macros for the dispatch while-switch loop just below. */
6095#define OP(opcode, load_func) \
6096 case opcode: if (load_func(self) < 0) break; continue;
6097
6098#define OP_ARG(opcode, load_func, arg) \
6099 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6100
6101 while (1) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006102 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006103 break;
6104
6105 switch ((enum opcode)s[0]) {
6106 OP(NONE, load_none)
6107 OP(BININT, load_binint)
6108 OP(BININT1, load_binint1)
6109 OP(BININT2, load_binint2)
6110 OP(INT, load_int)
6111 OP(LONG, load_long)
6112 OP_ARG(LONG1, load_counted_long, 1)
6113 OP_ARG(LONG4, load_counted_long, 4)
6114 OP(FLOAT, load_float)
6115 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006116 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6117 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6118 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6119 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6120 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006121 OP(STRING, load_string)
6122 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006123 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6124 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6125 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006126 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6127 OP_ARG(TUPLE1, load_counted_tuple, 1)
6128 OP_ARG(TUPLE2, load_counted_tuple, 2)
6129 OP_ARG(TUPLE3, load_counted_tuple, 3)
6130 OP(TUPLE, load_tuple)
6131 OP(EMPTY_LIST, load_empty_list)
6132 OP(LIST, load_list)
6133 OP(EMPTY_DICT, load_empty_dict)
6134 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006135 OP(EMPTY_SET, load_empty_set)
6136 OP(ADDITEMS, load_additems)
6137 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006138 OP(OBJ, load_obj)
6139 OP(INST, load_inst)
6140 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006141 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006142 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006143 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006144 OP(APPEND, load_append)
6145 OP(APPENDS, load_appends)
6146 OP(BUILD, load_build)
6147 OP(DUP, load_dup)
6148 OP(BINGET, load_binget)
6149 OP(LONG_BINGET, load_long_binget)
6150 OP(GET, load_get)
6151 OP(MARK, load_mark)
6152 OP(BINPUT, load_binput)
6153 OP(LONG_BINPUT, load_long_binput)
6154 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006155 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006156 OP(POP, load_pop)
6157 OP(POP_MARK, load_pop_mark)
6158 OP(SETITEM, load_setitem)
6159 OP(SETITEMS, load_setitems)
6160 OP(PERSID, load_persid)
6161 OP(BINPERSID, load_binpersid)
6162 OP(REDUCE, load_reduce)
6163 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006164 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006165 OP_ARG(EXT1, load_extension, 1)
6166 OP_ARG(EXT2, load_extension, 2)
6167 OP_ARG(EXT4, load_extension, 4)
6168 OP_ARG(NEWTRUE, load_bool, Py_True)
6169 OP_ARG(NEWFALSE, load_bool, Py_False)
6170
6171 case STOP:
6172 break;
6173
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006174 default:
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006175 if (s[0] == '\0') {
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006176 PyErr_SetNone(PyExc_EOFError);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006177 }
6178 else {
6179 PickleState *st = _Pickle_GetGlobalState();
6180 PyErr_Format(st->UnpicklingError,
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006181 "invalid load key, '%c'.", s[0]);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006182 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006183 return NULL;
6184 }
6185
6186 break; /* and we are done! */
6187 }
6188
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006189 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006190 return NULL;
6191 }
6192
Victor Stinner2ae57e32013-10-31 13:39:23 +01006193 if (_Unpickler_SkipConsumed(self) < 0)
6194 return NULL;
6195
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006196 PDATA_POP(self->stack, value);
6197 return value;
6198}
6199
Larry Hastings61272b72014-01-07 12:41:53 -08006200/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006201
6202_pickle.Unpickler.load
6203
6204Load a pickle.
6205
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006206Read a pickled object representation from the open file object given
6207in the constructor, and return the reconstituted object hierarchy
6208specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006209[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006210
Larry Hastings3cceb382014-01-04 11:09:09 -08006211static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006212_pickle_Unpickler_load_impl(UnpicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006213/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006214{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006215 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006216
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006217 /* Check whether the Unpickler was initialized correctly. This prevents
6218 segfaulting if a subclass overridden __init__ with a function that does
6219 not call Unpickler.__init__(). Here, we simply ensure that self->read
6220 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006221 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006222 PickleState *st = _Pickle_GetGlobalState();
6223 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006224 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006225 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006226 return NULL;
6227 }
6228
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006229 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006230}
6231
6232/* The name of find_class() is misleading. In newer pickle protocols, this
6233 function is used for loading any global (i.e., functions), not just
6234 classes. The name is kept only for backward compatibility. */
6235
Larry Hastings61272b72014-01-07 12:41:53 -08006236/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006237
6238_pickle.Unpickler.find_class
6239
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006240 module_name: object
6241 global_name: object
6242 /
6243
6244Return an object from a specified module.
6245
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006246If necessary, the module will be imported. Subclasses may override
6247this method (e.g. to restrict unpickling of arbitrary classes and
6248functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006249
6250This method is called whenever a class or a function object is
6251needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006252[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006253
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006254static PyObject *
6255_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
Larry Hastings581ee362014-01-28 05:00:08 -08006256/*[clinic end generated code: output=64c77437e088e188 input=e2e6a865de093ef4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006257{
6258 PyObject *global;
6259 PyObject *modules_dict;
6260 PyObject *module;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006261 _Py_IDENTIFIER(modules);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006262
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006263 /* Try to map the old names used in Python 2.x to the new ones used in
6264 Python 3.x. We do this only with old pickle protocols and when the
6265 user has not disabled the feature. */
6266 if (self->proto < 3 && self->fix_imports) {
6267 PyObject *key;
6268 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006269 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006270
6271 /* Check if the global (i.e., a function or a class) was renamed
6272 or moved to another module. */
6273 key = PyTuple_Pack(2, module_name, global_name);
6274 if (key == NULL)
6275 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006276 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006277 Py_DECREF(key);
6278 if (item) {
6279 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6280 PyErr_Format(PyExc_RuntimeError,
6281 "_compat_pickle.NAME_MAPPING values should be "
6282 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6283 return NULL;
6284 }
6285 module_name = PyTuple_GET_ITEM(item, 0);
6286 global_name = PyTuple_GET_ITEM(item, 1);
6287 if (!PyUnicode_Check(module_name) ||
6288 !PyUnicode_Check(global_name)) {
6289 PyErr_Format(PyExc_RuntimeError,
6290 "_compat_pickle.NAME_MAPPING values should be "
6291 "pairs of str, not (%.200s, %.200s)",
6292 Py_TYPE(module_name)->tp_name,
6293 Py_TYPE(global_name)->tp_name);
6294 return NULL;
6295 }
6296 }
6297 else if (PyErr_Occurred()) {
6298 return NULL;
6299 }
6300
6301 /* Check if the module was renamed. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006302 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006303 if (item) {
6304 if (!PyUnicode_Check(item)) {
6305 PyErr_Format(PyExc_RuntimeError,
6306 "_compat_pickle.IMPORT_MAPPING values should be "
6307 "strings, not %.200s", Py_TYPE(item)->tp_name);
6308 return NULL;
6309 }
6310 module_name = item;
6311 }
6312 else if (PyErr_Occurred()) {
6313 return NULL;
6314 }
6315 }
6316
Victor Stinnerbb520202013-11-06 22:40:41 +01006317 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02006318 if (modules_dict == NULL) {
6319 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006320 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02006321 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006322
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006323 module = PyDict_GetItemWithError(modules_dict, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006324 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006325 if (PyErr_Occurred())
6326 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006327 module = PyImport_Import(module_name);
6328 if (module == NULL)
6329 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006330 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006331 Py_DECREF(module);
6332 }
Victor Stinner121aab42011-09-29 23:40:53 +02006333 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006334 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006335 }
6336 return global;
6337}
6338
6339static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006340 _PICKLE_UNPICKLER_LOAD_METHODDEF
6341 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006342 {NULL, NULL} /* sentinel */
6343};
6344
6345static void
6346Unpickler_dealloc(UnpicklerObject *self)
6347{
6348 PyObject_GC_UnTrack((PyObject *)self);
6349 Py_XDECREF(self->readline);
6350 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006351 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006352 Py_XDECREF(self->stack);
6353 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006354 if (self->buffer.buf != NULL) {
6355 PyBuffer_Release(&self->buffer);
6356 self->buffer.buf = NULL;
6357 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006358
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006359 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006360 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006361 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006362 PyMem_Free(self->encoding);
6363 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006364
6365 Py_TYPE(self)->tp_free((PyObject *)self);
6366}
6367
6368static int
6369Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6370{
6371 Py_VISIT(self->readline);
6372 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006373 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006374 Py_VISIT(self->stack);
6375 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006376 return 0;
6377}
6378
6379static int
6380Unpickler_clear(UnpicklerObject *self)
6381{
6382 Py_CLEAR(self->readline);
6383 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006384 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006385 Py_CLEAR(self->stack);
6386 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006387 if (self->buffer.buf != NULL) {
6388 PyBuffer_Release(&self->buffer);
6389 self->buffer.buf = NULL;
6390 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006391
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006392 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006393 PyMem_Free(self->marks);
6394 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006395 PyMem_Free(self->input_line);
6396 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006397 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006398 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006399 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006400 self->errors = NULL;
6401
6402 return 0;
6403}
6404
Larry Hastings61272b72014-01-07 12:41:53 -08006405/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006406
6407_pickle.Unpickler.__init__
6408
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006409 file: object
6410 *
6411 fix_imports: bool = True
6412 encoding: str = 'ASCII'
6413 errors: str = 'strict'
6414
6415This takes a binary file for reading a pickle data stream.
6416
6417The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006418protocol argument is needed. Bytes past the pickled object's
6419representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006420
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006421The argument *file* must have two methods, a read() method that takes
6422an integer argument, and a readline() method that requires no
6423arguments. Both methods should return bytes. Thus *file* can be a
6424binary file object opened for reading, a io.BytesIO object, or any
6425other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006426
6427Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6428which are used to control compatiblity support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006429generated by Python 2. If *fix_imports* is True, pickle will try to
6430map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006431*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006432instances pickled by Python 2; these default to 'ASCII' and 'strict',
6433respectively. The *encoding* can be 'bytes' to read these 8-bit
6434string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006435[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006436
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006437static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006438_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, const char *errors)
Larry Hastings581ee362014-01-28 05:00:08 -08006439/*[clinic end generated code: output=b9ed1d84d315f3b5 input=30b4dc9e976b890c]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006440{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006441 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006442
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006443 /* In case of multiple __init__() calls, clear previous content. */
6444 if (self->read != NULL)
6445 (void)Unpickler_clear(self);
6446
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006447 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006448 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006449
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006450 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006451 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006452
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006453 self->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006454 if (self->fix_imports == -1)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006455 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006456
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006457 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006458 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
6459 &PyId_persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006460 if (self->pers_func == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006461 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006462 }
6463 else {
6464 self->pers_func = NULL;
6465 }
6466
6467 self->stack = (Pdata *)Pdata_New();
6468 if (self->stack == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006469 return 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006470
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006471 self->memo_size = 32;
6472 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006473 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006474 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006475
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006476 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006477
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006478 return 0;
6479}
6480
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006481
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006482/* Define a proxy object for the Unpickler's internal memo object. This is to
6483 * avoid breaking code like:
6484 * unpickler.memo.clear()
6485 * and
6486 * unpickler.memo = saved_memo
6487 * Is this a good idea? Not really, but we don't want to break code that uses
6488 * it. Note that we don't implement the entire mapping API here. This is
6489 * intentional, as these should be treated as black-box implementation details.
6490 *
6491 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006492 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006493 */
6494
Larry Hastings61272b72014-01-07 12:41:53 -08006495/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006496_pickle.UnpicklerMemoProxy.clear
6497
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006498Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08006499[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006500
Larry Hastings3cceb382014-01-04 11:09:09 -08006501static PyObject *
6502_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006503/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006504{
6505 _Unpickler_MemoCleanup(self->unpickler);
6506 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6507 if (self->unpickler->memo == NULL)
6508 return NULL;
6509 Py_RETURN_NONE;
6510}
6511
Larry Hastings61272b72014-01-07 12:41:53 -08006512/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006513_pickle.UnpicklerMemoProxy.copy
6514
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006515Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08006516[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006517
Larry Hastings3cceb382014-01-04 11:09:09 -08006518static PyObject *
6519_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006520/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006521{
6522 Py_ssize_t i;
6523 PyObject *new_memo = PyDict_New();
6524 if (new_memo == NULL)
6525 return NULL;
6526
6527 for (i = 0; i < self->unpickler->memo_size; i++) {
6528 int status;
6529 PyObject *key, *value;
6530
6531 value = self->unpickler->memo[i];
6532 if (value == NULL)
6533 continue;
6534
6535 key = PyLong_FromSsize_t(i);
6536 if (key == NULL)
6537 goto error;
6538 status = PyDict_SetItem(new_memo, key, value);
6539 Py_DECREF(key);
6540 if (status < 0)
6541 goto error;
6542 }
6543 return new_memo;
6544
6545error:
6546 Py_DECREF(new_memo);
6547 return NULL;
6548}
6549
Larry Hastings61272b72014-01-07 12:41:53 -08006550/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006551_pickle.UnpicklerMemoProxy.__reduce__
6552
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006553Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08006554[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006555
Larry Hastings3cceb382014-01-04 11:09:09 -08006556static PyObject *
6557_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006558/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006559{
6560 PyObject *reduce_value;
6561 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08006562 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006563 if (contents == NULL)
6564 return NULL;
6565
6566 reduce_value = PyTuple_New(2);
6567 if (reduce_value == NULL) {
6568 Py_DECREF(contents);
6569 return NULL;
6570 }
6571 constructor_args = PyTuple_New(1);
6572 if (constructor_args == NULL) {
6573 Py_DECREF(contents);
6574 Py_DECREF(reduce_value);
6575 return NULL;
6576 }
6577 PyTuple_SET_ITEM(constructor_args, 0, contents);
6578 Py_INCREF((PyObject *)&PyDict_Type);
6579 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6580 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6581 return reduce_value;
6582}
6583
6584static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006585 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6586 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6587 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006588 {NULL, NULL} /* sentinel */
6589};
6590
6591static void
6592UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6593{
6594 PyObject_GC_UnTrack(self);
6595 Py_XDECREF(self->unpickler);
6596 PyObject_GC_Del((PyObject *)self);
6597}
6598
6599static int
6600UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6601 visitproc visit, void *arg)
6602{
6603 Py_VISIT(self->unpickler);
6604 return 0;
6605}
6606
6607static int
6608UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6609{
6610 Py_CLEAR(self->unpickler);
6611 return 0;
6612}
6613
6614static PyTypeObject UnpicklerMemoProxyType = {
6615 PyVarObject_HEAD_INIT(NULL, 0)
6616 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6617 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6618 0,
6619 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6620 0, /* tp_print */
6621 0, /* tp_getattr */
6622 0, /* tp_setattr */
6623 0, /* tp_compare */
6624 0, /* tp_repr */
6625 0, /* tp_as_number */
6626 0, /* tp_as_sequence */
6627 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006628 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006629 0, /* tp_call */
6630 0, /* tp_str */
6631 PyObject_GenericGetAttr, /* tp_getattro */
6632 PyObject_GenericSetAttr, /* tp_setattro */
6633 0, /* tp_as_buffer */
6634 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6635 0, /* tp_doc */
6636 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6637 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6638 0, /* tp_richcompare */
6639 0, /* tp_weaklistoffset */
6640 0, /* tp_iter */
6641 0, /* tp_iternext */
6642 unpicklerproxy_methods, /* tp_methods */
6643};
6644
6645static PyObject *
6646UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6647{
6648 UnpicklerMemoProxyObject *self;
6649
6650 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6651 &UnpicklerMemoProxyType);
6652 if (self == NULL)
6653 return NULL;
6654 Py_INCREF(unpickler);
6655 self->unpickler = unpickler;
6656 PyObject_GC_Track(self);
6657 return (PyObject *)self;
6658}
6659
6660/*****************************************************************************/
6661
6662
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006663static PyObject *
6664Unpickler_get_memo(UnpicklerObject *self)
6665{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006666 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006667}
6668
6669static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006670Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006671{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006672 PyObject **new_memo;
6673 Py_ssize_t new_memo_size = 0;
6674 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006675
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006676 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006677 PyErr_SetString(PyExc_TypeError,
6678 "attribute deletion is not supported");
6679 return -1;
6680 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006681
6682 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6683 UnpicklerObject *unpickler =
6684 ((UnpicklerMemoProxyObject *)obj)->unpickler;
6685
6686 new_memo_size = unpickler->memo_size;
6687 new_memo = _Unpickler_NewMemo(new_memo_size);
6688 if (new_memo == NULL)
6689 return -1;
6690
6691 for (i = 0; i < new_memo_size; i++) {
6692 Py_XINCREF(unpickler->memo[i]);
6693 new_memo[i] = unpickler->memo[i];
6694 }
6695 }
6696 else if (PyDict_Check(obj)) {
6697 Py_ssize_t i = 0;
6698 PyObject *key, *value;
6699
6700 new_memo_size = PyDict_Size(obj);
6701 new_memo = _Unpickler_NewMemo(new_memo_size);
6702 if (new_memo == NULL)
6703 return -1;
6704
6705 while (PyDict_Next(obj, &i, &key, &value)) {
6706 Py_ssize_t idx;
6707 if (!PyLong_Check(key)) {
6708 PyErr_SetString(PyExc_TypeError,
6709 "memo key must be integers");
6710 goto error;
6711 }
6712 idx = PyLong_AsSsize_t(key);
6713 if (idx == -1 && PyErr_Occurred())
6714 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02006715 if (idx < 0) {
6716 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02006717 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02006718 goto error;
6719 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006720 if (_Unpickler_MemoPut(self, idx, value) < 0)
6721 goto error;
6722 }
6723 }
6724 else {
6725 PyErr_Format(PyExc_TypeError,
6726 "'memo' attribute must be an UnpicklerMemoProxy object"
6727 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006728 return -1;
6729 }
6730
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006731 _Unpickler_MemoCleanup(self);
6732 self->memo_size = new_memo_size;
6733 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006734
6735 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006736
6737 error:
6738 if (new_memo_size) {
6739 i = new_memo_size;
6740 while (--i >= 0) {
6741 Py_XDECREF(new_memo[i]);
6742 }
6743 PyMem_FREE(new_memo);
6744 }
6745 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006746}
6747
6748static PyObject *
6749Unpickler_get_persload(UnpicklerObject *self)
6750{
6751 if (self->pers_func == NULL)
6752 PyErr_SetString(PyExc_AttributeError, "persistent_load");
6753 else
6754 Py_INCREF(self->pers_func);
6755 return self->pers_func;
6756}
6757
6758static int
6759Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
6760{
6761 PyObject *tmp;
6762
6763 if (value == NULL) {
6764 PyErr_SetString(PyExc_TypeError,
6765 "attribute deletion is not supported");
6766 return -1;
6767 }
6768 if (!PyCallable_Check(value)) {
6769 PyErr_SetString(PyExc_TypeError,
6770 "persistent_load must be a callable taking "
6771 "one argument");
6772 return -1;
6773 }
6774
6775 tmp = self->pers_func;
6776 Py_INCREF(value);
6777 self->pers_func = value;
6778 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
6779
6780 return 0;
6781}
6782
6783static PyGetSetDef Unpickler_getsets[] = {
6784 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
6785 {"persistent_load", (getter)Unpickler_get_persload,
6786 (setter)Unpickler_set_persload},
6787 {NULL}
6788};
6789
6790static PyTypeObject Unpickler_Type = {
6791 PyVarObject_HEAD_INIT(NULL, 0)
6792 "_pickle.Unpickler", /*tp_name*/
6793 sizeof(UnpicklerObject), /*tp_basicsize*/
6794 0, /*tp_itemsize*/
6795 (destructor)Unpickler_dealloc, /*tp_dealloc*/
6796 0, /*tp_print*/
6797 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006798 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00006799 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006800 0, /*tp_repr*/
6801 0, /*tp_as_number*/
6802 0, /*tp_as_sequence*/
6803 0, /*tp_as_mapping*/
6804 0, /*tp_hash*/
6805 0, /*tp_call*/
6806 0, /*tp_str*/
6807 0, /*tp_getattro*/
6808 0, /*tp_setattro*/
6809 0, /*tp_as_buffer*/
6810 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006811 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006812 (traverseproc)Unpickler_traverse, /*tp_traverse*/
6813 (inquiry)Unpickler_clear, /*tp_clear*/
6814 0, /*tp_richcompare*/
6815 0, /*tp_weaklistoffset*/
6816 0, /*tp_iter*/
6817 0, /*tp_iternext*/
6818 Unpickler_methods, /*tp_methods*/
6819 0, /*tp_members*/
6820 Unpickler_getsets, /*tp_getset*/
6821 0, /*tp_base*/
6822 0, /*tp_dict*/
6823 0, /*tp_descr_get*/
6824 0, /*tp_descr_set*/
6825 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08006826 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006827 PyType_GenericAlloc, /*tp_alloc*/
6828 PyType_GenericNew, /*tp_new*/
6829 PyObject_GC_Del, /*tp_free*/
6830 0, /*tp_is_gc*/
6831};
6832
Larry Hastings61272b72014-01-07 12:41:53 -08006833/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006834
6835_pickle.dump
6836
6837 obj: object
6838 file: object
6839 protocol: object = NULL
6840 *
6841 fix_imports: bool = True
6842
6843Write a pickled representation of obj to the open file object file.
6844
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006845This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
6846be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006847
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006848The optional *protocol* argument tells the pickler to use the given
6849protocol supported protocols are 0, 1, 2, 3 and 4. The default
6850protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006851
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006852Specifying a negative protocol version selects the highest protocol
6853version supported. The higher the protocol used, the more recent the
6854version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006855
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006856The *file* argument must have a write() method that accepts a single
6857bytes argument. It can thus be a file object opened for binary
6858writing, a io.BytesIO instance, or any other custom object that meets
6859this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006860
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006861If *fix_imports* is True and protocol is less than 3, pickle will try
6862to map the new Python 3 names to the old module names used in Python
68632, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006864[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006865
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006866static PyObject *
6867_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports)
Larry Hastings581ee362014-01-28 05:00:08 -08006868/*[clinic end generated code: output=a606e626d553850d input=e9e5fdd48de92eae]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006869{
6870 PicklerObject *pickler = _Pickler_New();
6871
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006872 if (pickler == NULL)
6873 return NULL;
6874
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006875 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006876 goto error;
6877
6878 if (_Pickler_SetOutputStream(pickler, file) < 0)
6879 goto error;
6880
6881 if (dump(pickler, obj) < 0)
6882 goto error;
6883
6884 if (_Pickler_FlushToFile(pickler) < 0)
6885 goto error;
6886
6887 Py_DECREF(pickler);
6888 Py_RETURN_NONE;
6889
6890 error:
6891 Py_XDECREF(pickler);
6892 return NULL;
6893}
6894
Larry Hastings61272b72014-01-07 12:41:53 -08006895/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006896
6897_pickle.dumps
6898
6899 obj: object
6900 protocol: object = NULL
6901 *
6902 fix_imports: bool = True
6903
6904Return the pickled representation of the object as a bytes object.
6905
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006906The optional *protocol* argument tells the pickler to use the given
6907protocol; supported protocols are 0, 1, 2, 3 and 4. The default
6908protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006909
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006910Specifying a negative protocol version selects the highest protocol
6911version supported. The higher the protocol used, the more recent the
6912version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006913
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006914If *fix_imports* is True and *protocol* is less than 3, pickle will
6915try to map the new Python 3 names to the old module names used in
6916Python 2, so that the pickle data stream is readable with Python 2.
Larry Hastings61272b72014-01-07 12:41:53 -08006917[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006918
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006919static PyObject *
6920_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol, int fix_imports)
Larry Hastings581ee362014-01-28 05:00:08 -08006921/*[clinic end generated code: output=777f0deefe5b88ee input=293dbeda181580b7]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006922{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006923 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006924 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006925
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006926 if (pickler == NULL)
6927 return NULL;
6928
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006929 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006930 goto error;
6931
6932 if (dump(pickler, obj) < 0)
6933 goto error;
6934
6935 result = _Pickler_GetString(pickler);
6936 Py_DECREF(pickler);
6937 return result;
6938
6939 error:
6940 Py_XDECREF(pickler);
6941 return NULL;
6942}
6943
Larry Hastings61272b72014-01-07 12:41:53 -08006944/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006945
6946_pickle.load
6947
6948 file: object
6949 *
6950 fix_imports: bool = True
6951 encoding: str = 'ASCII'
6952 errors: str = 'strict'
6953
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006954Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006955
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006956This is equivalent to ``Unpickler(file).load()``, but may be more
6957efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006958
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006959The protocol version of the pickle is detected automatically, so no
6960protocol argument is needed. Bytes past the pickled object's
6961representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006962
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006963The argument *file* must have two methods, a read() method that takes
6964an integer argument, and a readline() method that requires no
6965arguments. Both methods should return bytes. Thus *file* can be a
6966binary file object opened for reading, a io.BytesIO object, or any
6967other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006968
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006969Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6970which are used to control compatiblity support for pickle stream
6971generated by Python 2. If *fix_imports* is True, pickle will try to
6972map the old Python 2 names to the new names used in Python 3. The
6973*encoding* and *errors* tell pickle how to decode 8-bit string
6974instances pickled by Python 2; these default to 'ASCII' and 'strict',
6975respectively. The *encoding* can be 'bytes' to read these 8-bit
6976string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08006977[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006978
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006979static PyObject *
6980_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports, const char *encoding, const char *errors)
Larry Hastings581ee362014-01-28 05:00:08 -08006981/*[clinic end generated code: output=568c61356c172654 input=da97372e38e510a6]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006982{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006983 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006984 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006985
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006986 if (unpickler == NULL)
6987 return NULL;
6988
6989 if (_Unpickler_SetInputStream(unpickler, file) < 0)
6990 goto error;
6991
6992 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
6993 goto error;
6994
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006995 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006996
6997 result = load(unpickler);
6998 Py_DECREF(unpickler);
6999 return result;
7000
7001 error:
7002 Py_XDECREF(unpickler);
7003 return NULL;
7004}
7005
Larry Hastings61272b72014-01-07 12:41:53 -08007006/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007007
7008_pickle.loads
7009
7010 data: object
7011 *
7012 fix_imports: bool = True
7013 encoding: str = 'ASCII'
7014 errors: str = 'strict'
7015
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007016Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007017
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007018The protocol version of the pickle is detected automatically, so no
7019protocol argument is needed. Bytes past the pickled object's
7020representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007021
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007022Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
7023which are used to control compatiblity support for pickle stream
7024generated by Python 2. If *fix_imports* is True, pickle will try to
7025map the old Python 2 names to the new names used in Python 3. The
7026*encoding* and *errors* tell pickle how to decode 8-bit string
7027instances pickled by Python 2; these default to 'ASCII' and 'strict',
7028respectively. The *encoding* can be 'bytes' to read these 8-bit
7029string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007030[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007031
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007032static PyObject *
7033_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports, const char *encoding, const char *errors)
Larry Hastings581ee362014-01-28 05:00:08 -08007034/*[clinic end generated code: output=0b3845ad110b2522 input=f57f0fdaa2b4cb8b]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007035{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007036 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007037 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007038
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007039 if (unpickler == NULL)
7040 return NULL;
7041
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007042 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007043 goto error;
7044
7045 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7046 goto error;
7047
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007048 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007049
7050 result = load(unpickler);
7051 Py_DECREF(unpickler);
7052 return result;
7053
7054 error:
7055 Py_XDECREF(unpickler);
7056 return NULL;
7057}
7058
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007059static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007060 _PICKLE_DUMP_METHODDEF
7061 _PICKLE_DUMPS_METHODDEF
7062 _PICKLE_LOAD_METHODDEF
7063 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007064 {NULL, NULL} /* sentinel */
7065};
7066
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007067static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007068pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007069{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007070 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007071 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007072}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007073
Stefan Krahf483b0f2013-12-14 13:43:10 +01007074static void
7075pickle_free(PyObject *m)
7076{
7077 _Pickle_ClearState(_Pickle_GetState(m));
7078}
7079
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007080static int
7081pickle_traverse(PyObject *m, visitproc visit, void *arg)
7082{
7083 PickleState *st = _Pickle_GetState(m);
7084 Py_VISIT(st->PickleError);
7085 Py_VISIT(st->PicklingError);
7086 Py_VISIT(st->UnpicklingError);
7087 Py_VISIT(st->dispatch_table);
7088 Py_VISIT(st->extension_registry);
7089 Py_VISIT(st->extension_cache);
7090 Py_VISIT(st->inverted_registry);
7091 Py_VISIT(st->name_mapping_2to3);
7092 Py_VISIT(st->import_mapping_2to3);
7093 Py_VISIT(st->name_mapping_3to2);
7094 Py_VISIT(st->import_mapping_3to2);
7095 Py_VISIT(st->codecs_encode);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007096 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007097}
7098
7099static struct PyModuleDef _picklemodule = {
7100 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007101 "_pickle", /* m_name */
7102 pickle_module_doc, /* m_doc */
7103 sizeof(PickleState), /* m_size */
7104 pickle_methods, /* m_methods */
7105 NULL, /* m_reload */
7106 pickle_traverse, /* m_traverse */
7107 pickle_clear, /* m_clear */
7108 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007109};
7110
7111PyMODINIT_FUNC
7112PyInit__pickle(void)
7113{
7114 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007115 PickleState *st;
7116
7117 m = PyState_FindModule(&_picklemodule);
7118 if (m) {
7119 Py_INCREF(m);
7120 return m;
7121 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007122
7123 if (PyType_Ready(&Unpickler_Type) < 0)
7124 return NULL;
7125 if (PyType_Ready(&Pickler_Type) < 0)
7126 return NULL;
7127 if (PyType_Ready(&Pdata_Type) < 0)
7128 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007129 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7130 return NULL;
7131 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7132 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007133
7134 /* Create the module and add the functions. */
7135 m = PyModule_Create(&_picklemodule);
7136 if (m == NULL)
7137 return NULL;
7138
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007139 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007140 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7141 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007142 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007143 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7144 return NULL;
7145
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007146 st = _Pickle_GetState(m);
7147
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007148 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007149 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7150 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007151 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007152 st->PicklingError = \
7153 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7154 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007155 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007156 st->UnpicklingError = \
7157 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7158 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007159 return NULL;
7160
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007161 Py_INCREF(st->PickleError);
7162 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007163 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007164 Py_INCREF(st->PicklingError);
7165 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007166 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007167 Py_INCREF(st->UnpicklingError);
7168 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007169 return NULL;
7170
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007171 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007172 return NULL;
7173
7174 return m;
7175}