blob: d61c8abb2ff0d6e3c07d329a1f0ec7ad2a381643 [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
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007/*[clinic]
8module _pickle
9class _pickle.Pickler
10class _pickle.PicklerMemoProxy
11class _pickle.Unpickler
12class _pickle.UnpicklerMemoProxy
13[clinic]*/
14/*[clinic checksum: da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
15
16/*[python]
17class PicklerObject_converter(self_converter):
18 type = "PicklerObject *"
19
20class PicklerMemoProxyObject_converter(self_converter):
21 type = "PicklerMemoProxyObject *"
22
23class UnpicklerObject_converter(self_converter):
24 type = "UnpicklerObject *"
25
26class UnpicklerMemoProxyObject_converter(self_converter):
27 type = "UnpicklerMemoProxyObject *"
28[python]*/
29/*[python checksum: da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
30
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000031/* Bump this when new opcodes are added to the pickle protocol. */
32enum {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010033 HIGHEST_PROTOCOL = 4,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000034 DEFAULT_PROTOCOL = 3
35};
36
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000037/* Pickle opcodes. These must be kept updated with pickle.py.
38 Extensive docs are in pickletools.py. */
39enum opcode {
40 MARK = '(',
41 STOP = '.',
42 POP = '0',
43 POP_MARK = '1',
44 DUP = '2',
45 FLOAT = 'F',
46 INT = 'I',
47 BININT = 'J',
48 BININT1 = 'K',
49 LONG = 'L',
50 BININT2 = 'M',
51 NONE = 'N',
52 PERSID = 'P',
53 BINPERSID = 'Q',
54 REDUCE = 'R',
55 STRING = 'S',
56 BINSTRING = 'T',
57 SHORT_BINSTRING = 'U',
58 UNICODE = 'V',
59 BINUNICODE = 'X',
60 APPEND = 'a',
61 BUILD = 'b',
62 GLOBAL = 'c',
63 DICT = 'd',
64 EMPTY_DICT = '}',
65 APPENDS = 'e',
66 GET = 'g',
67 BINGET = 'h',
68 INST = 'i',
69 LONG_BINGET = 'j',
70 LIST = 'l',
71 EMPTY_LIST = ']',
72 OBJ = 'o',
73 PUT = 'p',
74 BINPUT = 'q',
75 LONG_BINPUT = 'r',
76 SETITEM = 's',
77 TUPLE = 't',
78 EMPTY_TUPLE = ')',
79 SETITEMS = 'u',
80 BINFLOAT = 'G',
81
82 /* Protocol 2. */
83 PROTO = '\x80',
84 NEWOBJ = '\x81',
85 EXT1 = '\x82',
86 EXT2 = '\x83',
87 EXT4 = '\x84',
88 TUPLE1 = '\x85',
89 TUPLE2 = '\x86',
90 TUPLE3 = '\x87',
91 NEWTRUE = '\x88',
92 NEWFALSE = '\x89',
93 LONG1 = '\x8a',
94 LONG4 = '\x8b',
95
96 /* Protocol 3 (Python 3.x) */
97 BINBYTES = 'B',
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010098 SHORT_BINBYTES = 'C',
99
100 /* Protocol 4 */
101 SHORT_BINUNICODE = '\x8c',
102 BINUNICODE8 = '\x8d',
103 BINBYTES8 = '\x8e',
104 EMPTY_SET = '\x8f',
105 ADDITEMS = '\x90',
106 FROZENSET = '\x91',
107 NEWOBJ_EX = '\x92',
108 STACK_GLOBAL = '\x93',
109 MEMOIZE = '\x94',
110 FRAME = '\x95'
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000111};
112
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000113enum {
114 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
115 batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
116 break if this gets out of synch with pickle.py, but it's unclear that would
117 help anything either. */
118 BATCHSIZE = 1000,
119
120 /* Nesting limit until Pickler, when running in "fast mode", starts
121 checking for self-referential data-structures. */
122 FAST_NESTING_LIMIT = 50,
123
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000124 /* Initial size of the write buffer of Pickler. */
125 WRITE_BUF_SIZE = 4096,
126
Antoine Pitrou04248a82010-10-12 20:51:21 +0000127 /* Prefetch size when unpickling (disabled on unpeekable streams) */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100128 PREFETCH = 8192 * 16,
129
130 FRAME_SIZE_TARGET = 64 * 1024,
131
132 FRAME_HEADER_SIZE = 9
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000133};
134
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800135/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000136
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800137/* State of the pickle module, per PEP 3121. */
138typedef struct {
139 /* Exception classes for pickle. */
140 PyObject *PickleError;
141 PyObject *PicklingError;
142 PyObject *UnpicklingError;
143
144 /* copyreg.dispatch_table, {type_object: pickling_function} */
145 PyObject *dispatch_table;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000146
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800147 /* For the extension opcodes EXT1, EXT2 and EXT4. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000148
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800149 /* copyreg._extension_registry, {(module_name, function_name): code} */
150 PyObject *extension_registry;
151 /* copyreg._extension_cache, {code: object} */
152 PyObject *extension_cache;
153 /* copyreg._inverted_registry, {code: (module_name, function_name)} */
154 PyObject *inverted_registry;
155
156 /* Import mappings for compatibility with Python 2.x */
157
158 /* _compat_pickle.NAME_MAPPING,
159 {(oldmodule, oldname): (newmodule, newname)} */
160 PyObject *name_mapping_2to3;
161 /* _compat_pickle.IMPORT_MAPPING, {oldmodule: newmodule} */
162 PyObject *import_mapping_2to3;
163 /* Same, but with REVERSE_NAME_MAPPING / REVERSE_IMPORT_MAPPING */
164 PyObject *name_mapping_3to2;
165 PyObject *import_mapping_3to2;
166
167 /* codecs.encode, used for saving bytes in older protocols */
168 PyObject *codecs_encode;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800169} PickleState;
170
171/* Forward declaration of the _pickle module definition. */
172static struct PyModuleDef _picklemodule;
173
174/* Given a module object, get its per-module state. */
175static PickleState *
176_Pickle_GetState(PyObject *module)
177{
178 return (PickleState *)PyModule_GetState(module);
179}
180
181/* Find the module instance imported in the currently running sub-interpreter
182 and get its state. */
183static PickleState *
184_Pickle_GetGlobalState(void)
185{
186 return _Pickle_GetState(PyState_FindModule(&_picklemodule));
187}
188
189/* Clear the given pickle module state. */
190static void
191_Pickle_ClearState(PickleState *st)
192{
193 Py_CLEAR(st->PickleError);
194 Py_CLEAR(st->PicklingError);
195 Py_CLEAR(st->UnpicklingError);
196 Py_CLEAR(st->dispatch_table);
197 Py_CLEAR(st->extension_registry);
198 Py_CLEAR(st->extension_cache);
199 Py_CLEAR(st->inverted_registry);
200 Py_CLEAR(st->name_mapping_2to3);
201 Py_CLEAR(st->import_mapping_2to3);
202 Py_CLEAR(st->name_mapping_3to2);
203 Py_CLEAR(st->import_mapping_3to2);
204 Py_CLEAR(st->codecs_encode);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800205}
206
207/* Initialize the given pickle module state. */
208static int
209_Pickle_InitState(PickleState *st)
210{
211 PyObject *copyreg = NULL;
212 PyObject *compat_pickle = NULL;
213 PyObject *codecs = NULL;
214
215 copyreg = PyImport_ImportModule("copyreg");
216 if (!copyreg)
217 goto error;
218 st->dispatch_table = PyObject_GetAttrString(copyreg, "dispatch_table");
219 if (!st->dispatch_table)
220 goto error;
221 if (!PyDict_CheckExact(st->dispatch_table)) {
222 PyErr_Format(PyExc_RuntimeError,
223 "copyreg.dispatch_table should be a dict, not %.200s",
224 Py_TYPE(st->dispatch_table)->tp_name);
225 goto error;
226 }
227 st->extension_registry = \
228 PyObject_GetAttrString(copyreg, "_extension_registry");
229 if (!st->extension_registry)
230 goto error;
231 if (!PyDict_CheckExact(st->extension_registry)) {
232 PyErr_Format(PyExc_RuntimeError,
233 "copyreg._extension_registry should be a dict, "
234 "not %.200s", Py_TYPE(st->extension_registry)->tp_name);
235 goto error;
236 }
237 st->inverted_registry = \
238 PyObject_GetAttrString(copyreg, "_inverted_registry");
239 if (!st->inverted_registry)
240 goto error;
241 if (!PyDict_CheckExact(st->inverted_registry)) {
242 PyErr_Format(PyExc_RuntimeError,
243 "copyreg._inverted_registry should be a dict, "
244 "not %.200s", Py_TYPE(st->inverted_registry)->tp_name);
245 goto error;
246 }
247 st->extension_cache = PyObject_GetAttrString(copyreg, "_extension_cache");
248 if (!st->extension_cache)
249 goto error;
250 if (!PyDict_CheckExact(st->extension_cache)) {
251 PyErr_Format(PyExc_RuntimeError,
252 "copyreg._extension_cache should be a dict, "
253 "not %.200s", Py_TYPE(st->extension_cache)->tp_name);
254 goto error;
255 }
256 Py_CLEAR(copyreg);
257
258 /* Load the 2.x -> 3.x stdlib module mapping tables */
259 compat_pickle = PyImport_ImportModule("_compat_pickle");
260 if (!compat_pickle)
261 goto error;
262 st->name_mapping_2to3 = \
263 PyObject_GetAttrString(compat_pickle, "NAME_MAPPING");
264 if (!st->name_mapping_2to3)
265 goto error;
266 if (!PyDict_CheckExact(st->name_mapping_2to3)) {
267 PyErr_Format(PyExc_RuntimeError,
268 "_compat_pickle.NAME_MAPPING should be a dict, not %.200s",
269 Py_TYPE(st->name_mapping_2to3)->tp_name);
270 goto error;
271 }
272 st->import_mapping_2to3 = \
273 PyObject_GetAttrString(compat_pickle, "IMPORT_MAPPING");
274 if (!st->import_mapping_2to3)
275 goto error;
276 if (!PyDict_CheckExact(st->import_mapping_2to3)) {
277 PyErr_Format(PyExc_RuntimeError,
278 "_compat_pickle.IMPORT_MAPPING should be a dict, "
279 "not %.200s", Py_TYPE(st->import_mapping_2to3)->tp_name);
280 goto error;
281 }
282 /* ... and the 3.x -> 2.x mapping tables */
283 st->name_mapping_3to2 = \
284 PyObject_GetAttrString(compat_pickle, "REVERSE_NAME_MAPPING");
285 if (!st->name_mapping_3to2)
286 goto error;
287 if (!PyDict_CheckExact(st->name_mapping_3to2)) {
288 PyErr_Format(PyExc_RuntimeError,
289 "_compat_pickle.REVERSE_NAME_MAPPING should be a dict, "
290 "not %.200s", Py_TYPE(st->name_mapping_3to2)->tp_name);
291 goto error;
292 }
293 st->import_mapping_3to2 = \
294 PyObject_GetAttrString(compat_pickle, "REVERSE_IMPORT_MAPPING");
295 if (!st->import_mapping_3to2)
296 goto error;
297 if (!PyDict_CheckExact(st->import_mapping_3to2)) {
298 PyErr_Format(PyExc_RuntimeError,
299 "_compat_pickle.REVERSE_IMPORT_MAPPING should be a dict, "
300 "not %.200s", Py_TYPE(st->import_mapping_3to2)->tp_name);
301 goto error;
302 }
303 Py_CLEAR(compat_pickle);
304
305 codecs = PyImport_ImportModule("codecs");
306 if (codecs == NULL)
307 goto error;
308 st->codecs_encode = PyObject_GetAttrString(codecs, "encode");
309 if (st->codecs_encode == NULL) {
310 goto error;
311 }
312 if (!PyCallable_Check(st->codecs_encode)) {
313 PyErr_Format(PyExc_RuntimeError,
314 "codecs.encode should be a callable, not %.200s",
315 Py_TYPE(st->codecs_encode)->tp_name);
316 goto error;
317 }
318 Py_CLEAR(codecs);
319
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800320 return 0;
321
322 error:
323 Py_CLEAR(copyreg);
324 Py_CLEAR(compat_pickle);
325 Py_CLEAR(codecs);
326 _Pickle_ClearState(st);
327 return -1;
328}
329
330/* Helper for calling a function with a single argument quickly.
331
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800332 This function steals the reference of the given argument. */
333static PyObject *
334_Pickle_FastCall(PyObject *func, PyObject *obj)
335{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800336 PyObject *result;
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800337 PyObject *arg_tuple = PyTuple_New(1);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800338
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800339 /* Note: this function used to reuse the argument tuple. This used to give
340 a slight performance boost with older pickle implementations where many
341 unbuffered reads occurred (thus needing many function calls).
342
343 However, this optimization was removed because it was too complicated
344 to get right. It abused the C API for tuples to mutate them which led
345 to subtle reference counting and concurrency bugs. Furthermore, the
346 introduction of protocol 4 and the prefetching optimization via peek()
347 significantly reduced the number of function calls we do. Thus, the
348 benefits became marginal at best. */
349
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800350 if (arg_tuple == NULL) {
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800351 Py_DECREF(obj);
352 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800353 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800354 PyTuple_SET_ITEM(arg_tuple, 0, obj);
355 result = PyObject_Call(func, arg_tuple, NULL);
Alexandre Vassalottib13e6bc2013-11-28 14:56:09 -0800356 Py_CLEAR(arg_tuple);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800357 return result;
358}
359
360/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000361
362static int
363stack_underflow(void)
364{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800365 PickleState *st = _Pickle_GetGlobalState();
366 PyErr_SetString(st->UnpicklingError, "unpickling stack underflow");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000367 return -1;
368}
369
370/* Internal data type used as the unpickling stack. */
371typedef struct {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000372 PyObject_VAR_HEAD
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000373 PyObject **data;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000374 Py_ssize_t allocated; /* number of slots in data allocated */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000375} Pdata;
376
377static void
378Pdata_dealloc(Pdata *self)
379{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200380 Py_ssize_t i = Py_SIZE(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000381 while (--i >= 0) {
382 Py_DECREF(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000383 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000384 PyMem_FREE(self->data);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000385 PyObject_Del(self);
386}
387
388static PyTypeObject Pdata_Type = {
389 PyVarObject_HEAD_INIT(NULL, 0)
390 "_pickle.Pdata", /*tp_name*/
391 sizeof(Pdata), /*tp_basicsize*/
392 0, /*tp_itemsize*/
393 (destructor)Pdata_dealloc, /*tp_dealloc*/
394};
395
396static PyObject *
397Pdata_New(void)
398{
399 Pdata *self;
400
401 if (!(self = PyObject_New(Pdata, &Pdata_Type)))
402 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000403 Py_SIZE(self) = 0;
404 self->allocated = 8;
405 self->data = PyMem_MALLOC(self->allocated * sizeof(PyObject *));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000406 if (self->data)
407 return (PyObject *)self;
408 Py_DECREF(self);
409 return PyErr_NoMemory();
410}
411
412
413/* Retain only the initial clearto items. If clearto >= the current
414 * number of items, this is a (non-erroneous) NOP.
415 */
416static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200417Pdata_clear(Pdata *self, Py_ssize_t clearto)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000418{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200419 Py_ssize_t i = Py_SIZE(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000420
421 if (clearto < 0)
422 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000423 if (clearto >= i)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000424 return 0;
425
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000426 while (--i >= clearto) {
427 Py_CLEAR(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000428 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000429 Py_SIZE(self) = clearto;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000430 return 0;
431}
432
433static int
434Pdata_grow(Pdata *self)
435{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000436 PyObject **data = self->data;
437 Py_ssize_t allocated = self->allocated;
438 Py_ssize_t new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000439
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000440 new_allocated = (allocated >> 3) + 6;
441 /* check for integer overflow */
442 if (new_allocated > PY_SSIZE_T_MAX - allocated)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000443 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000444 new_allocated += allocated;
445 if (new_allocated > (PY_SSIZE_T_MAX / sizeof(PyObject *)))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000446 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000447 data = PyMem_REALLOC(data, new_allocated * sizeof(PyObject *));
448 if (data == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000449 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000450
451 self->data = data;
452 self->allocated = new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000453 return 0;
454
455 nomemory:
456 PyErr_NoMemory();
457 return -1;
458}
459
460/* D is a Pdata*. Pop the topmost element and store it into V, which
461 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
462 * is raised and V is set to NULL.
463 */
464static PyObject *
465Pdata_pop(Pdata *self)
466{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800467 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000468 if (Py_SIZE(self) == 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800469 PyErr_SetString(st->UnpicklingError, "bad pickle data");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000470 return NULL;
471 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000472 return self->data[--Py_SIZE(self)];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000473}
474#define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0)
475
476static int
477Pdata_push(Pdata *self, PyObject *obj)
478{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000479 if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000480 return -1;
481 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000482 self->data[Py_SIZE(self)++] = obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000483 return 0;
484}
485
486/* Push an object on stack, transferring its ownership to the stack. */
487#define PDATA_PUSH(D, O, ER) do { \
488 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
489
490/* Push an object on stack, adding a new reference to the object. */
491#define PDATA_APPEND(D, O, ER) do { \
492 Py_INCREF((O)); \
493 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
494
495static PyObject *
496Pdata_poptuple(Pdata *self, Py_ssize_t start)
497{
498 PyObject *tuple;
499 Py_ssize_t len, i, j;
500
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000501 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000502 tuple = PyTuple_New(len);
503 if (tuple == NULL)
504 return NULL;
505 for (i = start, j = 0; j < len; i++, j++)
506 PyTuple_SET_ITEM(tuple, j, self->data[i]);
507
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000508 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000509 return tuple;
510}
511
512static PyObject *
513Pdata_poplist(Pdata *self, Py_ssize_t start)
514{
515 PyObject *list;
516 Py_ssize_t len, i, j;
517
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000518 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000519 list = PyList_New(len);
520 if (list == NULL)
521 return NULL;
522 for (i = start, j = 0; j < len; i++, j++)
523 PyList_SET_ITEM(list, j, self->data[i]);
524
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000525 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000526 return list;
527}
528
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000529typedef struct {
530 PyObject *me_key;
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200531 Py_ssize_t me_value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000532} PyMemoEntry;
533
534typedef struct {
535 Py_ssize_t mt_mask;
536 Py_ssize_t mt_used;
537 Py_ssize_t mt_allocated;
538 PyMemoEntry *mt_table;
539} PyMemoTable;
540
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000541typedef struct PicklerObject {
542 PyObject_HEAD
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000543 PyMemoTable *memo; /* Memo table, keep track of the seen
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000544 objects to support self-referential objects
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000545 pickling. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000546 PyObject *pers_func; /* persistent_id() method, can be NULL */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100547 PyObject *dispatch_table; /* private dispatch_table, can be NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000548
549 PyObject *write; /* write() method of the output stream. */
550 PyObject *output_buffer; /* Write into a local bytearray buffer before
551 flushing to the stream. */
552 Py_ssize_t output_len; /* Length of output_buffer. */
553 Py_ssize_t max_output_len; /* Allocation size of output_buffer. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000554 int proto; /* Pickle protocol number, >= 0 */
555 int bin; /* Boolean, true if proto > 0 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100556 int framing; /* True when framing is enabled, proto >= 4 */
557 Py_ssize_t frame_start; /* Position in output_buffer where the
558 where the current frame begins. -1 if there
559 is no frame currently open. */
560
561 Py_ssize_t buf_size; /* Size of the current buffered pickle data */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000562 int fast; /* Enable fast mode if set to a true value.
563 The fast mode disable the usage of memo,
564 therefore speeding the pickling process by
565 not generating superfluous PUT opcodes. It
566 should not be used if with self-referential
567 objects. */
568 int fast_nesting;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000569 int fix_imports; /* Indicate whether Pickler should fix
570 the name of globals for Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000571 PyObject *fast_memo;
572} PicklerObject;
573
574typedef struct UnpicklerObject {
575 PyObject_HEAD
576 Pdata *stack; /* Pickle data stack, store unpickled objects. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000577
578 /* The unpickler memo is just an array of PyObject *s. Using a dict
579 is unnecessary, since the keys are contiguous ints. */
580 PyObject **memo;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100581 Py_ssize_t memo_size; /* Capacity of the memo array */
582 Py_ssize_t memo_len; /* Number of objects in the memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000583
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000584 PyObject *pers_func; /* persistent_load() method, can be NULL. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000585
586 Py_buffer buffer;
587 char *input_buffer;
588 char *input_line;
589 Py_ssize_t input_len;
590 Py_ssize_t next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +0000591 Py_ssize_t prefetched_idx; /* index of first prefetched byte */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100592
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000593 PyObject *read; /* read() method of the input stream. */
594 PyObject *readline; /* readline() method of the input stream. */
Antoine Pitrou04248a82010-10-12 20:51:21 +0000595 PyObject *peek; /* peek() method of the input stream, or NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000596
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000597 char *encoding; /* Name of the encoding to be used for
598 decoding strings pickled using Python
599 2.x. The default value is "ASCII" */
600 char *errors; /* Name of errors handling scheme to used when
601 decoding strings. The default value is
602 "strict". */
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500603 Py_ssize_t *marks; /* Mark stack, used for unpickling container
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000604 objects. */
605 Py_ssize_t num_marks; /* Number of marks in the mark stack. */
606 Py_ssize_t marks_size; /* Current allocated size of the mark stack. */
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000607 int proto; /* Protocol of the pickle loaded. */
608 int fix_imports; /* Indicate whether Unpickler should fix
609 the name of globals pickled by Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000610} UnpicklerObject;
611
612/* Forward declarations */
613static int save(PicklerObject *, PyObject *, int);
614static int save_reduce(PicklerObject *, PyObject *, PyObject *);
615static PyTypeObject Pickler_Type;
616static PyTypeObject Unpickler_Type;
617
618
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000619/*************************************************************************
Serhiy Storchaka95949422013-08-27 19:40:23 +0300620 A custom hashtable mapping void* to Python ints. This is used by the pickler
621 for memoization. Using a custom hashtable rather than PyDict allows us to skip
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000622 a bunch of unnecessary object creation. This makes a huge performance
623 difference. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000624
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000625#define MT_MINSIZE 8
626#define PERTURB_SHIFT 5
627
628
629static PyMemoTable *
630PyMemoTable_New(void)
631{
632 PyMemoTable *memo = PyMem_MALLOC(sizeof(PyMemoTable));
633 if (memo == NULL) {
634 PyErr_NoMemory();
635 return NULL;
636 }
637
638 memo->mt_used = 0;
639 memo->mt_allocated = MT_MINSIZE;
640 memo->mt_mask = MT_MINSIZE - 1;
641 memo->mt_table = PyMem_MALLOC(MT_MINSIZE * sizeof(PyMemoEntry));
642 if (memo->mt_table == NULL) {
643 PyMem_FREE(memo);
644 PyErr_NoMemory();
645 return NULL;
646 }
647 memset(memo->mt_table, 0, MT_MINSIZE * sizeof(PyMemoEntry));
648
649 return memo;
650}
651
652static PyMemoTable *
653PyMemoTable_Copy(PyMemoTable *self)
654{
655 Py_ssize_t i;
656 PyMemoTable *new = PyMemoTable_New();
657 if (new == NULL)
658 return NULL;
659
660 new->mt_used = self->mt_used;
661 new->mt_allocated = self->mt_allocated;
662 new->mt_mask = self->mt_mask;
663 /* The table we get from _New() is probably smaller than we wanted.
664 Free it and allocate one that's the right size. */
665 PyMem_FREE(new->mt_table);
666 new->mt_table = PyMem_MALLOC(self->mt_allocated * sizeof(PyMemoEntry));
667 if (new->mt_table == NULL) {
668 PyMem_FREE(new);
Victor Stinner42024562013-07-12 00:53:57 +0200669 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000670 return NULL;
671 }
672 for (i = 0; i < self->mt_allocated; i++) {
673 Py_XINCREF(self->mt_table[i].me_key);
674 }
675 memcpy(new->mt_table, self->mt_table,
676 sizeof(PyMemoEntry) * self->mt_allocated);
677
678 return new;
679}
680
681static Py_ssize_t
682PyMemoTable_Size(PyMemoTable *self)
683{
684 return self->mt_used;
685}
686
687static int
688PyMemoTable_Clear(PyMemoTable *self)
689{
690 Py_ssize_t i = self->mt_allocated;
691
692 while (--i >= 0) {
693 Py_XDECREF(self->mt_table[i].me_key);
694 }
695 self->mt_used = 0;
696 memset(self->mt_table, 0, self->mt_allocated * sizeof(PyMemoEntry));
697 return 0;
698}
699
700static void
701PyMemoTable_Del(PyMemoTable *self)
702{
703 if (self == NULL)
704 return;
705 PyMemoTable_Clear(self);
706
707 PyMem_FREE(self->mt_table);
708 PyMem_FREE(self);
709}
710
711/* Since entries cannot be deleted from this hashtable, _PyMemoTable_Lookup()
712 can be considerably simpler than dictobject.c's lookdict(). */
713static PyMemoEntry *
714_PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
715{
716 size_t i;
717 size_t perturb;
718 size_t mask = (size_t)self->mt_mask;
719 PyMemoEntry *table = self->mt_table;
720 PyMemoEntry *entry;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000721 Py_hash_t hash = (Py_hash_t)key >> 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000722
723 i = hash & mask;
724 entry = &table[i];
725 if (entry->me_key == NULL || entry->me_key == key)
726 return entry;
727
728 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
729 i = (i << 2) + i + perturb + 1;
730 entry = &table[i & mask];
731 if (entry->me_key == NULL || entry->me_key == key)
732 return entry;
733 }
734 assert(0); /* Never reached */
735 return NULL;
736}
737
738/* Returns -1 on failure, 0 on success. */
739static int
740_PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size)
741{
742 PyMemoEntry *oldtable = NULL;
743 PyMemoEntry *oldentry, *newentry;
744 Py_ssize_t new_size = MT_MINSIZE;
745 Py_ssize_t to_process;
746
747 assert(min_size > 0);
748
749 /* Find the smallest valid table size >= min_size. */
750 while (new_size < min_size && new_size > 0)
751 new_size <<= 1;
752 if (new_size <= 0) {
753 PyErr_NoMemory();
754 return -1;
755 }
756 /* new_size needs to be a power of two. */
757 assert((new_size & (new_size - 1)) == 0);
758
759 /* Allocate new table. */
760 oldtable = self->mt_table;
761 self->mt_table = PyMem_MALLOC(new_size * sizeof(PyMemoEntry));
762 if (self->mt_table == NULL) {
Victor Stinner8ca72e22013-07-12 00:53:26 +0200763 self->mt_table = oldtable;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000764 PyErr_NoMemory();
765 return -1;
766 }
767 self->mt_allocated = new_size;
768 self->mt_mask = new_size - 1;
769 memset(self->mt_table, 0, sizeof(PyMemoEntry) * new_size);
770
771 /* Copy entries from the old table. */
772 to_process = self->mt_used;
773 for (oldentry = oldtable; to_process > 0; oldentry++) {
774 if (oldentry->me_key != NULL) {
775 to_process--;
776 /* newentry is a pointer to a chunk of the new
777 mt_table, so we're setting the key:value pair
778 in-place. */
779 newentry = _PyMemoTable_Lookup(self, oldentry->me_key);
780 newentry->me_key = oldentry->me_key;
781 newentry->me_value = oldentry->me_value;
782 }
783 }
784
785 /* Deallocate the old table. */
786 PyMem_FREE(oldtable);
787 return 0;
788}
789
790/* Returns NULL on failure, a pointer to the value otherwise. */
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200791static Py_ssize_t *
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000792PyMemoTable_Get(PyMemoTable *self, PyObject *key)
793{
794 PyMemoEntry *entry = _PyMemoTable_Lookup(self, key);
795 if (entry->me_key == NULL)
796 return NULL;
797 return &entry->me_value;
798}
799
800/* Returns -1 on failure, 0 on success. */
801static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200802PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000803{
804 PyMemoEntry *entry;
805
806 assert(key != NULL);
807
808 entry = _PyMemoTable_Lookup(self, key);
809 if (entry->me_key != NULL) {
810 entry->me_value = value;
811 return 0;
812 }
813 Py_INCREF(key);
814 entry->me_key = key;
815 entry->me_value = value;
816 self->mt_used++;
817
818 /* If we added a key, we can safely resize. Otherwise just return!
819 * If used >= 2/3 size, adjust size. Normally, this quaduples the size.
820 *
821 * Quadrupling the size improves average table sparseness
822 * (reducing collisions) at the cost of some memory. It also halves
823 * the number of expensive resize operations in a growing memo table.
824 *
825 * Very large memo tables (over 50K items) use doubling instead.
826 * This may help applications with severe memory constraints.
827 */
828 if (!(self->mt_used * 3 >= (self->mt_mask + 1) * 2))
829 return 0;
830 return _PyMemoTable_ResizeTable(self,
831 (self->mt_used > 50000 ? 2 : 4) * self->mt_used);
832}
833
834#undef MT_MINSIZE
835#undef PERTURB_SHIFT
836
837/*************************************************************************/
838
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000839
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000840static int
841_Pickler_ClearBuffer(PicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000842{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000843 Py_CLEAR(self->output_buffer);
844 self->output_buffer =
845 PyBytes_FromStringAndSize(NULL, self->max_output_len);
846 if (self->output_buffer == NULL)
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000847 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000848 self->output_len = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100849 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000850 return 0;
851}
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000852
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100853static void
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100854_write_size64(char *out, size_t value)
855{
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800856 int i;
857
858 assert(sizeof(size_t) <= 8);
859
860 for (i = 0; i < sizeof(size_t); i++) {
861 out[i] = (unsigned char)((value >> (8 * i)) & 0xff);
862 }
863 for (i = sizeof(size_t); i < 8; i++) {
864 out[i] = 0;
Alexandre Vassalottided929b2013-11-24 22:41:13 -0800865 }
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100866}
867
868static void
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100869_Pickler_WriteFrameHeader(PicklerObject *self, char *qdata, size_t frame_len)
870{
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100871 qdata[0] = FRAME;
872 _write_size64(qdata + 1, frame_len);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100873}
874
875static int
876_Pickler_CommitFrame(PicklerObject *self)
877{
878 size_t frame_len;
879 char *qdata;
880
881 if (!self->framing || self->frame_start == -1)
882 return 0;
883 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
884 qdata = PyBytes_AS_STRING(self->output_buffer) + self->frame_start;
885 _Pickler_WriteFrameHeader(self, qdata, frame_len);
886 self->frame_start = -1;
887 return 0;
888}
889
890static int
891_Pickler_OpcodeBoundary(PicklerObject *self)
892{
893 Py_ssize_t frame_len;
894
895 if (!self->framing || self->frame_start == -1)
896 return 0;
897 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
898 if (frame_len >= FRAME_SIZE_TARGET)
899 return _Pickler_CommitFrame(self);
900 else
901 return 0;
902}
903
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000904static PyObject *
905_Pickler_GetString(PicklerObject *self)
906{
907 PyObject *output_buffer = self->output_buffer;
908
909 assert(self->output_buffer != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100910
911 if (_Pickler_CommitFrame(self))
912 return NULL;
913
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000914 self->output_buffer = NULL;
915 /* Resize down to exact size */
916 if (_PyBytes_Resize(&output_buffer, self->output_len) < 0)
917 return NULL;
918 return output_buffer;
919}
920
921static int
922_Pickler_FlushToFile(PicklerObject *self)
923{
924 PyObject *output, *result;
925
926 assert(self->write != NULL);
927
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100928 /* This will commit the frame first */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000929 output = _Pickler_GetString(self);
930 if (output == NULL)
931 return -1;
932
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -0800933 result = _Pickle_FastCall(self->write, output);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000934 Py_XDECREF(result);
935 return (result == NULL) ? -1 : 0;
936}
937
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200938static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100939_Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000940{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100941 Py_ssize_t i, n, required;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000942 char *buffer;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100943 int need_new_frame;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000944
945 assert(s != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100946 need_new_frame = (self->framing && self->frame_start == -1);
947
948 if (need_new_frame)
949 n = data_len + FRAME_HEADER_SIZE;
950 else
951 n = data_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000952
953 required = self->output_len + n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100954 if (required > self->max_output_len) {
955 /* Make place in buffer for the pickle chunk */
956 if (self->output_len >= PY_SSIZE_T_MAX / 2 - n) {
957 PyErr_NoMemory();
958 return -1;
959 }
960 self->max_output_len = (self->output_len + n) / 2 * 3;
961 if (_PyBytes_Resize(&self->output_buffer, self->max_output_len) < 0)
962 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000963 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000964 buffer = PyBytes_AS_STRING(self->output_buffer);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100965 if (need_new_frame) {
966 /* Setup new frame */
967 Py_ssize_t frame_start = self->output_len;
968 self->frame_start = frame_start;
969 for (i = 0; i < FRAME_HEADER_SIZE; i++) {
970 /* Write an invalid value, for debugging */
971 buffer[frame_start + i] = 0xFE;
972 }
973 self->output_len += FRAME_HEADER_SIZE;
974 }
975 if (data_len < 8) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000976 /* This is faster than memcpy when the string is short. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100977 for (i = 0; i < data_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000978 buffer[self->output_len + i] = s[i];
979 }
980 }
981 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100982 memcpy(buffer + self->output_len, s, data_len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000983 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100984 self->output_len += data_len;
985 return data_len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000986}
987
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000988static PicklerObject *
989_Pickler_New(void)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000990{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000991 PicklerObject *self;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000992
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000993 self = PyObject_GC_New(PicklerObject, &Pickler_Type);
994 if (self == NULL)
995 return NULL;
996
997 self->pers_func = NULL;
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100998 self->dispatch_table = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000999 self->write = NULL;
1000 self->proto = 0;
1001 self->bin = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001002 self->framing = 0;
1003 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001004 self->fast = 0;
1005 self->fast_nesting = 0;
1006 self->fix_imports = 0;
1007 self->fast_memo = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001008 self->max_output_len = WRITE_BUF_SIZE;
1009 self->output_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001010
1011 self->memo = PyMemoTable_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001012 self->output_buffer = PyBytes_FromStringAndSize(NULL,
1013 self->max_output_len);
Victor Stinner68c8ea22013-07-11 22:56:25 +02001014
1015 if (self->memo == NULL || self->output_buffer == NULL) {
Victor Stinnerc31df042013-07-12 00:08:59 +02001016 Py_DECREF(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001017 return NULL;
1018 }
1019 return self;
1020}
1021
1022static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001023_Pickler_SetProtocol(PicklerObject *self, PyObject *protocol, int fix_imports)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001024{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001025 long proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001026
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001027 if (protocol == NULL || protocol == Py_None) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001028 proto = DEFAULT_PROTOCOL;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001029 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001030 else {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001031 proto = PyLong_AsLong(protocol);
1032 if (proto < 0) {
1033 if (proto == -1 && PyErr_Occurred())
1034 return -1;
1035 proto = HIGHEST_PROTOCOL;
1036 }
1037 else if (proto > HIGHEST_PROTOCOL) {
1038 PyErr_Format(PyExc_ValueError, "pickle protocol must be <= %d",
1039 HIGHEST_PROTOCOL);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001040 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001041 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001042 }
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001043 self->proto = (int)proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001044 self->bin = proto > 0;
1045 self->fix_imports = fix_imports && proto < 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001046 return 0;
1047}
1048
1049/* Returns -1 (with an exception set) on failure, 0 on success. This may
1050 be called once on a freshly created Pickler. */
1051static int
1052_Pickler_SetOutputStream(PicklerObject *self, PyObject *file)
1053{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001054 _Py_IDENTIFIER(write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001055 assert(file != NULL);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001056 self->write = _PyObject_GetAttrId(file, &PyId_write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001057 if (self->write == NULL) {
1058 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1059 PyErr_SetString(PyExc_TypeError,
1060 "file must have a 'write' attribute");
1061 return -1;
1062 }
1063
1064 return 0;
1065}
1066
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001067/* Returns the size of the input on success, -1 on failure. This takes its
1068 own reference to `input`. */
1069static Py_ssize_t
1070_Unpickler_SetStringInput(UnpicklerObject *self, PyObject *input)
1071{
1072 if (self->buffer.buf != NULL)
1073 PyBuffer_Release(&self->buffer);
1074 if (PyObject_GetBuffer(input, &self->buffer, PyBUF_CONTIG_RO) < 0)
1075 return -1;
1076 self->input_buffer = self->buffer.buf;
1077 self->input_len = self->buffer.len;
1078 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001079 self->prefetched_idx = self->input_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001080 return self->input_len;
1081}
1082
Antoine Pitrou04248a82010-10-12 20:51:21 +00001083static int
1084_Unpickler_SkipConsumed(UnpicklerObject *self)
1085{
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001086 Py_ssize_t consumed;
1087 PyObject *r;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001088
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001089 consumed = self->next_read_idx - self->prefetched_idx;
1090 if (consumed <= 0)
1091 return 0;
1092
1093 assert(self->peek); /* otherwise we did something wrong */
1094 /* This makes an useless copy... */
1095 r = PyObject_CallFunction(self->read, "n", consumed);
1096 if (r == NULL)
1097 return -1;
1098 Py_DECREF(r);
1099
1100 self->prefetched_idx = self->next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001101 return 0;
1102}
1103
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001104static const Py_ssize_t READ_WHOLE_LINE = -1;
1105
1106/* If reading from a file, we need to only pull the bytes we need, since there
1107 may be multiple pickle objects arranged contiguously in the same input
1108 buffer.
1109
1110 If `n` is READ_WHOLE_LINE, read a whole line. Otherwise, read up to `n`
1111 bytes from the input stream/buffer.
1112
1113 Update the unpickler's input buffer with the newly-read data. Returns -1 on
1114 failure; on success, returns the number of bytes read from the file.
1115
1116 On success, self->input_len will be 0; this is intentional so that when
1117 unpickling from a file, the "we've run out of data" code paths will trigger,
1118 causing the Unpickler to go back to the file for more data. Use the returned
1119 size to tell you how much data you can process. */
1120static Py_ssize_t
1121_Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
1122{
1123 PyObject *data;
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001124 Py_ssize_t read_size;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001125
1126 assert(self->read != NULL);
Victor Stinner121aab42011-09-29 23:40:53 +02001127
Antoine Pitrou04248a82010-10-12 20:51:21 +00001128 if (_Unpickler_SkipConsumed(self) < 0)
1129 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001130
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001131 if (n == READ_WHOLE_LINE) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08001132 PyObject *empty_tuple = PyTuple_New(0);
1133 data = PyObject_Call(self->readline, empty_tuple, NULL);
1134 Py_DECREF(empty_tuple);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001135 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001136 else {
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001137 PyObject *len;
1138 /* Prefetch some data without advancing the file pointer, if possible */
1139 if (self->peek && n < PREFETCH) {
1140 len = PyLong_FromSsize_t(PREFETCH);
1141 if (len == NULL)
1142 return -1;
1143 data = _Pickle_FastCall(self->peek, len);
1144 if (data == NULL) {
1145 if (!PyErr_ExceptionMatches(PyExc_NotImplementedError))
1146 return -1;
1147 /* peek() is probably not supported by the given file object */
1148 PyErr_Clear();
1149 Py_CLEAR(self->peek);
1150 }
1151 else {
1152 read_size = _Unpickler_SetStringInput(self, data);
1153 Py_DECREF(data);
1154 self->prefetched_idx = 0;
1155 if (n <= read_size)
1156 return n;
1157 }
1158 }
1159 len = PyLong_FromSsize_t(n);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001160 if (len == NULL)
1161 return -1;
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001162 data = _Pickle_FastCall(self->read, len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001163 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001164 if (data == NULL)
1165 return -1;
1166
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001167 read_size = _Unpickler_SetStringInput(self, data);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001168 Py_DECREF(data);
1169 return read_size;
1170}
1171
1172/* Read `n` bytes from the unpickler's data source, storing the result in `*s`.
1173
1174 This should be used for all data reads, rather than accessing the unpickler's
1175 input buffer directly. This method deals correctly with reading from input
1176 streams, which the input buffer doesn't deal with.
1177
1178 Note that when reading from a file-like object, self->next_read_idx won't
1179 be updated (it should remain at 0 for the entire unpickling process). You
1180 should use this function's return value to know how many bytes you can
1181 consume.
1182
1183 Returns -1 (with an exception set) on failure. On success, return the
1184 number of chars read. */
1185static Py_ssize_t
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08001186_Unpickler_Read(UnpicklerObject *self, char **s, Py_ssize_t n)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001187{
Antoine Pitrou04248a82010-10-12 20:51:21 +00001188 Py_ssize_t num_read;
1189
Antoine Pitrou04248a82010-10-12 20:51:21 +00001190 if (self->next_read_idx + n <= self->input_len) {
1191 *s = self->input_buffer + self->next_read_idx;
1192 self->next_read_idx += n;
1193 return n;
1194 }
1195 if (!self->read) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001196 PyErr_Format(PyExc_EOFError, "Ran out of input");
Amaury Forgeot d'Arc3e4e72f2008-11-11 20:05:06 +00001197 return -1;
1198 }
Antoine Pitrou04248a82010-10-12 20:51:21 +00001199 num_read = _Unpickler_ReadFromFile(self, n);
1200 if (num_read < 0)
1201 return -1;
1202 if (num_read < n) {
1203 PyErr_Format(PyExc_EOFError, "Ran out of input");
1204 return -1;
1205 }
1206 *s = self->input_buffer;
1207 self->next_read_idx = n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001208 return n;
1209}
1210
1211static Py_ssize_t
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001212_Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len,
1213 char **result)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001214{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001215 char *input_line = PyMem_Realloc(self->input_line, len + 1);
Victor Stinner42024562013-07-12 00:53:57 +02001216 if (input_line == NULL) {
1217 PyErr_NoMemory();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001218 return -1;
Victor Stinner42024562013-07-12 00:53:57 +02001219 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001220
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001221 memcpy(input_line, line, len);
1222 input_line[len] = '\0';
1223 self->input_line = input_line;
1224 *result = self->input_line;
1225 return len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001226}
1227
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001228/* Read a line from the input stream/buffer. If we run off the end of the input
1229 before hitting \n, return the data we found.
1230
1231 Returns the number of chars read, or -1 on failure. */
1232static Py_ssize_t
1233_Unpickler_Readline(UnpicklerObject *self, char **result)
1234{
1235 Py_ssize_t i, num_read;
1236
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001237 for (i = self->next_read_idx; i < self->input_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001238 if (self->input_buffer[i] == '\n') {
1239 char *line_start = self->input_buffer + self->next_read_idx;
1240 num_read = i - self->next_read_idx + 1;
1241 self->next_read_idx = i + 1;
1242 return _Unpickler_CopyLine(self, line_start, num_read, result);
1243 }
1244 }
1245 if (self->read) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001246 num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE);
1247 if (num_read < 0)
1248 return -1;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001249 self->next_read_idx = num_read;
Antoine Pitrouf6c7a852011-08-11 21:04:02 +02001250 return _Unpickler_CopyLine(self, self->input_buffer, num_read, result);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001251 }
Victor Stinner121aab42011-09-29 23:40:53 +02001252
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001253 /* If we get here, we've run off the end of the input string. Return the
1254 remaining string and let the caller figure it out. */
1255 *result = self->input_buffer + self->next_read_idx;
1256 num_read = i - self->next_read_idx;
1257 self->next_read_idx = i;
1258 return num_read;
1259}
1260
1261/* Returns -1 (with an exception set) on failure, 0 on success. The memo array
1262 will be modified in place. */
1263static int
1264_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size)
1265{
1266 Py_ssize_t i;
1267 PyObject **memo;
1268
1269 assert(new_size > self->memo_size);
1270
1271 memo = PyMem_REALLOC(self->memo, new_size * sizeof(PyObject *));
1272 if (memo == NULL) {
1273 PyErr_NoMemory();
1274 return -1;
1275 }
1276 self->memo = memo;
1277 for (i = self->memo_size; i < new_size; i++)
1278 self->memo[i] = NULL;
1279 self->memo_size = new_size;
1280 return 0;
1281}
1282
1283/* Returns NULL if idx is out of bounds. */
1284static PyObject *
1285_Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx)
1286{
1287 if (idx < 0 || idx >= self->memo_size)
1288 return NULL;
1289
1290 return self->memo[idx];
1291}
1292
1293/* Returns -1 (with an exception set) on failure, 0 on success.
1294 This takes its own reference to `value`. */
1295static int
1296_Unpickler_MemoPut(UnpicklerObject *self, Py_ssize_t idx, PyObject *value)
1297{
1298 PyObject *old_item;
1299
1300 if (idx >= self->memo_size) {
1301 if (_Unpickler_ResizeMemoList(self, idx * 2) < 0)
1302 return -1;
1303 assert(idx < self->memo_size);
1304 }
1305 Py_INCREF(value);
1306 old_item = self->memo[idx];
1307 self->memo[idx] = value;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001308 if (old_item != NULL) {
1309 Py_DECREF(old_item);
1310 }
1311 else {
1312 self->memo_len++;
1313 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001314 return 0;
1315}
1316
1317static PyObject **
1318_Unpickler_NewMemo(Py_ssize_t new_size)
1319{
1320 PyObject **memo = PyMem_MALLOC(new_size * sizeof(PyObject *));
Victor Stinner42024562013-07-12 00:53:57 +02001321 if (memo == NULL) {
1322 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001323 return NULL;
Victor Stinner42024562013-07-12 00:53:57 +02001324 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001325 memset(memo, 0, new_size * sizeof(PyObject *));
1326 return memo;
1327}
1328
1329/* Free the unpickler's memo, taking care to decref any items left in it. */
1330static void
1331_Unpickler_MemoCleanup(UnpicklerObject *self)
1332{
1333 Py_ssize_t i;
1334 PyObject **memo = self->memo;
1335
1336 if (self->memo == NULL)
1337 return;
1338 self->memo = NULL;
1339 i = self->memo_size;
1340 while (--i >= 0) {
1341 Py_XDECREF(memo[i]);
1342 }
1343 PyMem_FREE(memo);
1344}
1345
1346static UnpicklerObject *
1347_Unpickler_New(void)
1348{
1349 UnpicklerObject *self;
1350
1351 self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type);
1352 if (self == NULL)
1353 return NULL;
1354
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001355 self->pers_func = NULL;
1356 self->input_buffer = NULL;
1357 self->input_line = NULL;
1358 self->input_len = 0;
1359 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001360 self->prefetched_idx = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001361 self->read = NULL;
1362 self->readline = NULL;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001363 self->peek = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001364 self->encoding = NULL;
1365 self->errors = NULL;
1366 self->marks = NULL;
1367 self->num_marks = 0;
1368 self->marks_size = 0;
1369 self->proto = 0;
1370 self->fix_imports = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001371 memset(&self->buffer, 0, sizeof(Py_buffer));
1372 self->memo_size = 32;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001373 self->memo_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001374 self->memo = _Unpickler_NewMemo(self->memo_size);
1375 self->stack = (Pdata *)Pdata_New();
1376
1377 if (self->memo == NULL || self->stack == NULL) {
1378 Py_DECREF(self);
1379 return NULL;
1380 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001381
1382 return self;
1383}
1384
1385/* Returns -1 (with an exception set) on failure, 0 on success. This may
1386 be called once on a freshly created Pickler. */
1387static int
1388_Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file)
1389{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001390 _Py_IDENTIFIER(peek);
1391 _Py_IDENTIFIER(read);
1392 _Py_IDENTIFIER(readline);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001393
1394 self->peek = _PyObject_GetAttrId(file, &PyId_peek);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001395 if (self->peek == NULL) {
1396 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1397 PyErr_Clear();
1398 else
1399 return -1;
1400 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001401 self->read = _PyObject_GetAttrId(file, &PyId_read);
1402 self->readline = _PyObject_GetAttrId(file, &PyId_readline);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001403 if (self->readline == NULL || self->read == NULL) {
1404 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1405 PyErr_SetString(PyExc_TypeError,
1406 "file must have 'read' and 'readline' attributes");
1407 Py_CLEAR(self->read);
1408 Py_CLEAR(self->readline);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001409 Py_CLEAR(self->peek);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001410 return -1;
1411 }
1412 return 0;
1413}
1414
1415/* Returns -1 (with an exception set) on failure, 0 on success. This may
1416 be called once on a freshly created Pickler. */
1417static int
1418_Unpickler_SetInputEncoding(UnpicklerObject *self,
1419 const char *encoding,
1420 const char *errors)
1421{
1422 if (encoding == NULL)
1423 encoding = "ASCII";
1424 if (errors == NULL)
1425 errors = "strict";
1426
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001427 self->encoding = _PyMem_Strdup(encoding);
1428 self->errors = _PyMem_Strdup(errors);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001429 if (self->encoding == NULL || self->errors == NULL) {
1430 PyErr_NoMemory();
1431 return -1;
1432 }
1433 return 0;
1434}
1435
1436/* Generate a GET opcode for an object stored in the memo. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001437static int
1438memo_get(PicklerObject *self, PyObject *key)
1439{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001440 Py_ssize_t *value;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001441 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001442 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001443
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001444 value = PyMemoTable_Get(self->memo, key);
1445 if (value == NULL) {
1446 PyErr_SetObject(PyExc_KeyError, key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001447 return -1;
1448 }
1449
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001450 if (!self->bin) {
1451 pdata[0] = GET;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001452 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
1453 "%" PY_FORMAT_SIZE_T "d\n", *value);
1454 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001455 }
1456 else {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001457 if (*value < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001458 pdata[0] = BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001459 pdata[1] = (unsigned char)(*value & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001460 len = 2;
1461 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001462 else if (*value <= 0xffffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001463 pdata[0] = LONG_BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001464 pdata[1] = (unsigned char)(*value & 0xff);
1465 pdata[2] = (unsigned char)((*value >> 8) & 0xff);
1466 pdata[3] = (unsigned char)((*value >> 16) & 0xff);
1467 pdata[4] = (unsigned char)((*value >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001468 len = 5;
1469 }
1470 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001471 PickleState *st = _Pickle_GetGlobalState();
1472 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001473 "memo id too large for LONG_BINGET");
1474 return -1;
1475 }
1476 }
1477
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001478 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001479 return -1;
1480
1481 return 0;
1482}
1483
1484/* Store an object in the memo, assign it a new unique ID based on the number
1485 of objects currently stored in the memo and generate a PUT opcode. */
1486static int
1487memo_put(PicklerObject *self, PyObject *obj)
1488{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001489 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001490 Py_ssize_t len;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001491 Py_ssize_t idx;
1492
1493 const char memoize_op = MEMOIZE;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001494
1495 if (self->fast)
1496 return 0;
1497
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001498 idx = PyMemoTable_Size(self->memo);
1499 if (PyMemoTable_Set(self->memo, obj, idx) < 0)
1500 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001501
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001502 if (self->proto >= 4) {
1503 if (_Pickler_Write(self, &memoize_op, 1) < 0)
1504 return -1;
1505 return 0;
1506 }
1507 else if (!self->bin) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001508 pdata[0] = PUT;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001509 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001510 "%" PY_FORMAT_SIZE_T "d\n", idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001511 len = strlen(pdata);
1512 }
1513 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001514 if (idx < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001515 pdata[0] = BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001516 pdata[1] = (unsigned char)idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001517 len = 2;
1518 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001519 else if (idx <= 0xffffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001520 pdata[0] = LONG_BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001521 pdata[1] = (unsigned char)(idx & 0xff);
1522 pdata[2] = (unsigned char)((idx >> 8) & 0xff);
1523 pdata[3] = (unsigned char)((idx >> 16) & 0xff);
1524 pdata[4] = (unsigned char)((idx >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001525 len = 5;
1526 }
1527 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001528 PickleState *st = _Pickle_GetGlobalState();
1529 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001530 "memo id too large for LONG_BINPUT");
1531 return -1;
1532 }
1533 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001534 if (_Pickler_Write(self, pdata, len) < 0)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001535 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001536
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001537 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001538}
1539
1540static PyObject *
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001541getattribute(PyObject *obj, PyObject *name, int allow_qualname) {
1542 PyObject *dotted_path;
1543 Py_ssize_t i;
1544 _Py_static_string(PyId_dot, ".");
1545 _Py_static_string(PyId_locals, "<locals>");
1546
1547 dotted_path = PyUnicode_Split(name, _PyUnicode_FromId(&PyId_dot), -1);
1548 if (dotted_path == NULL) {
1549 return NULL;
1550 }
1551 assert(Py_SIZE(dotted_path) >= 1);
1552 if (!allow_qualname && Py_SIZE(dotted_path) > 1) {
1553 PyErr_Format(PyExc_AttributeError,
1554 "Can't get qualified attribute %R on %R;"
1555 "use protocols >= 4 to enable support",
1556 name, obj);
1557 Py_DECREF(dotted_path);
1558 return NULL;
1559 }
1560 Py_INCREF(obj);
1561 for (i = 0; i < Py_SIZE(dotted_path); i++) {
1562 PyObject *subpath = PyList_GET_ITEM(dotted_path, i);
1563 PyObject *tmp;
1564 PyObject *result = PyUnicode_RichCompare(
1565 subpath, _PyUnicode_FromId(&PyId_locals), Py_EQ);
1566 int is_equal = (result == Py_True);
1567 assert(PyBool_Check(result));
1568 Py_DECREF(result);
1569 if (is_equal) {
1570 PyErr_Format(PyExc_AttributeError,
1571 "Can't get local attribute %R on %R", name, obj);
1572 Py_DECREF(dotted_path);
1573 Py_DECREF(obj);
1574 return NULL;
1575 }
1576 tmp = PyObject_GetAttr(obj, subpath);
1577 Py_DECREF(obj);
1578 if (tmp == NULL) {
1579 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1580 PyErr_Clear();
1581 PyErr_Format(PyExc_AttributeError,
1582 "Can't get attribute %R on %R", name, obj);
1583 }
1584 Py_DECREF(dotted_path);
1585 return NULL;
1586 }
1587 obj = tmp;
1588 }
1589 Py_DECREF(dotted_path);
1590 return obj;
1591}
1592
1593static PyObject *
1594whichmodule(PyObject *global, PyObject *global_name, int allow_qualname)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001595{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001596 PyObject *module_name;
1597 PyObject *modules_dict;
1598 PyObject *module;
1599 PyObject *obj;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001600 Py_ssize_t i, j;
1601 _Py_IDENTIFIER(__module__);
1602 _Py_IDENTIFIER(modules);
1603 _Py_IDENTIFIER(__main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001604
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001605 module_name = _PyObject_GetAttrId(global, &PyId___module__);
1606
1607 if (module_name == NULL) {
1608 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001609 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001610 PyErr_Clear();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001611 }
1612 else {
1613 /* In some rare cases (e.g., bound methods of extension types),
1614 __module__ can be None. If it is so, then search sys.modules for
1615 the module of global. */
1616 if (module_name != Py_None)
1617 return module_name;
1618 Py_CLEAR(module_name);
1619 }
1620 assert(module_name == NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001621
Victor Stinnerbb520202013-11-06 22:40:41 +01001622 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02001623 if (modules_dict == NULL) {
1624 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001625 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02001626 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001627
1628 i = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001629 while ((j = PyDict_Next(modules_dict, &i, &module_name, &module))) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001630 PyObject *result = PyUnicode_RichCompare(
1631 module_name, _PyUnicode_FromId(&PyId___main__), Py_EQ);
1632 int is_equal = (result == Py_True);
1633 assert(PyBool_Check(result));
1634 Py_DECREF(result);
1635 if (is_equal)
1636 continue;
1637 if (module == Py_None)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001638 continue;
1639
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001640 obj = getattribute(module, global_name, allow_qualname);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001641 if (obj == NULL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001642 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001643 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001644 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001645 continue;
1646 }
1647
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001648 if (obj == global) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001649 Py_DECREF(obj);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001650 Py_INCREF(module_name);
1651 return module_name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001652 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001653 Py_DECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001654 }
1655
1656 /* If no module is found, use __main__. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001657 module_name = _PyUnicode_FromId(&PyId___main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001658 Py_INCREF(module_name);
1659 return module_name;
1660}
1661
1662/* fast_save_enter() and fast_save_leave() are guards against recursive
1663 objects when Pickler is used with the "fast mode" (i.e., with object
1664 memoization disabled). If the nesting of a list or dict object exceed
1665 FAST_NESTING_LIMIT, these guards will start keeping an internal
1666 reference to the seen list or dict objects and check whether these objects
1667 are recursive. These are not strictly necessary, since save() has a
1668 hard-coded recursion limit, but they give a nicer error message than the
1669 typical RuntimeError. */
1670static int
1671fast_save_enter(PicklerObject *self, PyObject *obj)
1672{
1673 /* if fast_nesting < 0, we're doing an error exit. */
1674 if (++self->fast_nesting >= FAST_NESTING_LIMIT) {
1675 PyObject *key = NULL;
1676 if (self->fast_memo == NULL) {
1677 self->fast_memo = PyDict_New();
1678 if (self->fast_memo == NULL) {
1679 self->fast_nesting = -1;
1680 return 0;
1681 }
1682 }
1683 key = PyLong_FromVoidPtr(obj);
1684 if (key == NULL)
1685 return 0;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001686 if (PyDict_GetItemWithError(self->fast_memo, key)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001687 Py_DECREF(key);
1688 PyErr_Format(PyExc_ValueError,
1689 "fast mode: can't pickle cyclic objects "
1690 "including object type %.200s at %p",
1691 obj->ob_type->tp_name, obj);
1692 self->fast_nesting = -1;
1693 return 0;
1694 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001695 if (PyErr_Occurred()) {
1696 return 0;
1697 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001698 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
1699 Py_DECREF(key);
1700 self->fast_nesting = -1;
1701 return 0;
1702 }
1703 Py_DECREF(key);
1704 }
1705 return 1;
1706}
1707
1708static int
1709fast_save_leave(PicklerObject *self, PyObject *obj)
1710{
1711 if (self->fast_nesting-- >= FAST_NESTING_LIMIT) {
1712 PyObject *key = PyLong_FromVoidPtr(obj);
1713 if (key == NULL)
1714 return 0;
1715 if (PyDict_DelItem(self->fast_memo, key) < 0) {
1716 Py_DECREF(key);
1717 return 0;
1718 }
1719 Py_DECREF(key);
1720 }
1721 return 1;
1722}
1723
1724static int
1725save_none(PicklerObject *self, PyObject *obj)
1726{
1727 const char none_op = NONE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001728 if (_Pickler_Write(self, &none_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001729 return -1;
1730
1731 return 0;
1732}
1733
1734static int
1735save_bool(PicklerObject *self, PyObject *obj)
1736{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001737 if (self->proto >= 2) {
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001738 const char bool_op = (obj == Py_True) ? NEWTRUE : NEWFALSE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001739 if (_Pickler_Write(self, &bool_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001740 return -1;
1741 }
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08001742 else {
1743 /* These aren't opcodes -- they're ways to pickle bools before protocol 2
1744 * so that unpicklers written before bools were introduced unpickle them
1745 * as ints, but unpicklers after can recognize that bools were intended.
1746 * Note that protocol 2 added direct ways to pickle bools.
1747 */
1748 const char *bool_str = (obj == Py_True) ? "I01\n" : "I00\n";
1749 if (_Pickler_Write(self, bool_str, strlen(bool_str)) < 0)
1750 return -1;
1751 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001752 return 0;
1753}
1754
1755static int
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001756save_long(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001757{
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001758 PyObject *repr = NULL;
1759 Py_ssize_t size;
1760 long val;
1761 int status = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001762
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001763 const char long_op = LONG;
1764
1765 val= PyLong_AsLong(obj);
1766 if (val == -1 && PyErr_Occurred()) {
1767 /* out of range for int pickling */
1768 PyErr_Clear();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001769 }
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001770 else if (self->bin &&
1771 (sizeof(long) <= 4 ||
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08001772 (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1)))) {
1773 /* result fits in a signed 4-byte integer.
1774
1775 Note: we can't use -0x80000000L in the above condition because some
1776 compilers (e.g., MSVC) will promote 0x80000000L to an unsigned type
1777 before applying the unary minus when sizeof(long) <= 4. The
1778 resulting value stays unsigned which is commonly not what we want,
1779 so MSVC happily warns us about it. However, that result would have
1780 been fine because we guard for sizeof(long) <= 4 which turns the
1781 condition true in that particular case. */
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001782 char pdata[32];
1783 Py_ssize_t len = 0;
1784
1785 pdata[1] = (unsigned char)(val & 0xff);
1786 pdata[2] = (unsigned char)((val >> 8) & 0xff);
1787 pdata[3] = (unsigned char)((val >> 16) & 0xff);
1788 pdata[4] = (unsigned char)((val >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001789
1790 if ((pdata[4] == 0) && (pdata[3] == 0)) {
1791 if (pdata[2] == 0) {
1792 pdata[0] = BININT1;
1793 len = 2;
1794 }
1795 else {
1796 pdata[0] = BININT2;
1797 len = 3;
1798 }
1799 }
1800 else {
1801 pdata[0] = BININT;
1802 len = 5;
1803 }
1804
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001805 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001806 return -1;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08001807
1808 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001809 }
1810
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001811 if (self->proto >= 2) {
1812 /* Linear-time pickling. */
1813 size_t nbits;
1814 size_t nbytes;
1815 unsigned char *pdata;
1816 char header[5];
1817 int i;
1818 int sign = _PyLong_Sign(obj);
1819
1820 if (sign == 0) {
1821 header[0] = LONG1;
1822 header[1] = 0; /* It's 0 -- an empty bytestring. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001823 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001824 goto error;
1825 return 0;
1826 }
1827 nbits = _PyLong_NumBits(obj);
1828 if (nbits == (size_t)-1 && PyErr_Occurred())
1829 goto error;
1830 /* How many bytes do we need? There are nbits >> 3 full
1831 * bytes of data, and nbits & 7 leftover bits. If there
1832 * are any leftover bits, then we clearly need another
1833 * byte. Wnat's not so obvious is that we *probably*
1834 * need another byte even if there aren't any leftovers:
1835 * the most-significant bit of the most-significant byte
1836 * acts like a sign bit, and it's usually got a sense
Serhiy Storchaka95949422013-08-27 19:40:23 +03001837 * opposite of the one we need. The exception is ints
1838 * of the form -(2**(8*j-1)) for j > 0. Such an int is
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001839 * its own 256's-complement, so has the right sign bit
1840 * even without the extra byte. That's a pain to check
1841 * for in advance, though, so we always grab an extra
1842 * byte at the start, and cut it back later if possible.
1843 */
1844 nbytes = (nbits >> 3) + 1;
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001845 if (nbytes > 0x7fffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001846 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03001847 "int too large to pickle");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001848 goto error;
1849 }
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001850 repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001851 if (repr == NULL)
1852 goto error;
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00001853 pdata = (unsigned char *)PyBytes_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001854 i = _PyLong_AsByteArray((PyLongObject *)obj,
1855 pdata, nbytes,
1856 1 /* little endian */ , 1 /* signed */ );
1857 if (i < 0)
1858 goto error;
Serhiy Storchaka95949422013-08-27 19:40:23 +03001859 /* If the int is negative, this may be a byte more than
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001860 * needed. This is so iff the MSB is all redundant sign
1861 * bits.
1862 */
1863 if (sign < 0 &&
Victor Stinner121aab42011-09-29 23:40:53 +02001864 nbytes > 1 &&
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001865 pdata[nbytes - 1] == 0xff &&
1866 (pdata[nbytes - 2] & 0x80) != 0) {
1867 nbytes--;
1868 }
1869
1870 if (nbytes < 256) {
1871 header[0] = LONG1;
1872 header[1] = (unsigned char)nbytes;
1873 size = 2;
1874 }
1875 else {
1876 header[0] = LONG4;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001877 size = (Py_ssize_t) nbytes;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001878 for (i = 1; i < 5; i++) {
1879 header[i] = (unsigned char)(size & 0xff);
1880 size >>= 8;
1881 }
1882 size = 5;
1883 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001884 if (_Pickler_Write(self, header, size) < 0 ||
1885 _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001886 goto error;
1887 }
1888 else {
1889 char *string;
1890
Mark Dickinson8dd05142009-01-20 20:43:58 +00001891 /* proto < 2: write the repr and newline. This is quadratic-time (in
1892 the number of digits), in both directions. We add a trailing 'L'
1893 to the repr, for compatibility with Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001894
1895 repr = PyObject_Repr(obj);
1896 if (repr == NULL)
1897 goto error;
1898
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001899 string = _PyUnicode_AsStringAndSize(repr, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001900 if (string == NULL)
1901 goto error;
1902
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001903 if (_Pickler_Write(self, &long_op, 1) < 0 ||
1904 _Pickler_Write(self, string, size) < 0 ||
1905 _Pickler_Write(self, "L\n", 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001906 goto error;
1907 }
1908
1909 if (0) {
1910 error:
1911 status = -1;
1912 }
1913 Py_XDECREF(repr);
1914
1915 return status;
1916}
1917
1918static int
1919save_float(PicklerObject *self, PyObject *obj)
1920{
1921 double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj);
1922
1923 if (self->bin) {
1924 char pdata[9];
1925 pdata[0] = BINFLOAT;
1926 if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0)
1927 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001928 if (_Pickler_Write(self, pdata, 9) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001929 return -1;
Victor Stinner121aab42011-09-29 23:40:53 +02001930 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001931 else {
Eric Smith0923d1d2009-04-16 20:16:10 +00001932 int result = -1;
1933 char *buf = NULL;
1934 char op = FLOAT;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001935
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001936 if (_Pickler_Write(self, &op, 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001937 goto done;
1938
Mark Dickinson3e09f432009-04-17 08:41:23 +00001939 buf = PyOS_double_to_string(x, 'g', 17, 0, NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +00001940 if (!buf) {
1941 PyErr_NoMemory();
1942 goto done;
1943 }
1944
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001945 if (_Pickler_Write(self, buf, strlen(buf)) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001946 goto done;
1947
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001948 if (_Pickler_Write(self, "\n", 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00001949 goto done;
1950
1951 result = 0;
1952done:
1953 PyMem_Free(buf);
1954 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001955 }
1956
1957 return 0;
1958}
1959
1960static int
1961save_bytes(PicklerObject *self, PyObject *obj)
1962{
1963 if (self->proto < 3) {
1964 /* Older pickle protocols do not have an opcode for pickling bytes
1965 objects. Therefore, we need to fake the copy protocol (i.e.,
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001966 the __reduce__ method) to permit bytes object unpickling.
1967
1968 Here we use a hack to be compatible with Python 2. Since in Python
1969 2 'bytes' is just an alias for 'str' (which has different
1970 parameters than the actual bytes object), we use codecs.encode
1971 to create the appropriate 'str' object when unpickled using
1972 Python 2 *and* the appropriate 'bytes' object when unpickled
1973 using Python 3. Again this is a hack and we don't need to do this
1974 with newer protocols. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001975 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001976 int status;
1977
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001978 if (PyBytes_GET_SIZE(obj) == 0) {
1979 reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type);
1980 }
1981 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001982 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001983 PyObject *unicode_str =
1984 PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj),
1985 PyBytes_GET_SIZE(obj),
1986 "strict");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001987 _Py_IDENTIFIER(latin1);
1988
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001989 if (unicode_str == NULL)
1990 return -1;
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001991 reduce_value = Py_BuildValue("(O(OO))",
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001992 st->codecs_encode, unicode_str,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001993 _PyUnicode_FromId(&PyId_latin1));
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05001994 Py_DECREF(unicode_str);
1995 }
1996
1997 if (reduce_value == NULL)
1998 return -1;
1999
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002000 /* save_reduce() will memoize the object automatically. */
2001 status = save_reduce(self, reduce_value, obj);
2002 Py_DECREF(reduce_value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002003 return status;
2004 }
2005 else {
2006 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002007 char header[9];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002008 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002009
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002010 size = PyBytes_GET_SIZE(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002011 if (size < 0)
2012 return -1;
2013
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002014 if (size <= 0xff) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002015 header[0] = SHORT_BINBYTES;
2016 header[1] = (unsigned char)size;
2017 len = 2;
2018 }
2019 else if (size <= 0xffffffffL) {
2020 header[0] = BINBYTES;
2021 header[1] = (unsigned char)(size & 0xff);
2022 header[2] = (unsigned char)((size >> 8) & 0xff);
2023 header[3] = (unsigned char)((size >> 16) & 0xff);
2024 header[4] = (unsigned char)((size >> 24) & 0xff);
2025 len = 5;
2026 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002027 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002028 header[0] = BINBYTES8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002029 _write_size64(header + 1, size);
Alexandre Vassalotti6e73ff12013-12-05 19:29:32 -08002030 len = 9;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002031 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002032 else {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002033 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakaf8def282013-02-16 17:29:56 +02002034 "cannot serialize a bytes object larger than 4 GiB");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002035 return -1; /* string too large */
2036 }
2037
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002038 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002039 return -1;
2040
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002041 if (_Pickler_Write(self, PyBytes_AS_STRING(obj), size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002042 return -1;
2043
2044 if (memo_put(self, obj) < 0)
2045 return -1;
2046
2047 return 0;
2048 }
2049}
2050
2051/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
2052 backslash and newline characters to \uXXXX escapes. */
2053static PyObject *
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002054raw_unicode_escape(PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002055{
2056 PyObject *repr, *result;
2057 char *p;
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002058 Py_ssize_t i, size, expandsize;
2059 void *data;
2060 unsigned int kind;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002061
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002062 if (PyUnicode_READY(obj))
2063 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002064
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002065 size = PyUnicode_GET_LENGTH(obj);
2066 data = PyUnicode_DATA(obj);
2067 kind = PyUnicode_KIND(obj);
2068 if (kind == PyUnicode_4BYTE_KIND)
2069 expandsize = 10;
2070 else
2071 expandsize = 6;
Victor Stinner121aab42011-09-29 23:40:53 +02002072
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002073 if (size > PY_SSIZE_T_MAX / expandsize)
2074 return PyErr_NoMemory();
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002075 repr = PyByteArray_FromStringAndSize(NULL, expandsize * size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002076 if (repr == NULL)
2077 return NULL;
2078 if (size == 0)
2079 goto done;
2080
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002081 p = PyByteArray_AS_STRING(repr);
2082 for (i=0; i < size; i++) {
2083 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002084 /* Map 32-bit characters to '\Uxxxxxxxx' */
2085 if (ch >= 0x10000) {
2086 *p++ = '\\';
2087 *p++ = 'U';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002088 *p++ = Py_hexdigits[(ch >> 28) & 0xf];
2089 *p++ = Py_hexdigits[(ch >> 24) & 0xf];
2090 *p++ = Py_hexdigits[(ch >> 20) & 0xf];
2091 *p++ = Py_hexdigits[(ch >> 16) & 0xf];
2092 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2093 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2094 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2095 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002096 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002097 /* Map 16-bit characters to '\uxxxx' */
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002098 else if (ch >= 256 || ch == '\\' || ch == '\n') {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002099 *p++ = '\\';
2100 *p++ = 'u';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002101 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2102 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2103 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2104 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002105 }
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002106 /* Copy everything else as-is */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002107 else
2108 *p++ = (char) ch;
2109 }
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002110 size = p - PyByteArray_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002111
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002112done:
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002113 result = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(repr), size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002114 Py_DECREF(repr);
2115 return result;
2116}
2117
2118static int
Antoine Pitrou299978d2013-04-07 17:38:11 +02002119write_utf8(PicklerObject *self, char *data, Py_ssize_t size)
2120{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002121 char header[9];
2122 Py_ssize_t len;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002123
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002124 if (size <= 0xff && self->proto >= 4) {
2125 header[0] = SHORT_BINUNICODE;
2126 header[1] = (unsigned char)(size & 0xff);
2127 len = 2;
2128 }
2129 else if (size <= 0xffffffffUL) {
2130 header[0] = BINUNICODE;
2131 header[1] = (unsigned char)(size & 0xff);
2132 header[2] = (unsigned char)((size >> 8) & 0xff);
2133 header[3] = (unsigned char)((size >> 16) & 0xff);
2134 header[4] = (unsigned char)((size >> 24) & 0xff);
2135 len = 5;
2136 }
2137 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002138 header[0] = BINUNICODE8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002139 _write_size64(header + 1, size);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002140 len = 9;
2141 }
2142 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002143 PyErr_SetString(PyExc_OverflowError,
Antoine Pitrou4b7b0f02013-04-07 23:46:52 +02002144 "cannot serialize a string larger than 4GiB");
Antoine Pitrou299978d2013-04-07 17:38:11 +02002145 return -1;
2146 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002147
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002148 if (_Pickler_Write(self, header, len) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002149 return -1;
Antoine Pitrou299978d2013-04-07 17:38:11 +02002150 if (_Pickler_Write(self, data, size) < 0)
2151 return -1;
2152
2153 return 0;
2154}
2155
2156static int
2157write_unicode_binary(PicklerObject *self, PyObject *obj)
2158{
2159 PyObject *encoded = NULL;
2160 Py_ssize_t size;
2161 char *data;
2162 int r;
2163
2164 if (PyUnicode_READY(obj))
2165 return -1;
2166
2167 data = PyUnicode_AsUTF8AndSize(obj, &size);
2168 if (data != NULL)
2169 return write_utf8(self, data, size);
2170
2171 /* Issue #8383: for strings with lone surrogates, fallback on the
2172 "surrogatepass" error handler. */
2173 PyErr_Clear();
2174 encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
2175 if (encoded == NULL)
2176 return -1;
2177
2178 r = write_utf8(self, PyBytes_AS_STRING(encoded),
2179 PyBytes_GET_SIZE(encoded));
2180 Py_DECREF(encoded);
2181 return r;
2182}
2183
2184static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002185save_unicode(PicklerObject *self, PyObject *obj)
2186{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002187 if (self->bin) {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002188 if (write_unicode_binary(self, obj) < 0)
2189 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002190 }
2191 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002192 PyObject *encoded;
2193 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002194 const char unicode_op = UNICODE;
2195
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002196 encoded = raw_unicode_escape(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002197 if (encoded == NULL)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002198 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002199
Antoine Pitrou299978d2013-04-07 17:38:11 +02002200 if (_Pickler_Write(self, &unicode_op, 1) < 0) {
2201 Py_DECREF(encoded);
2202 return -1;
2203 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002204
2205 size = PyBytes_GET_SIZE(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002206 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
2207 Py_DECREF(encoded);
2208 return -1;
2209 }
2210 Py_DECREF(encoded);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002211
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002212 if (_Pickler_Write(self, "\n", 1) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002213 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002214 }
2215 if (memo_put(self, obj) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002216 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002217
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002218 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002219}
2220
2221/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
2222static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002223store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002224{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002225 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002226
2227 assert(PyTuple_Size(t) == len);
2228
2229 for (i = 0; i < len; i++) {
2230 PyObject *element = PyTuple_GET_ITEM(t, i);
2231
2232 if (element == NULL)
2233 return -1;
2234 if (save(self, element, 0) < 0)
2235 return -1;
2236 }
2237
2238 return 0;
2239}
2240
2241/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2242 * used across protocols to minimize the space needed to pickle them.
2243 * Tuples are also the only builtin immutable type that can be recursive
2244 * (a tuple can be reached from itself), and that requires some subtle
2245 * magic so that it works in all cases. IOW, this is a long routine.
2246 */
2247static int
2248save_tuple(PicklerObject *self, PyObject *obj)
2249{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002250 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002251
2252 const char mark_op = MARK;
2253 const char tuple_op = TUPLE;
2254 const char pop_op = POP;
2255 const char pop_mark_op = POP_MARK;
2256 const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2257
2258 if ((len = PyTuple_Size(obj)) < 0)
2259 return -1;
2260
2261 if (len == 0) {
2262 char pdata[2];
2263
2264 if (self->proto) {
2265 pdata[0] = EMPTY_TUPLE;
2266 len = 1;
2267 }
2268 else {
2269 pdata[0] = MARK;
2270 pdata[1] = TUPLE;
2271 len = 2;
2272 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002273 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002274 return -1;
2275 return 0;
2276 }
2277
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002278 /* The tuple isn't in the memo now. If it shows up there after
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002279 * saving the tuple elements, the tuple must be recursive, in
2280 * which case we'll pop everything we put on the stack, and fetch
2281 * its value from the memo.
2282 */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002283 if (len <= 3 && self->proto >= 2) {
2284 /* Use TUPLE{1,2,3} opcodes. */
2285 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002286 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002287
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002288 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002289 /* pop the len elements */
2290 for (i = 0; i < len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002291 if (_Pickler_Write(self, &pop_op, 1) < 0)
2292 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002293 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002294 if (memo_get(self, obj) < 0)
2295 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002296
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002297 return 0;
2298 }
2299 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002300 if (_Pickler_Write(self, len2opcode + len, 1) < 0)
2301 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002302 }
2303 goto memoize;
2304 }
2305
2306 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2307 * Generate MARK e1 e2 ... TUPLE
2308 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002309 if (_Pickler_Write(self, &mark_op, 1) < 0)
2310 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002311
2312 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002313 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002314
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002315 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002316 /* pop the stack stuff we pushed */
2317 if (self->bin) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002318 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2319 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002320 }
2321 else {
2322 /* Note that we pop one more than len, to remove
2323 * the MARK too.
2324 */
2325 for (i = 0; i <= len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002326 if (_Pickler_Write(self, &pop_op, 1) < 0)
2327 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002328 }
2329 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002330 if (memo_get(self, obj) < 0)
2331 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002332
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002333 return 0;
2334 }
2335 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002336 if (_Pickler_Write(self, &tuple_op, 1) < 0)
2337 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002338 }
2339
2340 memoize:
2341 if (memo_put(self, obj) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002342 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002343
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002344 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002345}
2346
2347/* iter is an iterator giving items, and we batch up chunks of
2348 * MARK item item ... item APPENDS
2349 * opcode sequences. Calling code should have arranged to first create an
2350 * empty list, or list-like object, for the APPENDS to operate on.
2351 * Returns 0 on success, <0 on error.
2352 */
2353static int
2354batch_list(PicklerObject *self, PyObject *iter)
2355{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002356 PyObject *obj = NULL;
2357 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002358 int i, n;
2359
2360 const char mark_op = MARK;
2361 const char append_op = APPEND;
2362 const char appends_op = APPENDS;
2363
2364 assert(iter != NULL);
2365
2366 /* XXX: I think this function could be made faster by avoiding the
2367 iterator interface and fetching objects directly from list using
2368 PyList_GET_ITEM.
2369 */
2370
2371 if (self->proto == 0) {
2372 /* APPENDS isn't available; do one at a time. */
2373 for (;;) {
2374 obj = PyIter_Next(iter);
2375 if (obj == NULL) {
2376 if (PyErr_Occurred())
2377 return -1;
2378 break;
2379 }
2380 i = save(self, obj, 0);
2381 Py_DECREF(obj);
2382 if (i < 0)
2383 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002384 if (_Pickler_Write(self, &append_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002385 return -1;
2386 }
2387 return 0;
2388 }
2389
2390 /* proto > 0: write in batches of BATCHSIZE. */
2391 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002392 /* Get first item */
2393 firstitem = PyIter_Next(iter);
2394 if (firstitem == NULL) {
2395 if (PyErr_Occurred())
2396 goto error;
2397
2398 /* nothing more to add */
2399 break;
2400 }
2401
2402 /* Try to get a second item */
2403 obj = PyIter_Next(iter);
2404 if (obj == NULL) {
2405 if (PyErr_Occurred())
2406 goto error;
2407
2408 /* Only one item to write */
2409 if (save(self, firstitem, 0) < 0)
2410 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002411 if (_Pickler_Write(self, &append_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002412 goto error;
2413 Py_CLEAR(firstitem);
2414 break;
2415 }
2416
2417 /* More than one item to write */
2418
2419 /* Pump out MARK, items, APPENDS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002420 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002421 goto error;
2422
2423 if (save(self, firstitem, 0) < 0)
2424 goto error;
2425 Py_CLEAR(firstitem);
2426 n = 1;
2427
2428 /* Fetch and save up to BATCHSIZE items */
2429 while (obj) {
2430 if (save(self, obj, 0) < 0)
2431 goto error;
2432 Py_CLEAR(obj);
2433 n += 1;
2434
2435 if (n == BATCHSIZE)
2436 break;
2437
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002438 obj = PyIter_Next(iter);
2439 if (obj == NULL) {
2440 if (PyErr_Occurred())
2441 goto error;
2442 break;
2443 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002444 }
2445
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002446 if (_Pickler_Write(self, &appends_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002447 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002448
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002449 } while (n == BATCHSIZE);
2450 return 0;
2451
2452 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002453 Py_XDECREF(firstitem);
2454 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002455 return -1;
2456}
2457
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002458/* This is a variant of batch_list() above, specialized for lists (with no
2459 * support for list subclasses). Like batch_list(), we batch up chunks of
2460 * MARK item item ... item APPENDS
2461 * opcode sequences. Calling code should have arranged to first create an
2462 * empty list, or list-like object, for the APPENDS to operate on.
2463 * Returns 0 on success, -1 on error.
2464 *
2465 * This version is considerably faster than batch_list(), if less general.
2466 *
2467 * Note that this only works for protocols > 0.
2468 */
2469static int
2470batch_list_exact(PicklerObject *self, PyObject *obj)
2471{
2472 PyObject *item = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002473 Py_ssize_t this_batch, total;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002474
2475 const char append_op = APPEND;
2476 const char appends_op = APPENDS;
2477 const char mark_op = MARK;
2478
2479 assert(obj != NULL);
2480 assert(self->proto > 0);
2481 assert(PyList_CheckExact(obj));
2482
2483 if (PyList_GET_SIZE(obj) == 1) {
2484 item = PyList_GET_ITEM(obj, 0);
2485 if (save(self, item, 0) < 0)
2486 return -1;
2487 if (_Pickler_Write(self, &append_op, 1) < 0)
2488 return -1;
2489 return 0;
2490 }
2491
2492 /* Write in batches of BATCHSIZE. */
2493 total = 0;
2494 do {
2495 this_batch = 0;
2496 if (_Pickler_Write(self, &mark_op, 1) < 0)
2497 return -1;
2498 while (total < PyList_GET_SIZE(obj)) {
2499 item = PyList_GET_ITEM(obj, total);
2500 if (save(self, item, 0) < 0)
2501 return -1;
2502 total++;
2503 if (++this_batch == BATCHSIZE)
2504 break;
2505 }
2506 if (_Pickler_Write(self, &appends_op, 1) < 0)
2507 return -1;
2508
2509 } while (total < PyList_GET_SIZE(obj));
2510
2511 return 0;
2512}
2513
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002514static int
2515save_list(PicklerObject *self, PyObject *obj)
2516{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002517 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002518 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002519 int status = 0;
2520
2521 if (self->fast && !fast_save_enter(self, obj))
2522 goto error;
2523
2524 /* Create an empty list. */
2525 if (self->bin) {
2526 header[0] = EMPTY_LIST;
2527 len = 1;
2528 }
2529 else {
2530 header[0] = MARK;
2531 header[1] = LIST;
2532 len = 2;
2533 }
2534
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002535 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002536 goto error;
2537
2538 /* Get list length, and bow out early if empty. */
2539 if ((len = PyList_Size(obj)) < 0)
2540 goto error;
2541
2542 if (memo_put(self, obj) < 0)
2543 goto error;
2544
2545 if (len != 0) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002546 /* Materialize the list elements. */
2547 if (PyList_CheckExact(obj) && self->proto > 0) {
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002548 if (Py_EnterRecursiveCall(" while pickling an object"))
2549 goto error;
2550 status = batch_list_exact(self, obj);
2551 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002552 } else {
2553 PyObject *iter = PyObject_GetIter(obj);
2554 if (iter == NULL)
2555 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002556
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002557 if (Py_EnterRecursiveCall(" while pickling an object")) {
2558 Py_DECREF(iter);
2559 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002560 }
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002561 status = batch_list(self, iter);
2562 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002563 Py_DECREF(iter);
2564 }
2565 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002566 if (0) {
2567 error:
2568 status = -1;
2569 }
2570
2571 if (self->fast && !fast_save_leave(self, obj))
2572 status = -1;
2573
2574 return status;
2575}
2576
2577/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
2578 * MARK key value ... key value SETITEMS
2579 * opcode sequences. Calling code should have arranged to first create an
2580 * empty dict, or dict-like object, for the SETITEMS to operate on.
2581 * Returns 0 on success, <0 on error.
2582 *
2583 * This is very much like batch_list(). The difference between saving
2584 * elements directly, and picking apart two-tuples, is so long-winded at
2585 * the C level, though, that attempts to combine these routines were too
2586 * ugly to bear.
2587 */
2588static int
2589batch_dict(PicklerObject *self, PyObject *iter)
2590{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002591 PyObject *obj = NULL;
2592 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002593 int i, n;
2594
2595 const char mark_op = MARK;
2596 const char setitem_op = SETITEM;
2597 const char setitems_op = SETITEMS;
2598
2599 assert(iter != NULL);
2600
2601 if (self->proto == 0) {
2602 /* SETITEMS isn't available; do one at a time. */
2603 for (;;) {
2604 obj = PyIter_Next(iter);
2605 if (obj == NULL) {
2606 if (PyErr_Occurred())
2607 return -1;
2608 break;
2609 }
2610 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2611 PyErr_SetString(PyExc_TypeError, "dict items "
2612 "iterator must return 2-tuples");
2613 return -1;
2614 }
2615 i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
2616 if (i >= 0)
2617 i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
2618 Py_DECREF(obj);
2619 if (i < 0)
2620 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002621 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002622 return -1;
2623 }
2624 return 0;
2625 }
2626
2627 /* proto > 0: write in batches of BATCHSIZE. */
2628 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002629 /* Get first item */
2630 firstitem = PyIter_Next(iter);
2631 if (firstitem == NULL) {
2632 if (PyErr_Occurred())
2633 goto error;
2634
2635 /* nothing more to add */
2636 break;
2637 }
2638 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
2639 PyErr_SetString(PyExc_TypeError, "dict items "
2640 "iterator must return 2-tuples");
2641 goto error;
2642 }
2643
2644 /* Try to get a second item */
2645 obj = PyIter_Next(iter);
2646 if (obj == NULL) {
2647 if (PyErr_Occurred())
2648 goto error;
2649
2650 /* Only one item to write */
2651 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2652 goto error;
2653 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2654 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002655 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002656 goto error;
2657 Py_CLEAR(firstitem);
2658 break;
2659 }
2660
2661 /* More than one item to write */
2662
2663 /* Pump out MARK, items, SETITEMS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002664 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002665 goto error;
2666
2667 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
2668 goto error;
2669 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
2670 goto error;
2671 Py_CLEAR(firstitem);
2672 n = 1;
2673
2674 /* Fetch and save up to BATCHSIZE items */
2675 while (obj) {
2676 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
2677 PyErr_SetString(PyExc_TypeError, "dict items "
2678 "iterator must return 2-tuples");
2679 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002680 }
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002681 if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
2682 save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0)
2683 goto error;
2684 Py_CLEAR(obj);
2685 n += 1;
2686
2687 if (n == BATCHSIZE)
2688 break;
2689
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002690 obj = PyIter_Next(iter);
2691 if (obj == NULL) {
2692 if (PyErr_Occurred())
2693 goto error;
2694 break;
2695 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002696 }
2697
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002698 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002699 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002700
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002701 } while (n == BATCHSIZE);
2702 return 0;
2703
2704 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002705 Py_XDECREF(firstitem);
2706 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002707 return -1;
2708}
2709
Collin Winter5c9b02d2009-05-25 05:43:30 +00002710/* This is a variant of batch_dict() above that specializes for dicts, with no
2711 * support for dict subclasses. Like batch_dict(), we batch up chunks of
2712 * MARK key value ... key value SETITEMS
2713 * opcode sequences. Calling code should have arranged to first create an
2714 * empty dict, or dict-like object, for the SETITEMS to operate on.
2715 * Returns 0 on success, -1 on error.
2716 *
2717 * Note that this currently doesn't work for protocol 0.
2718 */
2719static int
2720batch_dict_exact(PicklerObject *self, PyObject *obj)
2721{
2722 PyObject *key = NULL, *value = NULL;
2723 int i;
2724 Py_ssize_t dict_size, ppos = 0;
2725
Alexandre Vassalottif70b1292009-05-25 18:00:52 +00002726 const char mark_op = MARK;
2727 const char setitem_op = SETITEM;
2728 const char setitems_op = SETITEMS;
Collin Winter5c9b02d2009-05-25 05:43:30 +00002729
2730 assert(obj != NULL);
2731 assert(self->proto > 0);
2732
2733 dict_size = PyDict_Size(obj);
2734
2735 /* Special-case len(d) == 1 to save space. */
2736 if (dict_size == 1) {
2737 PyDict_Next(obj, &ppos, &key, &value);
2738 if (save(self, key, 0) < 0)
2739 return -1;
2740 if (save(self, value, 0) < 0)
2741 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002742 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002743 return -1;
2744 return 0;
2745 }
2746
2747 /* Write in batches of BATCHSIZE. */
2748 do {
2749 i = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002750 if (_Pickler_Write(self, &mark_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002751 return -1;
2752 while (PyDict_Next(obj, &ppos, &key, &value)) {
2753 if (save(self, key, 0) < 0)
2754 return -1;
2755 if (save(self, value, 0) < 0)
2756 return -1;
2757 if (++i == BATCHSIZE)
2758 break;
2759 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002760 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00002761 return -1;
2762 if (PyDict_Size(obj) != dict_size) {
2763 PyErr_Format(
2764 PyExc_RuntimeError,
2765 "dictionary changed size during iteration");
2766 return -1;
2767 }
2768
2769 } while (i == BATCHSIZE);
2770 return 0;
2771}
2772
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002773static int
2774save_dict(PicklerObject *self, PyObject *obj)
2775{
2776 PyObject *items, *iter;
2777 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002778 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002779 int status = 0;
2780
2781 if (self->fast && !fast_save_enter(self, obj))
2782 goto error;
2783
2784 /* Create an empty dict. */
2785 if (self->bin) {
2786 header[0] = EMPTY_DICT;
2787 len = 1;
2788 }
2789 else {
2790 header[0] = MARK;
2791 header[1] = DICT;
2792 len = 2;
2793 }
2794
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002795 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002796 goto error;
2797
2798 /* Get dict size, and bow out early if empty. */
2799 if ((len = PyDict_Size(obj)) < 0)
2800 goto error;
2801
2802 if (memo_put(self, obj) < 0)
2803 goto error;
2804
2805 if (len != 0) {
2806 /* Save the dict items. */
Collin Winter5c9b02d2009-05-25 05:43:30 +00002807 if (PyDict_CheckExact(obj) && self->proto > 0) {
2808 /* We can take certain shortcuts if we know this is a dict and
2809 not a dict subclass. */
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002810 if (Py_EnterRecursiveCall(" while pickling an object"))
2811 goto error;
2812 status = batch_dict_exact(self, obj);
2813 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002814 } else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002815 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002816
2817 items = _PyObject_CallMethodId(obj, &PyId_items, "()");
Collin Winter5c9b02d2009-05-25 05:43:30 +00002818 if (items == NULL)
2819 goto error;
2820 iter = PyObject_GetIter(items);
2821 Py_DECREF(items);
2822 if (iter == NULL)
2823 goto error;
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002824 if (Py_EnterRecursiveCall(" while pickling an object")) {
2825 Py_DECREF(iter);
2826 goto error;
2827 }
Collin Winter5c9b02d2009-05-25 05:43:30 +00002828 status = batch_dict(self, iter);
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00002829 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00002830 Py_DECREF(iter);
2831 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002832 }
2833
2834 if (0) {
2835 error:
2836 status = -1;
2837 }
2838
2839 if (self->fast && !fast_save_leave(self, obj))
2840 status = -1;
2841
2842 return status;
2843}
2844
2845static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002846save_set(PicklerObject *self, PyObject *obj)
2847{
2848 PyObject *item;
2849 int i;
2850 Py_ssize_t set_size, ppos = 0;
2851 Py_hash_t hash;
2852
2853 const char empty_set_op = EMPTY_SET;
2854 const char mark_op = MARK;
2855 const char additems_op = ADDITEMS;
2856
2857 if (self->proto < 4) {
2858 PyObject *items;
2859 PyObject *reduce_value;
2860 int status;
2861
2862 items = PySequence_List(obj);
2863 if (items == NULL) {
2864 return -1;
2865 }
2866 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
2867 Py_DECREF(items);
2868 if (reduce_value == NULL) {
2869 return -1;
2870 }
2871 /* save_reduce() will memoize the object automatically. */
2872 status = save_reduce(self, reduce_value, obj);
2873 Py_DECREF(reduce_value);
2874 return status;
2875 }
2876
2877 if (_Pickler_Write(self, &empty_set_op, 1) < 0)
2878 return -1;
2879
2880 if (memo_put(self, obj) < 0)
2881 return -1;
2882
2883 set_size = PySet_GET_SIZE(obj);
2884 if (set_size == 0)
2885 return 0; /* nothing to do */
2886
2887 /* Write in batches of BATCHSIZE. */
2888 do {
2889 i = 0;
2890 if (_Pickler_Write(self, &mark_op, 1) < 0)
2891 return -1;
2892 while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
2893 if (save(self, item, 0) < 0)
2894 return -1;
2895 if (++i == BATCHSIZE)
2896 break;
2897 }
2898 if (_Pickler_Write(self, &additems_op, 1) < 0)
2899 return -1;
2900 if (PySet_GET_SIZE(obj) != set_size) {
2901 PyErr_Format(
2902 PyExc_RuntimeError,
2903 "set changed size during iteration");
2904 return -1;
2905 }
2906 } while (i == BATCHSIZE);
2907
2908 return 0;
2909}
2910
2911static int
2912save_frozenset(PicklerObject *self, PyObject *obj)
2913{
2914 PyObject *iter;
2915
2916 const char mark_op = MARK;
2917 const char frozenset_op = FROZENSET;
2918
2919 if (self->fast && !fast_save_enter(self, obj))
2920 return -1;
2921
2922 if (self->proto < 4) {
2923 PyObject *items;
2924 PyObject *reduce_value;
2925 int status;
2926
2927 items = PySequence_List(obj);
2928 if (items == NULL) {
2929 return -1;
2930 }
2931 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
2932 items);
2933 Py_DECREF(items);
2934 if (reduce_value == NULL) {
2935 return -1;
2936 }
2937 /* save_reduce() will memoize the object automatically. */
2938 status = save_reduce(self, reduce_value, obj);
2939 Py_DECREF(reduce_value);
2940 return status;
2941 }
2942
2943 if (_Pickler_Write(self, &mark_op, 1) < 0)
2944 return -1;
2945
2946 iter = PyObject_GetIter(obj);
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002947 if (iter == NULL) {
Christian Heimes74d8d632013-11-23 21:05:31 +01002948 return -1;
Christian Heimesb3d3ee42013-11-23 21:01:40 +01002949 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002950 for (;;) {
2951 PyObject *item;
2952
2953 item = PyIter_Next(iter);
2954 if (item == NULL) {
2955 if (PyErr_Occurred()) {
2956 Py_DECREF(iter);
2957 return -1;
2958 }
2959 break;
2960 }
2961 if (save(self, item, 0) < 0) {
2962 Py_DECREF(item);
2963 Py_DECREF(iter);
2964 return -1;
2965 }
2966 Py_DECREF(item);
2967 }
2968 Py_DECREF(iter);
2969
2970 /* If the object is already in the memo, this means it is
2971 recursive. In this case, throw away everything we put on the
2972 stack, and fetch the object back from the memo. */
2973 if (PyMemoTable_Get(self->memo, obj)) {
2974 const char pop_mark_op = POP_MARK;
2975
2976 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2977 return -1;
2978 if (memo_get(self, obj) < 0)
2979 return -1;
2980 return 0;
2981 }
2982
2983 if (_Pickler_Write(self, &frozenset_op, 1) < 0)
2984 return -1;
2985 if (memo_put(self, obj) < 0)
2986 return -1;
2987
2988 return 0;
2989}
2990
2991static int
2992fix_imports(PyObject **module_name, PyObject **global_name)
2993{
2994 PyObject *key;
2995 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002996 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002997
2998 key = PyTuple_Pack(2, *module_name, *global_name);
2999 if (key == NULL)
3000 return -1;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003001 item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003002 Py_DECREF(key);
3003 if (item) {
3004 PyObject *fixed_module_name;
3005 PyObject *fixed_global_name;
3006
3007 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
3008 PyErr_Format(PyExc_RuntimeError,
3009 "_compat_pickle.REVERSE_NAME_MAPPING values "
3010 "should be 2-tuples, not %.200s",
3011 Py_TYPE(item)->tp_name);
3012 return -1;
3013 }
3014 fixed_module_name = PyTuple_GET_ITEM(item, 0);
3015 fixed_global_name = PyTuple_GET_ITEM(item, 1);
3016 if (!PyUnicode_Check(fixed_module_name) ||
3017 !PyUnicode_Check(fixed_global_name)) {
3018 PyErr_Format(PyExc_RuntimeError,
3019 "_compat_pickle.REVERSE_NAME_MAPPING values "
3020 "should be pairs of str, not (%.200s, %.200s)",
3021 Py_TYPE(fixed_module_name)->tp_name,
3022 Py_TYPE(fixed_global_name)->tp_name);
3023 return -1;
3024 }
3025
3026 Py_CLEAR(*module_name);
3027 Py_CLEAR(*global_name);
3028 Py_INCREF(fixed_module_name);
3029 Py_INCREF(fixed_global_name);
3030 *module_name = fixed_module_name;
3031 *global_name = fixed_global_name;
3032 }
3033 else if (PyErr_Occurred()) {
3034 return -1;
3035 }
3036
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003037 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003038 if (item) {
3039 if (!PyUnicode_Check(item)) {
3040 PyErr_Format(PyExc_RuntimeError,
3041 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3042 "should be strings, not %.200s",
3043 Py_TYPE(item)->tp_name);
3044 return -1;
3045 }
3046 Py_CLEAR(*module_name);
3047 Py_INCREF(item);
3048 *module_name = item;
3049 }
3050 else if (PyErr_Occurred()) {
3051 return -1;
3052 }
3053
3054 return 0;
3055}
3056
3057static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003058save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3059{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003060 PyObject *global_name = NULL;
3061 PyObject *module_name = NULL;
3062 PyObject *module = NULL;
3063 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003064 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003065 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003066 _Py_IDENTIFIER(__name__);
3067 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003068
3069 const char global_op = GLOBAL;
3070
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003071 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003072 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003073 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003074 }
3075 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003076 if (self->proto >= 4) {
3077 global_name = _PyObject_GetAttrId(obj, &PyId___qualname__);
3078 if (global_name == NULL) {
3079 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3080 goto error;
3081 PyErr_Clear();
3082 }
3083 }
3084 if (global_name == NULL) {
3085 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3086 if (global_name == NULL)
3087 goto error;
3088 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003089 }
3090
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003091 module_name = whichmodule(obj, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003092 if (module_name == NULL)
3093 goto error;
3094
3095 /* XXX: Change to use the import C API directly with level=0 to disallow
3096 relative imports.
3097
3098 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3099 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3100 custom import functions (IMHO, this would be a nice security
3101 feature). The import C API would need to be extended to support the
3102 extra parameters of __import__ to fix that. */
3103 module = PyImport_Import(module_name);
3104 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003105 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003106 "Can't pickle %R: import of module %R failed",
3107 obj, module_name);
3108 goto error;
3109 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003110 cls = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003111 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003112 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003113 "Can't pickle %R: attribute lookup %S on %S failed",
3114 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003115 goto error;
3116 }
3117 if (cls != obj) {
3118 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003119 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003120 "Can't pickle %R: it's not the same object as %S.%S",
3121 obj, module_name, global_name);
3122 goto error;
3123 }
3124 Py_DECREF(cls);
3125
3126 if (self->proto >= 2) {
3127 /* See whether this is in the extension registry, and if
3128 * so generate an EXT opcode.
3129 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003130 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003131 PyObject *code_obj; /* extension code as Python object */
3132 long code; /* extension code as C value */
3133 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003134 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003135
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003136 extension_key = PyTuple_Pack(2, module_name, global_name);
3137 if (extension_key == NULL) {
3138 goto error;
3139 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003140 code_obj = PyDict_GetItemWithError(st->extension_registry,
3141 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003142 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003143 /* The object is not registered in the extension registry.
3144 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003145 if (code_obj == NULL) {
3146 if (PyErr_Occurred()) {
3147 goto error;
3148 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003149 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003150 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003151
3152 /* XXX: pickle.py doesn't check neither the type, nor the range
3153 of the value returned by the extension_registry. It should for
3154 consistency. */
3155
3156 /* Verify code_obj has the right type and value. */
3157 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003158 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003159 "Can't pickle %R: extension code %R isn't an integer",
3160 obj, code_obj);
3161 goto error;
3162 }
3163 code = PyLong_AS_LONG(code_obj);
3164 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003165 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003166 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3167 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003168 goto error;
3169 }
3170
3171 /* Generate an EXT opcode. */
3172 if (code <= 0xff) {
3173 pdata[0] = EXT1;
3174 pdata[1] = (unsigned char)code;
3175 n = 2;
3176 }
3177 else if (code <= 0xffff) {
3178 pdata[0] = EXT2;
3179 pdata[1] = (unsigned char)(code & 0xff);
3180 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3181 n = 3;
3182 }
3183 else {
3184 pdata[0] = EXT4;
3185 pdata[1] = (unsigned char)(code & 0xff);
3186 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3187 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3188 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3189 n = 5;
3190 }
3191
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003192 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003193 goto error;
3194 }
3195 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003196 gen_global:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003197 if (self->proto >= 4) {
3198 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003199
Christian Heimese8b1ba12013-11-23 21:13:39 +01003200 if (save(self, module_name, 0) < 0)
3201 goto error;
3202 if (save(self, global_name, 0) < 0)
3203 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003204
3205 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3206 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003207 }
3208 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003209 /* Generate a normal global opcode if we are using a pickle
3210 protocol < 4, or if the object is not registered in the
3211 extension registry. */
3212 PyObject *encoded;
3213 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003214
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003215 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003216 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003217
3218 /* For protocol < 3 and if the user didn't request against doing
3219 so, we convert module names to the old 2.x module names. */
3220 if (self->proto < 3 && self->fix_imports) {
3221 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003222 goto error;
3223 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003224 }
3225
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003226 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3227 both the module name and the global name using UTF-8. We do so
3228 only when we are using the pickle protocol newer than version
3229 3. This is to ensure compatibility with older Unpickler running
3230 on Python 2.x. */
3231 if (self->proto == 3) {
3232 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003233 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003234 else {
3235 unicode_encoder = PyUnicode_AsASCIIString;
3236 }
3237 encoded = unicode_encoder(module_name);
3238 if (encoded == NULL) {
3239 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003240 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003241 "can't pickle module identifier '%S' using "
3242 "pickle protocol %i",
3243 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003244 goto error;
3245 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003246 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3247 PyBytes_GET_SIZE(encoded)) < 0) {
3248 Py_DECREF(encoded);
3249 goto error;
3250 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003251 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003252 if(_Pickler_Write(self, "\n", 1) < 0)
3253 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003254
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003255 /* Save the name of the module. */
3256 encoded = unicode_encoder(global_name);
3257 if (encoded == NULL) {
3258 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003259 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003260 "can't pickle global identifier '%S' using "
3261 "pickle protocol %i",
3262 global_name, self->proto);
3263 goto error;
3264 }
3265 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3266 PyBytes_GET_SIZE(encoded)) < 0) {
3267 Py_DECREF(encoded);
3268 goto error;
3269 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003270 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003271 if (_Pickler_Write(self, "\n", 1) < 0)
3272 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003273 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003274 /* Memoize the object. */
3275 if (memo_put(self, obj) < 0)
3276 goto error;
3277 }
3278
3279 if (0) {
3280 error:
3281 status = -1;
3282 }
3283 Py_XDECREF(module_name);
3284 Py_XDECREF(global_name);
3285 Py_XDECREF(module);
3286
3287 return status;
3288}
3289
3290static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003291save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3292{
3293 PyObject *reduce_value;
3294 int status;
3295
3296 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3297 if (reduce_value == NULL) {
3298 return -1;
3299 }
3300 status = save_reduce(self, reduce_value, obj);
3301 Py_DECREF(reduce_value);
3302 return status;
3303}
3304
3305static int
3306save_type(PicklerObject *self, PyObject *obj)
3307{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003308 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003309 return save_singleton_type(self, obj, Py_None);
3310 }
3311 else if (obj == (PyObject *)&PyEllipsis_Type) {
3312 return save_singleton_type(self, obj, Py_Ellipsis);
3313 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003314 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003315 return save_singleton_type(self, obj, Py_NotImplemented);
3316 }
3317 return save_global(self, obj, NULL);
3318}
3319
3320static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003321save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
3322{
3323 PyObject *pid = NULL;
3324 int status = 0;
3325
3326 const char persid_op = PERSID;
3327 const char binpersid_op = BINPERSID;
3328
3329 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003330 pid = _Pickle_FastCall(func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003331 if (pid == NULL)
3332 return -1;
3333
3334 if (pid != Py_None) {
3335 if (self->bin) {
3336 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003337 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003338 goto error;
3339 }
3340 else {
3341 PyObject *pid_str = NULL;
3342 char *pid_ascii_bytes;
3343 Py_ssize_t size;
3344
3345 pid_str = PyObject_Str(pid);
3346 if (pid_str == NULL)
3347 goto error;
3348
3349 /* XXX: Should it check whether the persistent id only contains
3350 ASCII characters? And what if the pid contains embedded
3351 newlines? */
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00003352 pid_ascii_bytes = _PyUnicode_AsStringAndSize(pid_str, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003353 Py_DECREF(pid_str);
3354 if (pid_ascii_bytes == NULL)
3355 goto error;
3356
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003357 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
3358 _Pickler_Write(self, pid_ascii_bytes, size) < 0 ||
3359 _Pickler_Write(self, "\n", 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003360 goto error;
3361 }
3362 status = 1;
3363 }
3364
3365 if (0) {
3366 error:
3367 status = -1;
3368 }
3369 Py_XDECREF(pid);
3370
3371 return status;
3372}
3373
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003374static PyObject *
3375get_class(PyObject *obj)
3376{
3377 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003378 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003379
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003380 cls = _PyObject_GetAttrId(obj, &PyId___class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003381 if (cls == NULL) {
3382 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3383 PyErr_Clear();
3384 cls = (PyObject *) Py_TYPE(obj);
3385 Py_INCREF(cls);
3386 }
3387 }
3388 return cls;
3389}
3390
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003391/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3392 * appropriate __reduce__ method for obj.
3393 */
3394static int
3395save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3396{
3397 PyObject *callable;
3398 PyObject *argtup;
3399 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003400 PyObject *listitems = Py_None;
3401 PyObject *dictitems = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003402 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003403 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003404 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003405
3406 const char reduce_op = REDUCE;
3407 const char build_op = BUILD;
3408 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003409 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003410
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003411 size = PyTuple_Size(args);
3412 if (size < 2 || size > 5) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003413 PyErr_SetString(st->PicklingError, "tuple returned by "
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003414 "__reduce__ must contain 2 through 5 elements");
3415 return -1;
3416 }
3417
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003418 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
3419 &callable, &argtup, &state, &listitems, &dictitems))
3420 return -1;
3421
3422 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003423 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003424 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003425 return -1;
3426 }
3427 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003428 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003429 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003430 return -1;
3431 }
3432
3433 if (state == Py_None)
3434 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003435
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003436 if (listitems == Py_None)
3437 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003438 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003439 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003440 "returned by __reduce__ must be an iterator, not %s",
3441 Py_TYPE(listitems)->tp_name);
3442 return -1;
3443 }
3444
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003445 if (dictitems == Py_None)
3446 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003447 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003448 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003449 "returned by __reduce__ must be an iterator, not %s",
3450 Py_TYPE(dictitems)->tp_name);
3451 return -1;
3452 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003453
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003454 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003455 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003456 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003457
Victor Stinner804e05e2013-11-14 01:26:17 +01003458 name = _PyObject_GetAttrId(callable, &PyId___name__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003459 if (name == NULL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003460 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003461 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003462 }
3463 PyErr_Clear();
3464 }
3465 else if (self->proto >= 4) {
3466 _Py_IDENTIFIER(__newobj_ex__);
3467 use_newobj_ex = PyUnicode_Check(name) &&
3468 PyUnicode_Compare(
3469 name, _PyUnicode_FromId(&PyId___newobj_ex__)) == 0;
3470 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003471 }
3472 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003473 _Py_IDENTIFIER(__newobj__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003474 use_newobj = PyUnicode_Check(name) &&
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003475 PyUnicode_Compare(
3476 name, _PyUnicode_FromId(&PyId___newobj__)) == 0;
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003477 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003478 }
3479 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003480
3481 if (use_newobj_ex) {
3482 PyObject *cls;
3483 PyObject *args;
3484 PyObject *kwargs;
3485
3486 if (Py_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003487 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003488 "length of the NEWOBJ_EX argument tuple must be "
3489 "exactly 3, not %zd", Py_SIZE(argtup));
3490 return -1;
3491 }
3492
3493 cls = PyTuple_GET_ITEM(argtup, 0);
3494 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003495 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003496 "first item from NEWOBJ_EX argument tuple must "
3497 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
3498 return -1;
3499 }
3500 args = PyTuple_GET_ITEM(argtup, 1);
3501 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003502 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003503 "second item from NEWOBJ_EX argument tuple must "
3504 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
3505 return -1;
3506 }
3507 kwargs = PyTuple_GET_ITEM(argtup, 2);
3508 if (!PyDict_Check(kwargs)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003509 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003510 "third item from NEWOBJ_EX argument tuple must "
3511 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
3512 return -1;
3513 }
3514
3515 if (save(self, cls, 0) < 0 ||
3516 save(self, args, 0) < 0 ||
3517 save(self, kwargs, 0) < 0 ||
3518 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
3519 return -1;
3520 }
3521 }
3522 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003523 PyObject *cls;
3524 PyObject *newargtup;
3525 PyObject *obj_class;
3526 int p;
3527
3528 /* Sanity checks. */
3529 if (Py_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003530 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003531 return -1;
3532 }
3533
3534 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003535 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003536 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003537 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003538 return -1;
3539 }
3540
3541 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003542 obj_class = get_class(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003543 p = obj_class != cls; /* true iff a problem */
3544 Py_DECREF(obj_class);
3545 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003546 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003547 "__newobj__ args has the wrong class");
3548 return -1;
3549 }
3550 }
3551 /* XXX: These calls save() are prone to infinite recursion. Imagine
3552 what happen if the value returned by the __reduce__() method of
3553 some extension type contains another object of the same type. Ouch!
3554
3555 Here is a quick example, that I ran into, to illustrate what I
3556 mean:
3557
3558 >>> import pickle, copyreg
3559 >>> copyreg.dispatch_table.pop(complex)
3560 >>> pickle.dumps(1+2j)
3561 Traceback (most recent call last):
3562 ...
3563 RuntimeError: maximum recursion depth exceeded
3564
3565 Removing the complex class from copyreg.dispatch_table made the
3566 __reduce_ex__() method emit another complex object:
3567
3568 >>> (1+1j).__reduce_ex__(2)
3569 (<function __newobj__ at 0xb7b71c3c>,
3570 (<class 'complex'>, (1+1j)), None, None, None)
3571
3572 Thus when save() was called on newargstup (the 2nd item) recursion
3573 ensued. Of course, the bug was in the complex class which had a
3574 broken __getnewargs__() that emitted another complex object. But,
3575 the point, here, is it is quite easy to end up with a broken reduce
3576 function. */
3577
3578 /* Save the class and its __new__ arguments. */
3579 if (save(self, cls, 0) < 0)
3580 return -1;
3581
3582 newargtup = PyTuple_GetSlice(argtup, 1, Py_SIZE(argtup));
3583 if (newargtup == NULL)
3584 return -1;
3585
3586 p = save(self, newargtup, 0);
3587 Py_DECREF(newargtup);
3588 if (p < 0)
3589 return -1;
3590
3591 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003592 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003593 return -1;
3594 }
3595 else { /* Not using NEWOBJ. */
3596 if (save(self, callable, 0) < 0 ||
3597 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003598 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003599 return -1;
3600 }
3601
3602 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
3603 the caller do not want to memoize the object. Not particularly useful,
3604 but that is to mimic the behavior save_reduce() in pickle.py when
3605 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003606 if (obj != NULL) {
3607 /* If the object is already in the memo, this means it is
3608 recursive. In this case, throw away everything we put on the
3609 stack, and fetch the object back from the memo. */
3610 if (PyMemoTable_Get(self->memo, obj)) {
3611 const char pop_op = POP;
3612
3613 if (_Pickler_Write(self, &pop_op, 1) < 0)
3614 return -1;
3615 if (memo_get(self, obj) < 0)
3616 return -1;
3617
3618 return 0;
3619 }
3620 else if (memo_put(self, obj) < 0)
3621 return -1;
3622 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003623
3624 if (listitems && batch_list(self, listitems) < 0)
3625 return -1;
3626
3627 if (dictitems && batch_dict(self, dictitems) < 0)
3628 return -1;
3629
3630 if (state) {
Victor Stinner121aab42011-09-29 23:40:53 +02003631 if (save(self, state, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003632 _Pickler_Write(self, &build_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003633 return -1;
3634 }
3635
3636 return 0;
3637}
3638
3639static int
3640save(PicklerObject *self, PyObject *obj, int pers_save)
3641{
3642 PyTypeObject *type;
3643 PyObject *reduce_func = NULL;
3644 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003645 int status = 0;
3646
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003647 if (_Pickler_OpcodeBoundary(self) < 0)
3648 return -1;
3649
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003650 if (Py_EnterRecursiveCall(" while pickling an object"))
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003651 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003652
3653 /* The extra pers_save argument is necessary to avoid calling save_pers()
3654 on its returned object. */
3655 if (!pers_save && self->pers_func) {
3656 /* save_pers() returns:
3657 -1 to signal an error;
3658 0 if it did nothing successfully;
3659 1 if a persistent id was saved.
3660 */
3661 if ((status = save_pers(self, obj, self->pers_func)) != 0)
3662 goto done;
3663 }
3664
3665 type = Py_TYPE(obj);
3666
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003667 /* The old cPickle had an optimization that used switch-case statement
3668 dispatching on the first letter of the type name. This has was removed
3669 since benchmarks shown that this optimization was actually slowing
3670 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003671
3672 /* Atom types; these aren't memoized, so don't check the memo. */
3673
3674 if (obj == Py_None) {
3675 status = save_none(self, obj);
3676 goto done;
3677 }
3678 else if (obj == Py_False || obj == Py_True) {
3679 status = save_bool(self, obj);
3680 goto done;
3681 }
3682 else if (type == &PyLong_Type) {
3683 status = save_long(self, obj);
3684 goto done;
3685 }
3686 else if (type == &PyFloat_Type) {
3687 status = save_float(self, obj);
3688 goto done;
3689 }
3690
3691 /* Check the memo to see if it has the object. If so, generate
3692 a GET (or BINGET) opcode, instead of pickling the object
3693 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003694 if (PyMemoTable_Get(self->memo, obj)) {
3695 if (memo_get(self, obj) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003696 goto error;
3697 goto done;
3698 }
3699
3700 if (type == &PyBytes_Type) {
3701 status = save_bytes(self, obj);
3702 goto done;
3703 }
3704 else if (type == &PyUnicode_Type) {
3705 status = save_unicode(self, obj);
3706 goto done;
3707 }
3708 else if (type == &PyDict_Type) {
3709 status = save_dict(self, obj);
3710 goto done;
3711 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003712 else if (type == &PySet_Type) {
3713 status = save_set(self, obj);
3714 goto done;
3715 }
3716 else if (type == &PyFrozenSet_Type) {
3717 status = save_frozenset(self, obj);
3718 goto done;
3719 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003720 else if (type == &PyList_Type) {
3721 status = save_list(self, obj);
3722 goto done;
3723 }
3724 else if (type == &PyTuple_Type) {
3725 status = save_tuple(self, obj);
3726 goto done;
3727 }
3728 else if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003729 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003730 goto done;
3731 }
3732 else if (type == &PyFunction_Type) {
3733 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08003734 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003735 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003736
3737 /* XXX: This part needs some unit tests. */
3738
3739 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003740 * self.dispatch_table, copyreg.dispatch_table, the object's
3741 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003742 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003743 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003744 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003745 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
3746 (PyObject *)type);
3747 if (reduce_func == NULL) {
3748 if (PyErr_Occurred()) {
3749 goto error;
3750 }
3751 } else {
3752 /* PyDict_GetItemWithError() returns a borrowed reference.
3753 Increase the reference count to be consistent with
3754 PyObject_GetItem and _PyObject_GetAttrId used below. */
3755 Py_INCREF(reduce_func);
3756 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003757 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003758 reduce_func = PyObject_GetItem(self->dispatch_table,
3759 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003760 if (reduce_func == NULL) {
3761 if (PyErr_ExceptionMatches(PyExc_KeyError))
3762 PyErr_Clear();
3763 else
3764 goto error;
3765 }
3766 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003767 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003768 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003769 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003770 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02003771 else if (PyType_IsSubtype(type, &PyType_Type)) {
3772 status = save_global(self, obj, NULL);
3773 goto done;
3774 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003775 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003776 _Py_IDENTIFIER(__reduce__);
3777 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003778
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003779
3780 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
3781 automatically defined as __reduce__. While this is convenient, this
3782 make it impossible to know which method was actually called. Of
3783 course, this is not a big deal. But still, it would be nice to let
3784 the user know which method was called when something go
3785 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
3786 don't actually have to check for a __reduce__ method. */
3787
3788 /* Check for a __reduce_ex__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003789 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003790 if (reduce_func != NULL) {
3791 PyObject *proto;
3792 proto = PyLong_FromLong(self->proto);
3793 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003794 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003795 }
3796 }
3797 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003798 PickleState *st = _Pickle_GetGlobalState();
3799
3800 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003801 PyErr_Clear();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003802 }
3803 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003804 goto error;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003805 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003806 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003807 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003808 if (reduce_func != NULL) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003809 PyObject *empty_tuple = PyTuple_New(0);
3810 reduce_value = PyObject_Call(reduce_func, empty_tuple,
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003811 NULL);
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003812 Py_DECREF(empty_tuple);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003813 }
3814 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003815 PyErr_Format(st->PicklingError,
3816 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003817 type->tp_name, obj);
3818 goto error;
3819 }
3820 }
3821 }
3822
3823 if (reduce_value == NULL)
3824 goto error;
3825
3826 if (PyUnicode_Check(reduce_value)) {
3827 status = save_global(self, obj, reduce_value);
3828 goto done;
3829 }
3830
3831 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003832 PickleState *st = _Pickle_GetGlobalState();
3833 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003834 "__reduce__ must return a string or tuple");
3835 goto error;
3836 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003837
3838 status = save_reduce(self, reduce_value, obj);
3839
3840 if (0) {
3841 error:
3842 status = -1;
3843 }
3844 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003845
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003846 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003847 Py_XDECREF(reduce_func);
3848 Py_XDECREF(reduce_value);
3849
3850 return status;
3851}
3852
3853static int
3854dump(PicklerObject *self, PyObject *obj)
3855{
3856 const char stop_op = STOP;
3857
3858 if (self->proto >= 2) {
3859 char header[2];
3860
3861 header[0] = PROTO;
3862 assert(self->proto >= 0 && self->proto < 256);
3863 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003864 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003865 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003866 if (self->proto >= 4)
3867 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003868 }
3869
3870 if (save(self, obj, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003871 _Pickler_Write(self, &stop_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003872 return -1;
3873
3874 return 0;
3875}
3876
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003877/*[clinic]
3878
3879_pickle.Pickler.clear_memo
3880
3881 self: PicklerObject
3882
3883Clears the pickler's "memo".
3884
3885The memo is the data structure that remembers which objects the
3886pickler has already seen, so that shared or recursive objects are
3887pickled by reference and not by value. This method is useful when
3888re-using picklers.
3889[clinic]*/
3890
3891PyDoc_STRVAR(_pickle_Pickler_clear_memo__doc__,
3892"clear_memo()\n"
3893"Clears the pickler\'s \"memo\".\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003894"\n"
3895"The memo is the data structure that remembers which objects the\n"
3896"pickler has already seen, so that shared or recursive objects are\n"
3897"pickled by reference and not by value. This method is useful when\n"
3898"re-using picklers.");
3899
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003900#define _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF \
3901 {"clear_memo", (PyCFunction)_pickle_Pickler_clear_memo, METH_NOARGS, _pickle_Pickler_clear_memo__doc__},
3902
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003903static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003904_pickle_Pickler_clear_memo(PicklerObject *self)
3905/*[clinic checksum: 9c32be7e7a17ff82a81aae409d0d4f469033a5b2]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003906{
3907 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003908 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003909
3910 Py_RETURN_NONE;
3911}
3912
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003913/*[clinic]
3914
3915_pickle.Pickler.dump
3916
3917 self: PicklerObject
3918 obj: object
3919 /
3920
3921Write a pickled representation of the given object to the open file.
3922[clinic]*/
3923
3924PyDoc_STRVAR(_pickle_Pickler_dump__doc__,
3925"dump(obj)\n"
3926"Write a pickled representation of the given object to the open file.");
3927
3928#define _PICKLE_PICKLER_DUMP_METHODDEF \
3929 {"dump", (PyCFunction)_pickle_Pickler_dump, METH_O, _pickle_Pickler_dump__doc__},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003930
3931static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003932_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
3933/*[clinic checksum: b72a69ec98737fabf66dae7c5a3210178bdbd3e6]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003934{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003935 /* Check whether the Pickler was initialized correctly (issue3664).
3936 Developers often forget to call __init__() in their subclasses, which
3937 would trigger a segfault without this check. */
3938 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003939 PickleState *st = _Pickle_GetGlobalState();
3940 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003941 "Pickler.__init__() was not called by %s.__init__()",
3942 Py_TYPE(self)->tp_name);
3943 return NULL;
3944 }
3945
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003946 if (_Pickler_ClearBuffer(self) < 0)
3947 return NULL;
3948
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003949 if (dump(self, obj) < 0)
3950 return NULL;
3951
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003952 if (_Pickler_FlushToFile(self) < 0)
3953 return NULL;
3954
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003955 Py_RETURN_NONE;
3956}
3957
3958static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003959 _PICKLE_PICKLER_DUMP_METHODDEF
3960 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003961 {NULL, NULL} /* sentinel */
3962};
3963
3964static void
3965Pickler_dealloc(PicklerObject *self)
3966{
3967 PyObject_GC_UnTrack(self);
3968
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003969 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003970 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003971 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003972 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003973 Py_XDECREF(self->fast_memo);
3974
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003975 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003976
3977 Py_TYPE(self)->tp_free((PyObject *)self);
3978}
3979
3980static int
3981Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
3982{
3983 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003984 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003985 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003986 Py_VISIT(self->fast_memo);
3987 return 0;
3988}
3989
3990static int
3991Pickler_clear(PicklerObject *self)
3992{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003993 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003994 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003995 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003996 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003997 Py_CLEAR(self->fast_memo);
3998
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003999 if (self->memo != NULL) {
4000 PyMemoTable *memo = self->memo;
4001 self->memo = NULL;
4002 PyMemoTable_Del(memo);
4003 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004004 return 0;
4005}
4006
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004007
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004008/*[clinic]
4009
4010_pickle.Pickler.__init__
4011
4012 self: PicklerObject
4013 file: object
4014 protocol: object = NULL
4015 fix_imports: bool = True
4016
4017This takes a binary file for writing a pickle data stream.
4018
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004019The optional *protocol* argument tells the pickler to use the given
4020protocol; supported protocols are 0, 1, 2, 3 and 4. The default
4021protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004022
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004023Specifying a negative protocol version selects the highest protocol
4024version supported. The higher the protocol used, the more recent the
4025version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004026
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004027The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004028bytes argument. It can thus be a file object opened for binary
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004029writing, a io.BytesIO instance, or any other custom object that meets
4030this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004031
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004032If *fix_imports* is True and protocol is less than 3, pickle will try
4033to map the new Python 3 names to the old module names used in Python
40342, so that the pickle data stream is readable with Python 2.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004035[clinic]*/
4036
4037PyDoc_STRVAR(_pickle_Pickler___init____doc__,
4038"__init__(file, protocol=None, fix_imports=True)\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004039"This takes a binary file for writing a pickle data stream.\n"
4040"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004041"The optional *protocol* argument tells the pickler to use the given\n"
4042"protocol; supported protocols are 0, 1, 2, 3 and 4. The default\n"
4043"protocol is 3; a backward-incompatible protocol designed for Python 3.\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004044"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004045"Specifying a negative protocol version selects the highest protocol\n"
4046"version supported. The higher the protocol used, the more recent the\n"
4047"version of Python needed to read the pickle produced.\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004048"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004049"The *file* argument must have a write() method that accepts a single\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004050"bytes argument. It can thus be a file object opened for binary\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004051"writing, a io.BytesIO instance, or any other custom object that meets\n"
4052"this interface.\n"
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004053"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004054"If *fix_imports* is True and protocol is less than 3, pickle will try\n"
4055"to map the new Python 3 names to the old module names used in Python\n"
4056"2, so that the pickle data stream is readable with Python 2.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004057
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004058#define _PICKLE_PICKLER___INIT___METHODDEF \
4059 {"__init__", (PyCFunction)_pickle_Pickler___init__, METH_VARARGS|METH_KEYWORDS, _pickle_Pickler___init____doc__},
4060
4061static PyObject *
4062_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports);
4063
4064static PyObject *
4065_pickle_Pickler___init__(PyObject *self, PyObject *args, PyObject *kwargs)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004066{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004067 PyObject *return_value = NULL;
4068 static char *_keywords[] = {"file", "protocol", "fix_imports", NULL};
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004069 PyObject *file;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004070 PyObject *protocol = NULL;
4071 int fix_imports = 1;
4072
4073 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
4074 "O|Op:__init__", _keywords,
4075 &file, &protocol, &fix_imports))
4076 goto exit;
4077 return_value = _pickle_Pickler___init___impl((PicklerObject *)self, file, protocol, fix_imports);
4078
4079exit:
4080 return return_value;
4081}
4082
4083static PyObject *
4084_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004085/*[clinic checksum: 2b5ce6452544600478cf9f4b701ab9d9b5efbab9]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004086{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004087 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004088 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004089
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004090 /* In case of multiple __init__() calls, clear previous content. */
4091 if (self->write != NULL)
4092 (void)Pickler_clear(self);
4093
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004094 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
4095 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004096
4097 if (_Pickler_SetOutputStream(self, file) < 0)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004098 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004099
4100 /* memo and output_buffer may have already been created in _Pickler_New */
4101 if (self->memo == NULL) {
4102 self->memo = PyMemoTable_New();
4103 if (self->memo == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004104 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004105 }
4106 self->output_len = 0;
4107 if (self->output_buffer == NULL) {
4108 self->max_output_len = WRITE_BUF_SIZE;
4109 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4110 self->max_output_len);
4111 if (self->output_buffer == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004112 return NULL;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004113 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004114
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004115 self->fast = 0;
4116 self->fast_nesting = 0;
4117 self->fast_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004118 self->pers_func = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004119 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) {
4120 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
4121 &PyId_persistent_id);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004122 if (self->pers_func == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004123 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004124 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004125 self->dispatch_table = NULL;
4126 if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) {
4127 self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
4128 &PyId_dispatch_table);
4129 if (self->dispatch_table == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004130 return NULL;
4131 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004132
4133 Py_RETURN_NONE;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004134}
4135
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004136/* Wrap the Clinic generated signature to slot it in tp_init. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004137static int
4138Pickler_init(PyObject *self, PyObject *args, PyObject *kwargs)
4139{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004140 PyObject *result = _pickle_Pickler___init__(self, args, kwargs);
4141 if (result == NULL) {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004142 return -1;
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004143 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004144 Py_DECREF(result);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004145 return 0;
4146}
4147
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004148/* Define a proxy object for the Pickler's internal memo object. This is to
4149 * avoid breaking code like:
4150 * pickler.memo.clear()
4151 * and
4152 * pickler.memo = saved_memo
4153 * Is this a good idea? Not really, but we don't want to break code that uses
4154 * it. Note that we don't implement the entire mapping API here. This is
4155 * intentional, as these should be treated as black-box implementation details.
4156 */
4157
4158typedef struct {
4159 PyObject_HEAD
4160 PicklerObject *pickler; /* Pickler whose memo table we're proxying. */
4161} PicklerMemoProxyObject;
4162
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004163/*[clinic]
4164_pickle.PicklerMemoProxy.clear
4165
4166 self: PicklerMemoProxyObject
4167
4168Remove all items from memo.
4169[clinic]*/
4170
4171PyDoc_STRVAR(_pickle_PicklerMemoProxy_clear__doc__,
4172"clear()\n"
4173"Remove all items from memo.");
4174
4175#define _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF \
4176 {"clear", (PyCFunction)_pickle_PicklerMemoProxy_clear, METH_NOARGS, _pickle_PicklerMemoProxy_clear__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004177
4178static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004179_pickle_PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4180/*[clinic checksum: 507f13938721992e175a3e58b5ad02620045a1cc]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004181{
4182 if (self->pickler->memo)
4183 PyMemoTable_Clear(self->pickler->memo);
4184 Py_RETURN_NONE;
4185}
4186
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004187/*[clinic]
4188_pickle.PicklerMemoProxy.copy
4189
4190 self: PicklerMemoProxyObject
4191
4192Copy the memo to a new object.
4193[clinic]*/
4194
4195PyDoc_STRVAR(_pickle_PicklerMemoProxy_copy__doc__,
4196"copy()\n"
4197"Copy the memo to a new object.");
4198
4199#define _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF \
4200 {"copy", (PyCFunction)_pickle_PicklerMemoProxy_copy, METH_NOARGS, _pickle_PicklerMemoProxy_copy__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004201
4202static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004203_pickle_PicklerMemoProxy_copy(PicklerMemoProxyObject *self)
4204/*[clinic checksum: 73a5117ab354290ebdbe07bd0bf7232d0936a69d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004205{
4206 Py_ssize_t i;
4207 PyMemoTable *memo;
4208 PyObject *new_memo = PyDict_New();
4209 if (new_memo == NULL)
4210 return NULL;
4211
4212 memo = self->pickler->memo;
4213 for (i = 0; i < memo->mt_allocated; ++i) {
4214 PyMemoEntry entry = memo->mt_table[i];
4215 if (entry.me_key != NULL) {
4216 int status;
4217 PyObject *key, *value;
4218
4219 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004220 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004221
4222 if (key == NULL || value == NULL) {
4223 Py_XDECREF(key);
4224 Py_XDECREF(value);
4225 goto error;
4226 }
4227 status = PyDict_SetItem(new_memo, key, value);
4228 Py_DECREF(key);
4229 Py_DECREF(value);
4230 if (status < 0)
4231 goto error;
4232 }
4233 }
4234 return new_memo;
4235
4236 error:
4237 Py_XDECREF(new_memo);
4238 return NULL;
4239}
4240
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004241/*[clinic]
4242_pickle.PicklerMemoProxy.__reduce__
4243
4244 self: PicklerMemoProxyObject
4245
4246Implement pickle support.
4247[clinic]*/
4248
4249PyDoc_STRVAR(_pickle_PicklerMemoProxy___reduce____doc__,
4250"__reduce__()\n"
4251"Implement pickle support.");
4252
4253#define _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF \
4254 {"__reduce__", (PyCFunction)_pickle_PicklerMemoProxy___reduce__, METH_NOARGS, _pickle_PicklerMemoProxy___reduce____doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004255
4256static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004257_pickle_PicklerMemoProxy___reduce__(PicklerMemoProxyObject *self)
4258/*[clinic checksum: 40f0bf7a9b161e77130674f0481bda0a0184dcce]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004259{
4260 PyObject *reduce_value, *dict_args;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004261 PyObject *contents = _pickle_PicklerMemoProxy_copy(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004262 if (contents == NULL)
4263 return NULL;
4264
4265 reduce_value = PyTuple_New(2);
4266 if (reduce_value == NULL) {
4267 Py_DECREF(contents);
4268 return NULL;
4269 }
4270 dict_args = PyTuple_New(1);
4271 if (dict_args == NULL) {
4272 Py_DECREF(contents);
4273 Py_DECREF(reduce_value);
4274 return NULL;
4275 }
4276 PyTuple_SET_ITEM(dict_args, 0, contents);
4277 Py_INCREF((PyObject *)&PyDict_Type);
4278 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4279 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4280 return reduce_value;
4281}
4282
4283static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004284 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4285 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4286 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004287 {NULL, NULL} /* sentinel */
4288};
4289
4290static void
4291PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4292{
4293 PyObject_GC_UnTrack(self);
4294 Py_XDECREF(self->pickler);
4295 PyObject_GC_Del((PyObject *)self);
4296}
4297
4298static int
4299PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4300 visitproc visit, void *arg)
4301{
4302 Py_VISIT(self->pickler);
4303 return 0;
4304}
4305
4306static int
4307PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4308{
4309 Py_CLEAR(self->pickler);
4310 return 0;
4311}
4312
4313static PyTypeObject PicklerMemoProxyType = {
4314 PyVarObject_HEAD_INIT(NULL, 0)
4315 "_pickle.PicklerMemoProxy", /*tp_name*/
4316 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4317 0,
4318 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4319 0, /* tp_print */
4320 0, /* tp_getattr */
4321 0, /* tp_setattr */
4322 0, /* tp_compare */
4323 0, /* tp_repr */
4324 0, /* tp_as_number */
4325 0, /* tp_as_sequence */
4326 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004327 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004328 0, /* tp_call */
4329 0, /* tp_str */
4330 PyObject_GenericGetAttr, /* tp_getattro */
4331 PyObject_GenericSetAttr, /* tp_setattro */
4332 0, /* tp_as_buffer */
4333 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4334 0, /* tp_doc */
4335 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4336 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4337 0, /* tp_richcompare */
4338 0, /* tp_weaklistoffset */
4339 0, /* tp_iter */
4340 0, /* tp_iternext */
4341 picklerproxy_methods, /* tp_methods */
4342};
4343
4344static PyObject *
4345PicklerMemoProxy_New(PicklerObject *pickler)
4346{
4347 PicklerMemoProxyObject *self;
4348
4349 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4350 if (self == NULL)
4351 return NULL;
4352 Py_INCREF(pickler);
4353 self->pickler = pickler;
4354 PyObject_GC_Track(self);
4355 return (PyObject *)self;
4356}
4357
4358/*****************************************************************************/
4359
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004360static PyObject *
4361Pickler_get_memo(PicklerObject *self)
4362{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004363 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004364}
4365
4366static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004367Pickler_set_memo(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004368{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004369 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004370
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004371 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004372 PyErr_SetString(PyExc_TypeError,
4373 "attribute deletion is not supported");
4374 return -1;
4375 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004376
4377 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4378 PicklerObject *pickler =
4379 ((PicklerMemoProxyObject *)obj)->pickler;
4380
4381 new_memo = PyMemoTable_Copy(pickler->memo);
4382 if (new_memo == NULL)
4383 return -1;
4384 }
4385 else if (PyDict_Check(obj)) {
4386 Py_ssize_t i = 0;
4387 PyObject *key, *value;
4388
4389 new_memo = PyMemoTable_New();
4390 if (new_memo == NULL)
4391 return -1;
4392
4393 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004394 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004395 PyObject *memo_obj;
4396
4397 if (!PyTuple_Check(value) || Py_SIZE(value) != 2) {
4398 PyErr_SetString(PyExc_TypeError,
4399 "'memo' values must be 2-item tuples");
4400 goto error;
4401 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004402 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004403 if (memo_id == -1 && PyErr_Occurred())
4404 goto error;
4405 memo_obj = PyTuple_GET_ITEM(value, 1);
4406 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4407 goto error;
4408 }
4409 }
4410 else {
4411 PyErr_Format(PyExc_TypeError,
4412 "'memo' attribute must be an PicklerMemoProxy object"
4413 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004414 return -1;
4415 }
4416
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004417 PyMemoTable_Del(self->memo);
4418 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004419
4420 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004421
4422 error:
4423 if (new_memo)
4424 PyMemoTable_Del(new_memo);
4425 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004426}
4427
4428static PyObject *
4429Pickler_get_persid(PicklerObject *self)
4430{
4431 if (self->pers_func == NULL)
4432 PyErr_SetString(PyExc_AttributeError, "persistent_id");
4433 else
4434 Py_INCREF(self->pers_func);
4435 return self->pers_func;
4436}
4437
4438static int
4439Pickler_set_persid(PicklerObject *self, PyObject *value)
4440{
4441 PyObject *tmp;
4442
4443 if (value == NULL) {
4444 PyErr_SetString(PyExc_TypeError,
4445 "attribute deletion is not supported");
4446 return -1;
4447 }
4448 if (!PyCallable_Check(value)) {
4449 PyErr_SetString(PyExc_TypeError,
4450 "persistent_id must be a callable taking one argument");
4451 return -1;
4452 }
4453
4454 tmp = self->pers_func;
4455 Py_INCREF(value);
4456 self->pers_func = value;
4457 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
4458
4459 return 0;
4460}
4461
4462static PyMemberDef Pickler_members[] = {
4463 {"bin", T_INT, offsetof(PicklerObject, bin)},
4464 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004465 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004466 {NULL}
4467};
4468
4469static PyGetSetDef Pickler_getsets[] = {
4470 {"memo", (getter)Pickler_get_memo,
4471 (setter)Pickler_set_memo},
4472 {"persistent_id", (getter)Pickler_get_persid,
4473 (setter)Pickler_set_persid},
4474 {NULL}
4475};
4476
4477static PyTypeObject Pickler_Type = {
4478 PyVarObject_HEAD_INIT(NULL, 0)
4479 "_pickle.Pickler" , /*tp_name*/
4480 sizeof(PicklerObject), /*tp_basicsize*/
4481 0, /*tp_itemsize*/
4482 (destructor)Pickler_dealloc, /*tp_dealloc*/
4483 0, /*tp_print*/
4484 0, /*tp_getattr*/
4485 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00004486 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004487 0, /*tp_repr*/
4488 0, /*tp_as_number*/
4489 0, /*tp_as_sequence*/
4490 0, /*tp_as_mapping*/
4491 0, /*tp_hash*/
4492 0, /*tp_call*/
4493 0, /*tp_str*/
4494 0, /*tp_getattro*/
4495 0, /*tp_setattro*/
4496 0, /*tp_as_buffer*/
4497 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004498 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004499 (traverseproc)Pickler_traverse, /*tp_traverse*/
4500 (inquiry)Pickler_clear, /*tp_clear*/
4501 0, /*tp_richcompare*/
4502 0, /*tp_weaklistoffset*/
4503 0, /*tp_iter*/
4504 0, /*tp_iternext*/
4505 Pickler_methods, /*tp_methods*/
4506 Pickler_members, /*tp_members*/
4507 Pickler_getsets, /*tp_getset*/
4508 0, /*tp_base*/
4509 0, /*tp_dict*/
4510 0, /*tp_descr_get*/
4511 0, /*tp_descr_set*/
4512 0, /*tp_dictoffset*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004513 Pickler_init, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004514 PyType_GenericAlloc, /*tp_alloc*/
4515 PyType_GenericNew, /*tp_new*/
4516 PyObject_GC_Del, /*tp_free*/
4517 0, /*tp_is_gc*/
4518};
4519
Victor Stinner121aab42011-09-29 23:40:53 +02004520/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004521
4522 XXX: It would be nice to able to avoid Python function call overhead, by
4523 using directly the C version of find_class(), when find_class() is not
4524 overridden by a subclass. Although, this could become rather hackish. A
4525 simpler optimization would be to call the C function when self is not a
4526 subclass instance. */
4527static PyObject *
4528find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4529{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004530 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004531
4532 return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO",
4533 module_name, global_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004534}
4535
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004536static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004537marker(UnpicklerObject *self)
4538{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004539 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004540 if (self->num_marks < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004541 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004542 return -1;
4543 }
4544
4545 return self->marks[--self->num_marks];
4546}
4547
4548static int
4549load_none(UnpicklerObject *self)
4550{
4551 PDATA_APPEND(self->stack, Py_None, -1);
4552 return 0;
4553}
4554
4555static int
4556bad_readline(void)
4557{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004558 PickleState *st = _Pickle_GetGlobalState();
4559 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004560 return -1;
4561}
4562
4563static int
4564load_int(UnpicklerObject *self)
4565{
4566 PyObject *value;
4567 char *endptr, *s;
4568 Py_ssize_t len;
4569 long x;
4570
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004571 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004572 return -1;
4573 if (len < 2)
4574 return bad_readline();
4575
4576 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02004577 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004578 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004579 x = strtol(s, &endptr, 0);
4580
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004581 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004582 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03004583 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004584 errno = 0;
4585 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004586 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004587 if (value == NULL) {
4588 PyErr_SetString(PyExc_ValueError,
4589 "could not convert string to int");
4590 return -1;
4591 }
4592 }
4593 else {
4594 if (len == 3 && (x == 0 || x == 1)) {
4595 if ((value = PyBool_FromLong(x)) == NULL)
4596 return -1;
4597 }
4598 else {
4599 if ((value = PyLong_FromLong(x)) == NULL)
4600 return -1;
4601 }
4602 }
4603
4604 PDATA_PUSH(self->stack, value, -1);
4605 return 0;
4606}
4607
4608static int
4609load_bool(UnpicklerObject *self, PyObject *boolean)
4610{
4611 assert(boolean == Py_True || boolean == Py_False);
4612 PDATA_APPEND(self->stack, boolean, -1);
4613 return 0;
4614}
4615
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004616/* s contains x bytes of an unsigned little-endian integer. Return its value
4617 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4618 */
4619static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004620calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004621{
4622 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004623 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004624 size_t x = 0;
4625
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004626 for (i = 0; i < nbytes && i < sizeof(size_t); i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004627 x |= (size_t) s[i] << (8 * i);
4628 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004629
4630 if (x > PY_SSIZE_T_MAX)
4631 return -1;
4632 else
4633 return (Py_ssize_t) x;
4634}
4635
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004636/* s contains x bytes of a little-endian integer. Return its value as a
4637 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
4638 * int, but when x is 4 it's a signed one. This is an historical source
4639 * of x-platform bugs.
4640 */
4641static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004642calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004643{
4644 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004645 int i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004646 long x = 0;
4647
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004648 for (i = 0; i < nbytes; i++) {
4649 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004650 }
4651
4652 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4653 * is signed, so on a box with longs bigger than 4 bytes we need
4654 * to extend a BININT's sign bit to the full width.
4655 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004656 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004657 x |= -(x & (1L << 31));
4658 }
4659
4660 return x;
4661}
4662
4663static int
4664load_binintx(UnpicklerObject *self, char *s, int size)
4665{
4666 PyObject *value;
4667 long x;
4668
4669 x = calc_binint(s, size);
4670
4671 if ((value = PyLong_FromLong(x)) == NULL)
4672 return -1;
4673
4674 PDATA_PUSH(self->stack, value, -1);
4675 return 0;
4676}
4677
4678static int
4679load_binint(UnpicklerObject *self)
4680{
4681 char *s;
4682
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004683 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004684 return -1;
4685
4686 return load_binintx(self, s, 4);
4687}
4688
4689static int
4690load_binint1(UnpicklerObject *self)
4691{
4692 char *s;
4693
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004694 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004695 return -1;
4696
4697 return load_binintx(self, s, 1);
4698}
4699
4700static int
4701load_binint2(UnpicklerObject *self)
4702{
4703 char *s;
4704
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004705 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004706 return -1;
4707
4708 return load_binintx(self, s, 2);
4709}
4710
4711static int
4712load_long(UnpicklerObject *self)
4713{
4714 PyObject *value;
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004715 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004716 Py_ssize_t len;
4717
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004718 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004719 return -1;
4720 if (len < 2)
4721 return bad_readline();
4722
Mark Dickinson8dd05142009-01-20 20:43:58 +00004723 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4724 the 'L' before calling PyLong_FromString. In order to maintain
4725 compatibility with Python 3.0.0, we don't actually *require*
4726 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004727 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004728 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00004729 /* XXX: Should the base argument explicitly set to 10? */
4730 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00004731 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004732 return -1;
4733
4734 PDATA_PUSH(self->stack, value, -1);
4735 return 0;
4736}
4737
4738/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4739 * data following.
4740 */
4741static int
4742load_counted_long(UnpicklerObject *self, int size)
4743{
4744 PyObject *value;
4745 char *nbytes;
4746 char *pdata;
4747
4748 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004749 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004750 return -1;
4751
4752 size = calc_binint(nbytes, size);
4753 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004754 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004755 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004756 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004757 "LONG pickle has negative byte count");
4758 return -1;
4759 }
4760
4761 if (size == 0)
4762 value = PyLong_FromLong(0L);
4763 else {
4764 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004765 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004766 return -1;
4767 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
4768 1 /* little endian */ , 1 /* signed */ );
4769 }
4770 if (value == NULL)
4771 return -1;
4772 PDATA_PUSH(self->stack, value, -1);
4773 return 0;
4774}
4775
4776static int
4777load_float(UnpicklerObject *self)
4778{
4779 PyObject *value;
4780 char *endptr, *s;
4781 Py_ssize_t len;
4782 double d;
4783
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004784 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004785 return -1;
4786 if (len < 2)
4787 return bad_readline();
4788
4789 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004790 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
4791 if (d == -1.0 && PyErr_Occurred())
4792 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004793 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004794 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
4795 return -1;
4796 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00004797 value = PyFloat_FromDouble(d);
4798 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004799 return -1;
4800
4801 PDATA_PUSH(self->stack, value, -1);
4802 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004803}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004804
4805static int
4806load_binfloat(UnpicklerObject *self)
4807{
4808 PyObject *value;
4809 double x;
4810 char *s;
4811
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004812 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004813 return -1;
4814
4815 x = _PyFloat_Unpack8((unsigned char *)s, 0);
4816 if (x == -1.0 && PyErr_Occurred())
4817 return -1;
4818
4819 if ((value = PyFloat_FromDouble(x)) == NULL)
4820 return -1;
4821
4822 PDATA_PUSH(self->stack, value, -1);
4823 return 0;
4824}
4825
4826static int
4827load_string(UnpicklerObject *self)
4828{
4829 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004830 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004831 Py_ssize_t len;
4832 char *s, *p;
4833
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004834 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004835 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004836 /* Strip the newline */
4837 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004838 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004839 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004840 p = s + 1;
4841 len -= 2;
4842 }
4843 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004844 PickleState *st = _Pickle_GetGlobalState();
4845 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004846 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004847 return -1;
4848 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004849 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004850
4851 /* Use the PyBytes API to decode the string, since that is what is used
4852 to encode, and then coerce the result to Unicode. */
4853 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004854 if (bytes == NULL)
4855 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004856
4857 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
4858 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4859 if (strcmp(self->encoding, "bytes") == 0) {
4860 obj = bytes;
4861 }
4862 else {
4863 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
4864 Py_DECREF(bytes);
4865 if (obj == NULL) {
4866 return -1;
4867 }
4868 }
4869
4870 PDATA_PUSH(self->stack, obj, -1);
4871 return 0;
4872}
4873
4874static int
4875load_counted_binstring(UnpicklerObject *self, int nbytes)
4876{
4877 PyObject *obj;
4878 Py_ssize_t size;
4879 char *s;
4880
4881 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004882 return -1;
4883
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004884 size = calc_binsize(s, nbytes);
4885 if (size < 0) {
4886 PickleState *st = _Pickle_GetGlobalState();
4887 PyErr_Format(st->UnpicklingError,
4888 "BINSTRING exceeds system's maximum size of %zd bytes",
4889 PY_SSIZE_T_MAX);
4890 return -1;
4891 }
4892
4893 if (_Unpickler_Read(self, &s, size) < 0)
4894 return -1;
4895
4896 /* Convert Python 2.x strings to bytes if the *encoding* given to the
4897 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
4898 if (strcmp(self->encoding, "bytes") == 0) {
4899 obj = PyBytes_FromStringAndSize(s, size);
4900 }
4901 else {
4902 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
4903 }
4904 if (obj == NULL) {
4905 return -1;
4906 }
4907
4908 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004909 return 0;
4910}
4911
4912static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004913load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004914{
4915 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004916 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004917 char *s;
4918
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004919 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004920 return -1;
4921
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004922 size = calc_binsize(s, nbytes);
4923 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004924 PyErr_Format(PyExc_OverflowError,
4925 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004926 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004927 return -1;
4928 }
4929
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004930 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004931 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004932
4933 bytes = PyBytes_FromStringAndSize(s, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004934 if (bytes == NULL)
4935 return -1;
4936
4937 PDATA_PUSH(self->stack, bytes, -1);
4938 return 0;
4939}
4940
4941static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004942load_unicode(UnpicklerObject *self)
4943{
4944 PyObject *str;
4945 Py_ssize_t len;
4946 char *s;
4947
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004948 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004949 return -1;
4950 if (len < 1)
4951 return bad_readline();
4952
4953 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
4954 if (str == NULL)
4955 return -1;
4956
4957 PDATA_PUSH(self->stack, str, -1);
4958 return 0;
4959}
4960
4961static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004962load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004963{
4964 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004965 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004966 char *s;
4967
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004968 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004969 return -1;
4970
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004971 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004972 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004973 PyErr_Format(PyExc_OverflowError,
4974 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004975 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004976 return -1;
4977 }
4978
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004979 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004980 return -1;
4981
Victor Stinner485fb562010-04-13 11:07:24 +00004982 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004983 if (str == NULL)
4984 return -1;
4985
4986 PDATA_PUSH(self->stack, str, -1);
4987 return 0;
4988}
4989
4990static int
4991load_tuple(UnpicklerObject *self)
4992{
4993 PyObject *tuple;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004994 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004995
4996 if ((i = marker(self)) < 0)
4997 return -1;
4998
4999 tuple = Pdata_poptuple(self->stack, i);
5000 if (tuple == NULL)
5001 return -1;
5002 PDATA_PUSH(self->stack, tuple, -1);
5003 return 0;
5004}
5005
5006static int
5007load_counted_tuple(UnpicklerObject *self, int len)
5008{
5009 PyObject *tuple;
5010
5011 tuple = PyTuple_New(len);
5012 if (tuple == NULL)
5013 return -1;
5014
5015 while (--len >= 0) {
5016 PyObject *item;
5017
5018 PDATA_POP(self->stack, item);
5019 if (item == NULL)
5020 return -1;
5021 PyTuple_SET_ITEM(tuple, len, item);
5022 }
5023 PDATA_PUSH(self->stack, tuple, -1);
5024 return 0;
5025}
5026
5027static int
5028load_empty_list(UnpicklerObject *self)
5029{
5030 PyObject *list;
5031
5032 if ((list = PyList_New(0)) == NULL)
5033 return -1;
5034 PDATA_PUSH(self->stack, list, -1);
5035 return 0;
5036}
5037
5038static int
5039load_empty_dict(UnpicklerObject *self)
5040{
5041 PyObject *dict;
5042
5043 if ((dict = PyDict_New()) == NULL)
5044 return -1;
5045 PDATA_PUSH(self->stack, dict, -1);
5046 return 0;
5047}
5048
5049static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005050load_empty_set(UnpicklerObject *self)
5051{
5052 PyObject *set;
5053
5054 if ((set = PySet_New(NULL)) == NULL)
5055 return -1;
5056 PDATA_PUSH(self->stack, set, -1);
5057 return 0;
5058}
5059
5060static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005061load_list(UnpicklerObject *self)
5062{
5063 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005064 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005065
5066 if ((i = marker(self)) < 0)
5067 return -1;
5068
5069 list = Pdata_poplist(self->stack, i);
5070 if (list == NULL)
5071 return -1;
5072 PDATA_PUSH(self->stack, list, -1);
5073 return 0;
5074}
5075
5076static int
5077load_dict(UnpicklerObject *self)
5078{
5079 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005080 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005081
5082 if ((i = marker(self)) < 0)
5083 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005084 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005085
5086 if ((dict = PyDict_New()) == NULL)
5087 return -1;
5088
5089 for (k = i + 1; k < j; k += 2) {
5090 key = self->stack->data[k - 1];
5091 value = self->stack->data[k];
5092 if (PyDict_SetItem(dict, key, value) < 0) {
5093 Py_DECREF(dict);
5094 return -1;
5095 }
5096 }
5097 Pdata_clear(self->stack, i);
5098 PDATA_PUSH(self->stack, dict, -1);
5099 return 0;
5100}
5101
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005102static int
5103load_frozenset(UnpicklerObject *self)
5104{
5105 PyObject *items;
5106 PyObject *frozenset;
5107 Py_ssize_t i;
5108
5109 if ((i = marker(self)) < 0)
5110 return -1;
5111
5112 items = Pdata_poptuple(self->stack, i);
5113 if (items == NULL)
5114 return -1;
5115
5116 frozenset = PyFrozenSet_New(items);
5117 Py_DECREF(items);
5118 if (frozenset == NULL)
5119 return -1;
5120
5121 PDATA_PUSH(self->stack, frozenset, -1);
5122 return 0;
5123}
5124
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005125static PyObject *
5126instantiate(PyObject *cls, PyObject *args)
5127{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005128 PyObject *result = NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005129 _Py_IDENTIFIER(__getinitargs__);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005130 /* Caller must assure args are a tuple. Normally, args come from
5131 Pdata_poptuple which packs objects from the top of the stack
5132 into a newly created tuple. */
5133 assert(PyTuple_Check(args));
5134 if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005135 _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005136 result = PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005137 }
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005138 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005139 _Py_IDENTIFIER(__new__);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005140
5141 result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005142 }
5143 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005144}
5145
5146static int
5147load_obj(UnpicklerObject *self)
5148{
5149 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005150 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005151
5152 if ((i = marker(self)) < 0)
5153 return -1;
5154
5155 args = Pdata_poptuple(self->stack, i + 1);
5156 if (args == NULL)
5157 return -1;
5158
5159 PDATA_POP(self->stack, cls);
5160 if (cls) {
5161 obj = instantiate(cls, args);
5162 Py_DECREF(cls);
5163 }
5164 Py_DECREF(args);
5165 if (obj == NULL)
5166 return -1;
5167
5168 PDATA_PUSH(self->stack, obj, -1);
5169 return 0;
5170}
5171
5172static int
5173load_inst(UnpicklerObject *self)
5174{
5175 PyObject *cls = NULL;
5176 PyObject *args = NULL;
5177 PyObject *obj = NULL;
5178 PyObject *module_name;
5179 PyObject *class_name;
5180 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005181 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005182 char *s;
5183
5184 if ((i = marker(self)) < 0)
5185 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005186 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005187 return -1;
5188 if (len < 2)
5189 return bad_readline();
5190
5191 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5192 identifiers are permitted in Python 3.0, since the INST opcode is only
5193 supported by older protocols on Python 2.x. */
5194 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5195 if (module_name == NULL)
5196 return -1;
5197
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005198 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005199 if (len < 2)
5200 return bad_readline();
5201 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005202 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005203 cls = find_class(self, module_name, class_name);
5204 Py_DECREF(class_name);
5205 }
5206 }
5207 Py_DECREF(module_name);
5208
5209 if (cls == NULL)
5210 return -1;
5211
5212 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5213 obj = instantiate(cls, args);
5214 Py_DECREF(args);
5215 }
5216 Py_DECREF(cls);
5217
5218 if (obj == NULL)
5219 return -1;
5220
5221 PDATA_PUSH(self->stack, obj, -1);
5222 return 0;
5223}
5224
5225static int
5226load_newobj(UnpicklerObject *self)
5227{
5228 PyObject *args = NULL;
5229 PyObject *clsraw = NULL;
5230 PyTypeObject *cls; /* clsraw cast to its true type */
5231 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005232 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005233
5234 /* Stack is ... cls argtuple, and we want to call
5235 * cls.__new__(cls, *argtuple).
5236 */
5237 PDATA_POP(self->stack, args);
5238 if (args == NULL)
5239 goto error;
5240 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005241 PyErr_SetString(st->UnpicklingError,
5242 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005243 goto error;
5244 }
5245
5246 PDATA_POP(self->stack, clsraw);
5247 cls = (PyTypeObject *)clsraw;
5248 if (cls == NULL)
5249 goto error;
5250 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005251 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005252 "isn't a type object");
5253 goto error;
5254 }
5255 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005256 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005257 "has NULL tp_new");
5258 goto error;
5259 }
5260
5261 /* Call __new__. */
5262 obj = cls->tp_new(cls, args, NULL);
5263 if (obj == NULL)
5264 goto error;
5265
5266 Py_DECREF(args);
5267 Py_DECREF(clsraw);
5268 PDATA_PUSH(self->stack, obj, -1);
5269 return 0;
5270
5271 error:
5272 Py_XDECREF(args);
5273 Py_XDECREF(clsraw);
5274 return -1;
5275}
5276
5277static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005278load_newobj_ex(UnpicklerObject *self)
5279{
5280 PyObject *cls, *args, *kwargs;
5281 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005282 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005283
5284 PDATA_POP(self->stack, kwargs);
5285 if (kwargs == NULL) {
5286 return -1;
5287 }
5288 PDATA_POP(self->stack, args);
5289 if (args == NULL) {
5290 Py_DECREF(kwargs);
5291 return -1;
5292 }
5293 PDATA_POP(self->stack, cls);
5294 if (cls == NULL) {
5295 Py_DECREF(kwargs);
5296 Py_DECREF(args);
5297 return -1;
5298 }
5299
5300 if (!PyType_Check(cls)) {
5301 Py_DECREF(kwargs);
5302 Py_DECREF(args);
5303 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005304 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005305 "NEWOBJ_EX class argument must be a type, not %.200s",
5306 Py_TYPE(cls)->tp_name);
5307 return -1;
5308 }
5309
5310 if (((PyTypeObject *)cls)->tp_new == NULL) {
5311 Py_DECREF(kwargs);
5312 Py_DECREF(args);
5313 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005314 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005315 "NEWOBJ_EX class argument doesn't have __new__");
5316 return -1;
5317 }
5318 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5319 Py_DECREF(kwargs);
5320 Py_DECREF(args);
5321 Py_DECREF(cls);
5322 if (obj == NULL) {
5323 return -1;
5324 }
5325 PDATA_PUSH(self->stack, obj, -1);
5326 return 0;
5327}
5328
5329static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005330load_global(UnpicklerObject *self)
5331{
5332 PyObject *global = NULL;
5333 PyObject *module_name;
5334 PyObject *global_name;
5335 Py_ssize_t len;
5336 char *s;
5337
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005338 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005339 return -1;
5340 if (len < 2)
5341 return bad_readline();
5342 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5343 if (!module_name)
5344 return -1;
5345
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005346 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005347 if (len < 2) {
5348 Py_DECREF(module_name);
5349 return bad_readline();
5350 }
5351 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5352 if (global_name) {
5353 global = find_class(self, module_name, global_name);
5354 Py_DECREF(global_name);
5355 }
5356 }
5357 Py_DECREF(module_name);
5358
5359 if (global == NULL)
5360 return -1;
5361 PDATA_PUSH(self->stack, global, -1);
5362 return 0;
5363}
5364
5365static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005366load_stack_global(UnpicklerObject *self)
5367{
5368 PyObject *global;
5369 PyObject *module_name;
5370 PyObject *global_name;
5371
5372 PDATA_POP(self->stack, global_name);
5373 PDATA_POP(self->stack, module_name);
5374 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5375 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005376 PickleState *st = _Pickle_GetGlobalState();
5377 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005378 Py_XDECREF(global_name);
5379 Py_XDECREF(module_name);
5380 return -1;
5381 }
5382 global = find_class(self, module_name, global_name);
5383 Py_DECREF(global_name);
5384 Py_DECREF(module_name);
5385 if (global == NULL)
5386 return -1;
5387 PDATA_PUSH(self->stack, global, -1);
5388 return 0;
5389}
5390
5391static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005392load_persid(UnpicklerObject *self)
5393{
5394 PyObject *pid;
5395 Py_ssize_t len;
5396 char *s;
5397
5398 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005399 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005400 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08005401 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005402 return bad_readline();
5403
5404 pid = PyBytes_FromStringAndSize(s, len - 1);
5405 if (pid == NULL)
5406 return -1;
5407
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005408 /* This does not leak since _Pickle_FastCall() steals the reference
5409 to pid first. */
5410 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005411 if (pid == NULL)
5412 return -1;
5413
5414 PDATA_PUSH(self->stack, pid, -1);
5415 return 0;
5416 }
5417 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005418 PickleState *st = _Pickle_GetGlobalState();
5419 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005420 "A load persistent id instruction was encountered,\n"
5421 "but no persistent_load function was specified.");
5422 return -1;
5423 }
5424}
5425
5426static int
5427load_binpersid(UnpicklerObject *self)
5428{
5429 PyObject *pid;
5430
5431 if (self->pers_func) {
5432 PDATA_POP(self->stack, pid);
5433 if (pid == NULL)
5434 return -1;
5435
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005436 /* This does not leak since _Pickle_FastCall() steals the
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005437 reference to pid first. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005438 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005439 if (pid == NULL)
5440 return -1;
5441
5442 PDATA_PUSH(self->stack, pid, -1);
5443 return 0;
5444 }
5445 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005446 PickleState *st = _Pickle_GetGlobalState();
5447 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005448 "A load persistent id instruction was encountered,\n"
5449 "but no persistent_load function was specified.");
5450 return -1;
5451 }
5452}
5453
5454static int
5455load_pop(UnpicklerObject *self)
5456{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005457 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005458
5459 /* Note that we split the (pickle.py) stack into two stacks,
5460 * an object stack and a mark stack. We have to be clever and
5461 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005462 * mark stack first, and only signalling a stack underflow if
5463 * the object stack is empty and the mark stack doesn't match
5464 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005465 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005466 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005467 self->num_marks--;
Antoine Pitrou01a15ea2010-01-07 17:57:31 +00005468 } else if (len > 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005469 len--;
5470 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005471 Py_SIZE(self->stack) = len;
Collin Winter8ca69de2009-05-26 16:53:41 +00005472 } else {
5473 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005474 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005475 return 0;
5476}
5477
5478static int
5479load_pop_mark(UnpicklerObject *self)
5480{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005481 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005482
5483 if ((i = marker(self)) < 0)
5484 return -1;
5485
5486 Pdata_clear(self->stack, i);
5487
5488 return 0;
5489}
5490
5491static int
5492load_dup(UnpicklerObject *self)
5493{
5494 PyObject *last;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005495 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005496
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005497 if ((len = Py_SIZE(self->stack)) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005498 return stack_underflow();
5499 last = self->stack->data[len - 1];
5500 PDATA_APPEND(self->stack, last, -1);
5501 return 0;
5502}
5503
5504static int
5505load_get(UnpicklerObject *self)
5506{
5507 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005508 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005509 Py_ssize_t len;
5510 char *s;
5511
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005512 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005513 return -1;
5514 if (len < 2)
5515 return bad_readline();
5516
5517 key = PyLong_FromString(s, NULL, 10);
5518 if (key == NULL)
5519 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005520 idx = PyLong_AsSsize_t(key);
5521 if (idx == -1 && PyErr_Occurred()) {
5522 Py_DECREF(key);
5523 return -1;
5524 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005525
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005526 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005527 if (value == NULL) {
5528 if (!PyErr_Occurred())
5529 PyErr_SetObject(PyExc_KeyError, key);
5530 Py_DECREF(key);
5531 return -1;
5532 }
5533 Py_DECREF(key);
5534
5535 PDATA_APPEND(self->stack, value, -1);
5536 return 0;
5537}
5538
5539static int
5540load_binget(UnpicklerObject *self)
5541{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005542 PyObject *value;
5543 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005544 char *s;
5545
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005546 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005547 return -1;
5548
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005549 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005550
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005551 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005552 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005553 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005554 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005555 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005556 Py_DECREF(key);
5557 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005558 return -1;
5559 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005560
5561 PDATA_APPEND(self->stack, value, -1);
5562 return 0;
5563}
5564
5565static int
5566load_long_binget(UnpicklerObject *self)
5567{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005568 PyObject *value;
5569 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005570 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005571
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005572 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005573 return -1;
5574
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005575 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005576
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005577 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005578 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005579 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005580 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005581 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005582 Py_DECREF(key);
5583 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005584 return -1;
5585 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005586
5587 PDATA_APPEND(self->stack, value, -1);
5588 return 0;
5589}
5590
5591/* Push an object from the extension registry (EXT[124]). nbytes is
5592 * the number of bytes following the opcode, holding the index (code) value.
5593 */
5594static int
5595load_extension(UnpicklerObject *self, int nbytes)
5596{
5597 char *codebytes; /* the nbytes bytes after the opcode */
5598 long code; /* calc_binint returns long */
5599 PyObject *py_code; /* code as a Python int */
5600 PyObject *obj; /* the object to push */
5601 PyObject *pair; /* (module_name, class_name) */
5602 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005603 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005604
5605 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005606 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005607 return -1;
5608 code = calc_binint(codebytes, nbytes);
5609 if (code <= 0) { /* note that 0 is forbidden */
5610 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005611 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005612 return -1;
5613 }
5614
5615 /* Look for the code in the cache. */
5616 py_code = PyLong_FromLong(code);
5617 if (py_code == NULL)
5618 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005619 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005620 if (obj != NULL) {
5621 /* Bingo. */
5622 Py_DECREF(py_code);
5623 PDATA_APPEND(self->stack, obj, -1);
5624 return 0;
5625 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005626 if (PyErr_Occurred()) {
5627 Py_DECREF(py_code);
5628 return -1;
5629 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005630
5631 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005632 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005633 if (pair == NULL) {
5634 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005635 if (!PyErr_Occurred()) {
5636 PyErr_Format(PyExc_ValueError, "unregistered extension "
5637 "code %ld", code);
5638 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005639 return -1;
5640 }
5641 /* Since the extension registry is manipulable via Python code,
5642 * confirm that pair is really a 2-tuple of strings.
5643 */
5644 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5645 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5646 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5647 Py_DECREF(py_code);
5648 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5649 "isn't a 2-tuple of strings", code);
5650 return -1;
5651 }
5652 /* Load the object. */
5653 obj = find_class(self, module_name, class_name);
5654 if (obj == NULL) {
5655 Py_DECREF(py_code);
5656 return -1;
5657 }
5658 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005659 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005660 Py_DECREF(py_code);
5661 if (code < 0) {
5662 Py_DECREF(obj);
5663 return -1;
5664 }
5665 PDATA_PUSH(self->stack, obj, -1);
5666 return 0;
5667}
5668
5669static int
5670load_put(UnpicklerObject *self)
5671{
5672 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005673 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005674 Py_ssize_t len;
5675 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005676
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005677 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005678 return -1;
5679 if (len < 2)
5680 return bad_readline();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005681 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005682 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005683 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005684
5685 key = PyLong_FromString(s, NULL, 10);
5686 if (key == NULL)
5687 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005688 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005689 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005690 if (idx < 0) {
5691 if (!PyErr_Occurred())
5692 PyErr_SetString(PyExc_ValueError,
5693 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005694 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005695 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005696
5697 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005698}
5699
5700static int
5701load_binput(UnpicklerObject *self)
5702{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005703 PyObject *value;
5704 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005705 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005706
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005707 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005708 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005709
5710 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005711 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005712 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005713
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005714 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005715
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005716 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005717}
5718
5719static int
5720load_long_binput(UnpicklerObject *self)
5721{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005722 PyObject *value;
5723 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005724 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005725
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005726 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005727 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005728
5729 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005730 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005731 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005732
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005733 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005734 if (idx < 0) {
5735 PyErr_SetString(PyExc_ValueError,
5736 "negative LONG_BINPUT argument");
5737 return -1;
5738 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005739
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005740 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005741}
5742
5743static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005744load_memoize(UnpicklerObject *self)
5745{
5746 PyObject *value;
5747
5748 if (Py_SIZE(self->stack) <= 0)
5749 return stack_underflow();
5750 value = self->stack->data[Py_SIZE(self->stack) - 1];
5751
5752 return _Unpickler_MemoPut(self, self->memo_len, value);
5753}
5754
5755static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005756do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005757{
5758 PyObject *value;
5759 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005760 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005761
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;
5767
5768 list = self->stack->data[x - 1];
5769
5770 if (PyList_Check(list)) {
5771 PyObject *slice;
5772 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005773 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005774
5775 slice = Pdata_poplist(self->stack, x);
5776 if (!slice)
5777 return -1;
5778 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005779 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005780 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005781 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005782 }
5783 else {
5784 PyObject *append_func;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005785 _Py_IDENTIFIER(append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005786
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005787 append_func = _PyObject_GetAttrId(list, &PyId_append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005788 if (append_func == NULL)
5789 return -1;
5790 for (i = x; i < len; i++) {
5791 PyObject *result;
5792
5793 value = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005794 result = _Pickle_FastCall(append_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005795 if (result == NULL) {
5796 Pdata_clear(self->stack, i + 1);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005797 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005798 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005799 return -1;
5800 }
5801 Py_DECREF(result);
5802 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005803 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005804 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005805 }
5806
5807 return 0;
5808}
5809
5810static int
5811load_append(UnpicklerObject *self)
5812{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005813 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005814}
5815
5816static int
5817load_appends(UnpicklerObject *self)
5818{
5819 return do_append(self, marker(self));
5820}
5821
5822static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005823do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005824{
5825 PyObject *value, *key;
5826 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005827 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005828 int status = 0;
5829
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005830 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005831 if (x > len || x <= 0)
5832 return stack_underflow();
5833 if (len == x) /* nothing to do */
5834 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005835 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005836 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005837 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005838 PyErr_SetString(st->UnpicklingError,
5839 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005840 return -1;
5841 }
5842
5843 /* Here, dict does not actually need to be a PyDict; it could be anything
5844 that supports the __setitem__ attribute. */
5845 dict = self->stack->data[x - 1];
5846
5847 for (i = x + 1; i < len; i += 2) {
5848 key = self->stack->data[i - 1];
5849 value = self->stack->data[i];
5850 if (PyObject_SetItem(dict, key, value) < 0) {
5851 status = -1;
5852 break;
5853 }
5854 }
5855
5856 Pdata_clear(self->stack, x);
5857 return status;
5858}
5859
5860static int
5861load_setitem(UnpicklerObject *self)
5862{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005863 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005864}
5865
5866static int
5867load_setitems(UnpicklerObject *self)
5868{
5869 return do_setitems(self, marker(self));
5870}
5871
5872static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005873load_additems(UnpicklerObject *self)
5874{
5875 PyObject *set;
5876 Py_ssize_t mark, len, i;
5877
5878 mark = marker(self);
5879 len = Py_SIZE(self->stack);
5880 if (mark > len || mark <= 0)
5881 return stack_underflow();
5882 if (len == mark) /* nothing to do */
5883 return 0;
5884
5885 set = self->stack->data[mark - 1];
5886
5887 if (PySet_Check(set)) {
5888 PyObject *items;
5889 int status;
5890
5891 items = Pdata_poptuple(self->stack, mark);
5892 if (items == NULL)
5893 return -1;
5894
5895 status = _PySet_Update(set, items);
5896 Py_DECREF(items);
5897 return status;
5898 }
5899 else {
5900 PyObject *add_func;
5901 _Py_IDENTIFIER(add);
5902
5903 add_func = _PyObject_GetAttrId(set, &PyId_add);
5904 if (add_func == NULL)
5905 return -1;
5906 for (i = mark; i < len; i++) {
5907 PyObject *result;
5908 PyObject *item;
5909
5910 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005911 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005912 if (result == NULL) {
5913 Pdata_clear(self->stack, i + 1);
5914 Py_SIZE(self->stack) = mark;
5915 return -1;
5916 }
5917 Py_DECREF(result);
5918 }
5919 Py_SIZE(self->stack) = mark;
5920 }
5921
5922 return 0;
5923}
5924
5925static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005926load_build(UnpicklerObject *self)
5927{
5928 PyObject *state, *inst, *slotstate;
5929 PyObject *setstate;
5930 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005931 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005932
5933 /* Stack is ... instance, state. We want to leave instance at
5934 * the stack top, possibly mutated via instance.__setstate__(state).
5935 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005936 if (Py_SIZE(self->stack) < 2)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005937 return stack_underflow();
5938
5939 PDATA_POP(self->stack, state);
5940 if (state == NULL)
5941 return -1;
5942
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005943 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005944
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005945 setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005946 if (setstate == NULL) {
5947 if (PyErr_ExceptionMatches(PyExc_AttributeError))
5948 PyErr_Clear();
Antoine Pitroud79dc622008-09-05 00:03:33 +00005949 else {
5950 Py_DECREF(state);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005951 return -1;
Antoine Pitroud79dc622008-09-05 00:03:33 +00005952 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005953 }
5954 else {
5955 PyObject *result;
5956
5957 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005958 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005959 Py_DECREF(setstate);
5960 if (result == NULL)
5961 return -1;
5962 Py_DECREF(result);
5963 return 0;
5964 }
5965
5966 /* A default __setstate__. First see whether state embeds a
5967 * slot state dict too (a proto 2 addition).
5968 */
5969 if (PyTuple_Check(state) && Py_SIZE(state) == 2) {
5970 PyObject *tmp = state;
5971
5972 state = PyTuple_GET_ITEM(tmp, 0);
5973 slotstate = PyTuple_GET_ITEM(tmp, 1);
5974 Py_INCREF(state);
5975 Py_INCREF(slotstate);
5976 Py_DECREF(tmp);
5977 }
5978 else
5979 slotstate = NULL;
5980
5981 /* Set inst.__dict__ from the state dict (if any). */
5982 if (state != Py_None) {
5983 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005984 PyObject *d_key, *d_value;
5985 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005986 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005987
5988 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005989 PickleState *st = _Pickle_GetGlobalState();
5990 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005991 goto error;
5992 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005993 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005994 if (dict == NULL)
5995 goto error;
5996
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005997 i = 0;
5998 while (PyDict_Next(state, &i, &d_key, &d_value)) {
5999 /* normally the keys for instance attributes are
6000 interned. we should try to do that here. */
6001 Py_INCREF(d_key);
6002 if (PyUnicode_CheckExact(d_key))
6003 PyUnicode_InternInPlace(&d_key);
6004 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
6005 Py_DECREF(d_key);
6006 goto error;
6007 }
6008 Py_DECREF(d_key);
6009 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006010 Py_DECREF(dict);
6011 }
6012
6013 /* Also set instance attributes from the slotstate dict (if any). */
6014 if (slotstate != NULL) {
6015 PyObject *d_key, *d_value;
6016 Py_ssize_t i;
6017
6018 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006019 PickleState *st = _Pickle_GetGlobalState();
6020 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006021 "slot state is not a dictionary");
6022 goto error;
6023 }
6024 i = 0;
6025 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
6026 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
6027 goto error;
6028 }
6029 }
6030
6031 if (0) {
6032 error:
6033 status = -1;
6034 }
6035
6036 Py_DECREF(state);
6037 Py_XDECREF(slotstate);
6038 return status;
6039}
6040
6041static int
6042load_mark(UnpicklerObject *self)
6043{
6044
6045 /* Note that we split the (pickle.py) stack into two stacks, an
6046 * object stack and a mark stack. Here we push a mark onto the
6047 * mark stack.
6048 */
6049
6050 if ((self->num_marks + 1) >= self->marks_size) {
6051 size_t alloc;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006052 Py_ssize_t *marks;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006053
6054 /* Use the size_t type to check for overflow. */
6055 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006056 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00006057 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006058 PyErr_NoMemory();
6059 return -1;
6060 }
6061
6062 if (self->marks == NULL)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006063 marks = (Py_ssize_t *) PyMem_Malloc(alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006064 else
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006065 marks = (Py_ssize_t *) PyMem_Realloc(self->marks,
6066 alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006067 if (marks == NULL) {
6068 PyErr_NoMemory();
6069 return -1;
6070 }
6071 self->marks = marks;
6072 self->marks_size = (Py_ssize_t)alloc;
6073 }
6074
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006075 self->marks[self->num_marks++] = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006076
6077 return 0;
6078}
6079
6080static int
6081load_reduce(UnpicklerObject *self)
6082{
6083 PyObject *callable = NULL;
6084 PyObject *argtup = NULL;
6085 PyObject *obj = NULL;
6086
6087 PDATA_POP(self->stack, argtup);
6088 if (argtup == NULL)
6089 return -1;
6090 PDATA_POP(self->stack, callable);
6091 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006092 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006093 Py_DECREF(callable);
6094 }
6095 Py_DECREF(argtup);
6096
6097 if (obj == NULL)
6098 return -1;
6099
6100 PDATA_PUSH(self->stack, obj, -1);
6101 return 0;
6102}
6103
6104/* Just raises an error if we don't know the protocol specified. PROTO
6105 * is the first opcode for protocols >= 2.
6106 */
6107static int
6108load_proto(UnpicklerObject *self)
6109{
6110 char *s;
6111 int i;
6112
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006113 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006114 return -1;
6115
6116 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006117 if (i <= HIGHEST_PROTOCOL) {
6118 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006119 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006120 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006121
6122 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6123 return -1;
6124}
6125
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006126static int
6127load_frame(UnpicklerObject *self)
6128{
6129 char *s;
6130 Py_ssize_t frame_len;
6131
6132 if (_Unpickler_Read(self, &s, 8) < 0)
6133 return -1;
6134
6135 frame_len = calc_binsize(s, 8);
6136 if (frame_len < 0) {
6137 PyErr_Format(PyExc_OverflowError,
6138 "FRAME length exceeds system's maximum of %zd bytes",
6139 PY_SSIZE_T_MAX);
6140 return -1;
6141 }
6142
6143 if (_Unpickler_Read(self, &s, frame_len) < 0)
6144 return -1;
6145
6146 /* Rewind to start of frame */
6147 self->next_read_idx -= frame_len;
6148 return 0;
6149}
6150
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006151static PyObject *
6152load(UnpicklerObject *self)
6153{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006154 PyObject *value = NULL;
6155 char *s;
6156
6157 self->num_marks = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006158 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006159 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006160 Pdata_clear(self->stack, 0);
6161
6162 /* Convenient macros for the dispatch while-switch loop just below. */
6163#define OP(opcode, load_func) \
6164 case opcode: if (load_func(self) < 0) break; continue;
6165
6166#define OP_ARG(opcode, load_func, arg) \
6167 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6168
6169 while (1) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006170 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006171 break;
6172
6173 switch ((enum opcode)s[0]) {
6174 OP(NONE, load_none)
6175 OP(BININT, load_binint)
6176 OP(BININT1, load_binint1)
6177 OP(BININT2, load_binint2)
6178 OP(INT, load_int)
6179 OP(LONG, load_long)
6180 OP_ARG(LONG1, load_counted_long, 1)
6181 OP_ARG(LONG4, load_counted_long, 4)
6182 OP(FLOAT, load_float)
6183 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006184 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6185 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6186 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6187 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6188 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006189 OP(STRING, load_string)
6190 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006191 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6192 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6193 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006194 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6195 OP_ARG(TUPLE1, load_counted_tuple, 1)
6196 OP_ARG(TUPLE2, load_counted_tuple, 2)
6197 OP_ARG(TUPLE3, load_counted_tuple, 3)
6198 OP(TUPLE, load_tuple)
6199 OP(EMPTY_LIST, load_empty_list)
6200 OP(LIST, load_list)
6201 OP(EMPTY_DICT, load_empty_dict)
6202 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006203 OP(EMPTY_SET, load_empty_set)
6204 OP(ADDITEMS, load_additems)
6205 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006206 OP(OBJ, load_obj)
6207 OP(INST, load_inst)
6208 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006209 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006210 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006211 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006212 OP(APPEND, load_append)
6213 OP(APPENDS, load_appends)
6214 OP(BUILD, load_build)
6215 OP(DUP, load_dup)
6216 OP(BINGET, load_binget)
6217 OP(LONG_BINGET, load_long_binget)
6218 OP(GET, load_get)
6219 OP(MARK, load_mark)
6220 OP(BINPUT, load_binput)
6221 OP(LONG_BINPUT, load_long_binput)
6222 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006223 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006224 OP(POP, load_pop)
6225 OP(POP_MARK, load_pop_mark)
6226 OP(SETITEM, load_setitem)
6227 OP(SETITEMS, load_setitems)
6228 OP(PERSID, load_persid)
6229 OP(BINPERSID, load_binpersid)
6230 OP(REDUCE, load_reduce)
6231 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006232 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006233 OP_ARG(EXT1, load_extension, 1)
6234 OP_ARG(EXT2, load_extension, 2)
6235 OP_ARG(EXT4, load_extension, 4)
6236 OP_ARG(NEWTRUE, load_bool, Py_True)
6237 OP_ARG(NEWFALSE, load_bool, Py_False)
6238
6239 case STOP:
6240 break;
6241
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006242 default:
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006243 if (s[0] == '\0') {
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006244 PyErr_SetNone(PyExc_EOFError);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006245 }
6246 else {
6247 PickleState *st = _Pickle_GetGlobalState();
6248 PyErr_Format(st->UnpicklingError,
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006249 "invalid load key, '%c'.", s[0]);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006250 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006251 return NULL;
6252 }
6253
6254 break; /* and we are done! */
6255 }
6256
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006257 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006258 return NULL;
6259 }
6260
Victor Stinner2ae57e32013-10-31 13:39:23 +01006261 if (_Unpickler_SkipConsumed(self) < 0)
6262 return NULL;
6263
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006264 PDATA_POP(self->stack, value);
6265 return value;
6266}
6267
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006268/*[clinic]
6269
6270_pickle.Unpickler.load
6271
6272Load a pickle.
6273
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006274Read a pickled object representation from the open file object given
6275in the constructor, and return the reconstituted object hierarchy
6276specified therein.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006277[clinic]*/
6278
6279PyDoc_STRVAR(_pickle_Unpickler_load__doc__,
6280"load()\n"
6281"Load a pickle.\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006282"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006283"Read a pickled object representation from the open file object given\n"
6284"in the constructor, and return the reconstituted object hierarchy\n"
6285"specified therein.");
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006286
6287#define _PICKLE_UNPICKLER_LOAD_METHODDEF \
6288 {"load", (PyCFunction)_pickle_Unpickler_load, METH_NOARGS, _pickle_Unpickler_load__doc__},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006289
6290static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006291_pickle_Unpickler_load(PyObject *self)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006292/*[clinic checksum: c2ae1263f0dd000f34ccf0fe59d7c544464babc4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006293{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006294 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006295
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006296 /* Check whether the Unpickler was initialized correctly. This prevents
6297 segfaulting if a subclass overridden __init__ with a function that does
6298 not call Unpickler.__init__(). Here, we simply ensure that self->read
6299 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006300 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006301 PickleState *st = _Pickle_GetGlobalState();
6302 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006303 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006304 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006305 return NULL;
6306 }
6307
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006308 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006309}
6310
6311/* The name of find_class() is misleading. In newer pickle protocols, this
6312 function is used for loading any global (i.e., functions), not just
6313 classes. The name is kept only for backward compatibility. */
6314
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006315/*[clinic]
6316
6317_pickle.Unpickler.find_class
6318
6319 self: UnpicklerObject
6320 module_name: object
6321 global_name: object
6322 /
6323
6324Return an object from a specified module.
6325
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006326If necessary, the module will be imported. Subclasses may override
6327this method (e.g. to restrict unpickling of arbitrary classes and
6328functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006329
6330This method is called whenever a class or a function object is
6331needed. Both arguments passed are str objects.
6332[clinic]*/
6333
6334PyDoc_STRVAR(_pickle_Unpickler_find_class__doc__,
6335"find_class(module_name, global_name)\n"
6336"Return an object from a specified module.\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006337"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006338"If necessary, the module will be imported. Subclasses may override\n"
6339"this method (e.g. to restrict unpickling of arbitrary classes and\n"
6340"functions).\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006341"\n"
6342"This method is called whenever a class or a function object is\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006343"needed. Both arguments passed are str objects.");
6344
6345#define _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF \
6346 {"find_class", (PyCFunction)_pickle_Unpickler_find_class, METH_VARARGS, _pickle_Unpickler_find_class__doc__},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006347
6348static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006349_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyObject *module_name, PyObject *global_name);
6350
6351static PyObject *
6352_pickle_Unpickler_find_class(PyObject *self, PyObject *args)
6353{
6354 PyObject *return_value = NULL;
6355 PyObject *module_name;
6356 PyObject *global_name;
6357
6358 if (!PyArg_ParseTuple(args,
6359 "OO:find_class",
6360 &module_name, &global_name))
6361 goto exit;
6362 return_value = _pickle_Unpickler_find_class_impl((UnpicklerObject *)self, module_name, global_name);
6363
6364exit:
6365 return return_value;
6366}
6367
6368static PyObject *
6369_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006370/*[clinic checksum: 1f353d13a32c9d94feb1466b3c2d0529a7e5650e]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006371{
6372 PyObject *global;
6373 PyObject *modules_dict;
6374 PyObject *module;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006375 _Py_IDENTIFIER(modules);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006376
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006377 /* Try to map the old names used in Python 2.x to the new ones used in
6378 Python 3.x. We do this only with old pickle protocols and when the
6379 user has not disabled the feature. */
6380 if (self->proto < 3 && self->fix_imports) {
6381 PyObject *key;
6382 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006383 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006384
6385 /* Check if the global (i.e., a function or a class) was renamed
6386 or moved to another module. */
6387 key = PyTuple_Pack(2, module_name, global_name);
6388 if (key == NULL)
6389 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006390 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006391 Py_DECREF(key);
6392 if (item) {
6393 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6394 PyErr_Format(PyExc_RuntimeError,
6395 "_compat_pickle.NAME_MAPPING values should be "
6396 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6397 return NULL;
6398 }
6399 module_name = PyTuple_GET_ITEM(item, 0);
6400 global_name = PyTuple_GET_ITEM(item, 1);
6401 if (!PyUnicode_Check(module_name) ||
6402 !PyUnicode_Check(global_name)) {
6403 PyErr_Format(PyExc_RuntimeError,
6404 "_compat_pickle.NAME_MAPPING values should be "
6405 "pairs of str, not (%.200s, %.200s)",
6406 Py_TYPE(module_name)->tp_name,
6407 Py_TYPE(global_name)->tp_name);
6408 return NULL;
6409 }
6410 }
6411 else if (PyErr_Occurred()) {
6412 return NULL;
6413 }
6414
6415 /* Check if the module was renamed. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006416 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006417 if (item) {
6418 if (!PyUnicode_Check(item)) {
6419 PyErr_Format(PyExc_RuntimeError,
6420 "_compat_pickle.IMPORT_MAPPING values should be "
6421 "strings, not %.200s", Py_TYPE(item)->tp_name);
6422 return NULL;
6423 }
6424 module_name = item;
6425 }
6426 else if (PyErr_Occurred()) {
6427 return NULL;
6428 }
6429 }
6430
Victor Stinnerbb520202013-11-06 22:40:41 +01006431 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02006432 if (modules_dict == NULL) {
6433 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006434 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02006435 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006436
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006437 module = PyDict_GetItemWithError(modules_dict, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006438 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006439 if (PyErr_Occurred())
6440 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006441 module = PyImport_Import(module_name);
6442 if (module == NULL)
6443 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006444 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006445 Py_DECREF(module);
6446 }
Victor Stinner121aab42011-09-29 23:40:53 +02006447 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006448 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006449 }
6450 return global;
6451}
6452
6453static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006454 _PICKLE_UNPICKLER_LOAD_METHODDEF
6455 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006456 {NULL, NULL} /* sentinel */
6457};
6458
6459static void
6460Unpickler_dealloc(UnpicklerObject *self)
6461{
6462 PyObject_GC_UnTrack((PyObject *)self);
6463 Py_XDECREF(self->readline);
6464 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006465 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006466 Py_XDECREF(self->stack);
6467 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006468 if (self->buffer.buf != NULL) {
6469 PyBuffer_Release(&self->buffer);
6470 self->buffer.buf = NULL;
6471 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006472
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006473 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006474 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006475 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006476 PyMem_Free(self->encoding);
6477 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006478
6479 Py_TYPE(self)->tp_free((PyObject *)self);
6480}
6481
6482static int
6483Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6484{
6485 Py_VISIT(self->readline);
6486 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006487 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006488 Py_VISIT(self->stack);
6489 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006490 return 0;
6491}
6492
6493static int
6494Unpickler_clear(UnpicklerObject *self)
6495{
6496 Py_CLEAR(self->readline);
6497 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006498 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006499 Py_CLEAR(self->stack);
6500 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006501 if (self->buffer.buf != NULL) {
6502 PyBuffer_Release(&self->buffer);
6503 self->buffer.buf = NULL;
6504 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006505
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006506 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006507 PyMem_Free(self->marks);
6508 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006509 PyMem_Free(self->input_line);
6510 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006511 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006512 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006513 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006514 self->errors = NULL;
6515
6516 return 0;
6517}
6518
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006519/*[clinic]
6520
6521_pickle.Unpickler.__init__
6522
6523 self: UnpicklerObject
6524 file: object
6525 *
6526 fix_imports: bool = True
6527 encoding: str = 'ASCII'
6528 errors: str = 'strict'
6529
6530This takes a binary file for reading a pickle data stream.
6531
6532The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006533protocol argument is needed. Bytes past the pickled object's
6534representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006535
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006536The argument *file* must have two methods, a read() method that takes
6537an integer argument, and a readline() method that requires no
6538arguments. Both methods should return bytes. Thus *file* can be a
6539binary file object opened for reading, a io.BytesIO object, or any
6540other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006541
6542Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6543which are used to control compatiblity support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006544generated by Python 2. If *fix_imports* is True, pickle will try to
6545map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006546*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006547instances pickled by Python 2; these default to 'ASCII' and 'strict',
6548respectively. The *encoding* can be 'bytes' to read these 8-bit
6549string instances as bytes objects.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006550[clinic]*/
6551
6552PyDoc_STRVAR(_pickle_Unpickler___init____doc__,
6553"__init__(file, *, fix_imports=True, encoding=\'ASCII\', errors=\'strict\')\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006554"This takes a binary file for reading a pickle data stream.\n"
6555"\n"
6556"The protocol version of the pickle is detected automatically, so no\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006557"protocol argument is needed. Bytes past the pickled object\'s\n"
6558"representation are ignored.\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006559"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006560"The argument *file* must have two methods, a read() method that takes\n"
6561"an integer argument, and a readline() method that requires no\n"
6562"arguments. Both methods should return bytes. Thus *file* can be a\n"
6563"binary file object opened for reading, a io.BytesIO object, or any\n"
6564"other custom object that meets this interface.\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006565"\n"
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006566"Optional keyword arguments are *fix_imports*, *encoding* and *errors*,\n"
6567"which are used to control compatiblity support for pickle stream\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006568"generated by Python 2. If *fix_imports* is True, pickle will try to\n"
6569"map the old Python 2 names to the new names used in Python 3. The\n"
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006570"*encoding* and *errors* tell pickle how to decode 8-bit string\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006571"instances pickled by Python 2; these default to \'ASCII\' and \'strict\',\n"
6572"respectively. The *encoding* can be \'bytes\' to read these 8-bit\n"
6573"string instances as bytes objects.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006574
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006575#define _PICKLE_UNPICKLER___INIT___METHODDEF \
6576 {"__init__", (PyCFunction)_pickle_Unpickler___init__, METH_VARARGS|METH_KEYWORDS, _pickle_Unpickler___init____doc__},
6577
6578static PyObject *
6579_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, const char *errors);
6580
6581static PyObject *
6582_pickle_Unpickler___init__(PyObject *self, PyObject *args, PyObject *kwargs)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006583{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006584 PyObject *return_value = NULL;
6585 static char *_keywords[] = {"file", "fix_imports", "encoding", "errors", NULL};
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006586 PyObject *file;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006587 int fix_imports = 1;
6588 const char *encoding = "ASCII";
6589 const char *errors = "strict";
6590
6591 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
6592 "O|$pss:__init__", _keywords,
6593 &file, &fix_imports, &encoding, &errors))
6594 goto exit;
6595 return_value = _pickle_Unpickler___init___impl((UnpicklerObject *)self, file, fix_imports, encoding, errors);
6596
6597exit:
6598 return return_value;
6599}
6600
6601static PyObject *
6602_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, const char *errors)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006603/*[clinic checksum: 9ce6783224e220573d42a94fe1bb7199d6f1c5a6]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006604{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006605 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006606
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006607 /* In case of multiple __init__() calls, clear previous content. */
6608 if (self->read != NULL)
6609 (void)Unpickler_clear(self);
6610
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006611 if (_Unpickler_SetInputStream(self, file) < 0)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006612 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006613
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006614 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006615 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006616
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006617 self->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006618 if (self->fix_imports == -1)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006619 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006620
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006621 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006622 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
6623 &PyId_persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006624 if (self->pers_func == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006625 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006626 }
6627 else {
6628 self->pers_func = NULL;
6629 }
6630
6631 self->stack = (Pdata *)Pdata_New();
6632 if (self->stack == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006633 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006634
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006635 self->memo_size = 32;
6636 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006637 if (self->memo == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006638 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006639
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006640 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006641
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006642 Py_RETURN_NONE;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006643}
6644
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006645/* Wrap the Clinic generated signature to slot it in tp_init. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006646static int
6647Unpickler_init(PyObject *self, PyObject *args, PyObject *kwargs)
6648{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006649 PyObject *result = _pickle_Unpickler___init__(self, args, kwargs);
6650 if (result == NULL) {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006651 return -1;
6652 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006653 Py_DECREF(result);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006654 return 0;
6655}
6656
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006657/* Define a proxy object for the Unpickler's internal memo object. This is to
6658 * avoid breaking code like:
6659 * unpickler.memo.clear()
6660 * and
6661 * unpickler.memo = saved_memo
6662 * Is this a good idea? Not really, but we don't want to break code that uses
6663 * it. Note that we don't implement the entire mapping API here. This is
6664 * intentional, as these should be treated as black-box implementation details.
6665 *
6666 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006667 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006668 */
6669
6670typedef struct {
6671 PyObject_HEAD
6672 UnpicklerObject *unpickler;
6673} UnpicklerMemoProxyObject;
6674
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006675/*[clinic]
6676_pickle.UnpicklerMemoProxy.clear
6677
6678 self: UnpicklerMemoProxyObject
6679
6680Remove all items from memo.
6681[clinic]*/
6682
6683PyDoc_STRVAR(_pickle_UnpicklerMemoProxy_clear__doc__,
6684"clear()\n"
6685"Remove all items from memo.");
6686
6687#define _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF \
6688 {"clear", (PyCFunction)_pickle_UnpicklerMemoProxy_clear, METH_NOARGS, _pickle_UnpicklerMemoProxy_clear__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006689
6690static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006691_pickle_UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6692/*[clinic checksum: 46fecf4e33c0c873124f845edf6cc3a2e9864bd5]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006693{
6694 _Unpickler_MemoCleanup(self->unpickler);
6695 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6696 if (self->unpickler->memo == NULL)
6697 return NULL;
6698 Py_RETURN_NONE;
6699}
6700
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006701/*[clinic]
6702_pickle.UnpicklerMemoProxy.copy
6703
6704 self: UnpicklerMemoProxyObject
6705
6706Copy the memo to a new object.
6707[clinic]*/
6708
6709PyDoc_STRVAR(_pickle_UnpicklerMemoProxy_copy__doc__,
6710"copy()\n"
6711"Copy the memo to a new object.");
6712
6713#define _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF \
6714 {"copy", (PyCFunction)_pickle_UnpicklerMemoProxy_copy, METH_NOARGS, _pickle_UnpicklerMemoProxy_copy__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006715
6716static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006717_pickle_UnpicklerMemoProxy_copy(UnpicklerMemoProxyObject *self)
6718/*[clinic checksum: f8856c4e8a33540886dfbb245f286af3008fa0ad]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006719{
6720 Py_ssize_t i;
6721 PyObject *new_memo = PyDict_New();
6722 if (new_memo == NULL)
6723 return NULL;
6724
6725 for (i = 0; i < self->unpickler->memo_size; i++) {
6726 int status;
6727 PyObject *key, *value;
6728
6729 value = self->unpickler->memo[i];
6730 if (value == NULL)
6731 continue;
6732
6733 key = PyLong_FromSsize_t(i);
6734 if (key == NULL)
6735 goto error;
6736 status = PyDict_SetItem(new_memo, key, value);
6737 Py_DECREF(key);
6738 if (status < 0)
6739 goto error;
6740 }
6741 return new_memo;
6742
6743error:
6744 Py_DECREF(new_memo);
6745 return NULL;
6746}
6747
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006748/*[clinic]
6749_pickle.UnpicklerMemoProxy.__reduce__
6750
6751 self: UnpicklerMemoProxyObject
6752
6753Implement pickling support.
6754[clinic]*/
6755
6756PyDoc_STRVAR(_pickle_UnpicklerMemoProxy___reduce____doc__,
6757"__reduce__()\n"
6758"Implement pickling support.");
6759
6760#define _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF \
6761 {"__reduce__", (PyCFunction)_pickle_UnpicklerMemoProxy___reduce__, METH_NOARGS, _pickle_UnpicklerMemoProxy___reduce____doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006762
6763static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006764_pickle_UnpicklerMemoProxy___reduce__(UnpicklerMemoProxyObject *self)
6765/*[clinic checksum: ab5516a77659144e1191c7dd70a0c6c7455660bc]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006766{
6767 PyObject *reduce_value;
6768 PyObject *constructor_args;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006769 PyObject *contents = _pickle_UnpicklerMemoProxy_copy(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006770 if (contents == NULL)
6771 return NULL;
6772
6773 reduce_value = PyTuple_New(2);
6774 if (reduce_value == NULL) {
6775 Py_DECREF(contents);
6776 return NULL;
6777 }
6778 constructor_args = PyTuple_New(1);
6779 if (constructor_args == NULL) {
6780 Py_DECREF(contents);
6781 Py_DECREF(reduce_value);
6782 return NULL;
6783 }
6784 PyTuple_SET_ITEM(constructor_args, 0, contents);
6785 Py_INCREF((PyObject *)&PyDict_Type);
6786 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6787 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6788 return reduce_value;
6789}
6790
6791static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006792 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6793 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6794 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006795 {NULL, NULL} /* sentinel */
6796};
6797
6798static void
6799UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6800{
6801 PyObject_GC_UnTrack(self);
6802 Py_XDECREF(self->unpickler);
6803 PyObject_GC_Del((PyObject *)self);
6804}
6805
6806static int
6807UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6808 visitproc visit, void *arg)
6809{
6810 Py_VISIT(self->unpickler);
6811 return 0;
6812}
6813
6814static int
6815UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6816{
6817 Py_CLEAR(self->unpickler);
6818 return 0;
6819}
6820
6821static PyTypeObject UnpicklerMemoProxyType = {
6822 PyVarObject_HEAD_INIT(NULL, 0)
6823 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6824 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6825 0,
6826 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6827 0, /* tp_print */
6828 0, /* tp_getattr */
6829 0, /* tp_setattr */
6830 0, /* tp_compare */
6831 0, /* tp_repr */
6832 0, /* tp_as_number */
6833 0, /* tp_as_sequence */
6834 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006835 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006836 0, /* tp_call */
6837 0, /* tp_str */
6838 PyObject_GenericGetAttr, /* tp_getattro */
6839 PyObject_GenericSetAttr, /* tp_setattro */
6840 0, /* tp_as_buffer */
6841 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6842 0, /* tp_doc */
6843 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6844 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6845 0, /* tp_richcompare */
6846 0, /* tp_weaklistoffset */
6847 0, /* tp_iter */
6848 0, /* tp_iternext */
6849 unpicklerproxy_methods, /* tp_methods */
6850};
6851
6852static PyObject *
6853UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6854{
6855 UnpicklerMemoProxyObject *self;
6856
6857 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6858 &UnpicklerMemoProxyType);
6859 if (self == NULL)
6860 return NULL;
6861 Py_INCREF(unpickler);
6862 self->unpickler = unpickler;
6863 PyObject_GC_Track(self);
6864 return (PyObject *)self;
6865}
6866
6867/*****************************************************************************/
6868
6869
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006870static PyObject *
6871Unpickler_get_memo(UnpicklerObject *self)
6872{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006873 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006874}
6875
6876static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006877Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006878{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006879 PyObject **new_memo;
6880 Py_ssize_t new_memo_size = 0;
6881 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006882
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006883 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006884 PyErr_SetString(PyExc_TypeError,
6885 "attribute deletion is not supported");
6886 return -1;
6887 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006888
6889 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6890 UnpicklerObject *unpickler =
6891 ((UnpicklerMemoProxyObject *)obj)->unpickler;
6892
6893 new_memo_size = unpickler->memo_size;
6894 new_memo = _Unpickler_NewMemo(new_memo_size);
6895 if (new_memo == NULL)
6896 return -1;
6897
6898 for (i = 0; i < new_memo_size; i++) {
6899 Py_XINCREF(unpickler->memo[i]);
6900 new_memo[i] = unpickler->memo[i];
6901 }
6902 }
6903 else if (PyDict_Check(obj)) {
6904 Py_ssize_t i = 0;
6905 PyObject *key, *value;
6906
6907 new_memo_size = PyDict_Size(obj);
6908 new_memo = _Unpickler_NewMemo(new_memo_size);
6909 if (new_memo == NULL)
6910 return -1;
6911
6912 while (PyDict_Next(obj, &i, &key, &value)) {
6913 Py_ssize_t idx;
6914 if (!PyLong_Check(key)) {
6915 PyErr_SetString(PyExc_TypeError,
6916 "memo key must be integers");
6917 goto error;
6918 }
6919 idx = PyLong_AsSsize_t(key);
6920 if (idx == -1 && PyErr_Occurred())
6921 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02006922 if (idx < 0) {
6923 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02006924 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02006925 goto error;
6926 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006927 if (_Unpickler_MemoPut(self, idx, value) < 0)
6928 goto error;
6929 }
6930 }
6931 else {
6932 PyErr_Format(PyExc_TypeError,
6933 "'memo' attribute must be an UnpicklerMemoProxy object"
6934 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006935 return -1;
6936 }
6937
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006938 _Unpickler_MemoCleanup(self);
6939 self->memo_size = new_memo_size;
6940 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006941
6942 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006943
6944 error:
6945 if (new_memo_size) {
6946 i = new_memo_size;
6947 while (--i >= 0) {
6948 Py_XDECREF(new_memo[i]);
6949 }
6950 PyMem_FREE(new_memo);
6951 }
6952 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006953}
6954
6955static PyObject *
6956Unpickler_get_persload(UnpicklerObject *self)
6957{
6958 if (self->pers_func == NULL)
6959 PyErr_SetString(PyExc_AttributeError, "persistent_load");
6960 else
6961 Py_INCREF(self->pers_func);
6962 return self->pers_func;
6963}
6964
6965static int
6966Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
6967{
6968 PyObject *tmp;
6969
6970 if (value == NULL) {
6971 PyErr_SetString(PyExc_TypeError,
6972 "attribute deletion is not supported");
6973 return -1;
6974 }
6975 if (!PyCallable_Check(value)) {
6976 PyErr_SetString(PyExc_TypeError,
6977 "persistent_load must be a callable taking "
6978 "one argument");
6979 return -1;
6980 }
6981
6982 tmp = self->pers_func;
6983 Py_INCREF(value);
6984 self->pers_func = value;
6985 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
6986
6987 return 0;
6988}
6989
6990static PyGetSetDef Unpickler_getsets[] = {
6991 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
6992 {"persistent_load", (getter)Unpickler_get_persload,
6993 (setter)Unpickler_set_persload},
6994 {NULL}
6995};
6996
6997static PyTypeObject Unpickler_Type = {
6998 PyVarObject_HEAD_INIT(NULL, 0)
6999 "_pickle.Unpickler", /*tp_name*/
7000 sizeof(UnpicklerObject), /*tp_basicsize*/
7001 0, /*tp_itemsize*/
7002 (destructor)Unpickler_dealloc, /*tp_dealloc*/
7003 0, /*tp_print*/
7004 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007005 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00007006 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007007 0, /*tp_repr*/
7008 0, /*tp_as_number*/
7009 0, /*tp_as_sequence*/
7010 0, /*tp_as_mapping*/
7011 0, /*tp_hash*/
7012 0, /*tp_call*/
7013 0, /*tp_str*/
7014 0, /*tp_getattro*/
7015 0, /*tp_setattro*/
7016 0, /*tp_as_buffer*/
7017 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007018 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007019 (traverseproc)Unpickler_traverse, /*tp_traverse*/
7020 (inquiry)Unpickler_clear, /*tp_clear*/
7021 0, /*tp_richcompare*/
7022 0, /*tp_weaklistoffset*/
7023 0, /*tp_iter*/
7024 0, /*tp_iternext*/
7025 Unpickler_methods, /*tp_methods*/
7026 0, /*tp_members*/
7027 Unpickler_getsets, /*tp_getset*/
7028 0, /*tp_base*/
7029 0, /*tp_dict*/
7030 0, /*tp_descr_get*/
7031 0, /*tp_descr_set*/
7032 0, /*tp_dictoffset*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007033 Unpickler_init, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007034 PyType_GenericAlloc, /*tp_alloc*/
7035 PyType_GenericNew, /*tp_new*/
7036 PyObject_GC_Del, /*tp_free*/
7037 0, /*tp_is_gc*/
7038};
7039
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007040/*[clinic]
7041
7042_pickle.dump
7043
7044 obj: object
7045 file: object
7046 protocol: object = NULL
7047 *
7048 fix_imports: bool = True
7049
7050Write a pickled representation of obj to the open file object file.
7051
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007052This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
7053be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007054
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007055The optional *protocol* argument tells the pickler to use the given
7056protocol supported protocols are 0, 1, 2, 3 and 4. The default
7057protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007058
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007059Specifying a negative protocol version selects the highest protocol
7060version supported. The higher the protocol used, the more recent the
7061version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007062
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007063The *file* argument must have a write() method that accepts a single
7064bytes argument. It can thus be a file object opened for binary
7065writing, a io.BytesIO instance, or any other custom object that meets
7066this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007067
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007068If *fix_imports* is True and protocol is less than 3, pickle will try
7069to map the new Python 3 names to the old module names used in Python
70702, so that the pickle data stream is readable with Python 2.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007071[clinic]*/
7072
7073PyDoc_STRVAR(_pickle_dump__doc__,
7074"dump(obj, file, protocol=None, *, fix_imports=True)\n"
7075"Write a pickled representation of obj to the open file object file.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007076"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007077"This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may\n"
7078"be more efficient.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007079"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007080"The optional *protocol* argument tells the pickler to use the given\n"
7081"protocol supported protocols are 0, 1, 2, 3 and 4. The default\n"
7082"protocol is 3; a backward-incompatible protocol designed for Python 3.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007083"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007084"Specifying a negative protocol version selects the highest protocol\n"
7085"version supported. The higher the protocol used, the more recent the\n"
7086"version of Python needed to read the pickle produced.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007087"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007088"The *file* argument must have a write() method that accepts a single\n"
7089"bytes argument. It can thus be a file object opened for binary\n"
7090"writing, a io.BytesIO instance, or any other custom object that meets\n"
7091"this interface.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007092"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007093"If *fix_imports* is True and protocol is less than 3, pickle will try\n"
7094"to map the new Python 3 names to the old module names used in Python\n"
7095"2, so that the pickle data stream is readable with Python 2.");
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007096
7097#define _PICKLE_DUMP_METHODDEF \
7098 {"dump", (PyCFunction)_pickle_dump, METH_VARARGS|METH_KEYWORDS, _pickle_dump__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007099
7100static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007101_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports);
7102
7103static PyObject *
7104_pickle_dump(PyModuleDef *module, PyObject *args, PyObject *kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007105{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007106 PyObject *return_value = NULL;
7107 static char *_keywords[] = {"obj", "file", "protocol", "fix_imports", NULL};
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007108 PyObject *obj;
7109 PyObject *file;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007110 PyObject *protocol = NULL;
7111 int fix_imports = 1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007112
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007113 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
7114 "OO|O$p:dump", _keywords,
7115 &obj, &file, &protocol, &fix_imports))
7116 goto exit;
7117 return_value = _pickle_dump_impl(module, obj, file, protocol, fix_imports);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007118
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007119exit:
7120 return return_value;
7121}
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007122
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007123static PyObject *
7124_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007125/*[clinic checksum: eb5c23e64da34477178230b704d2cc9c6b6650ea]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007126{
7127 PicklerObject *pickler = _Pickler_New();
7128
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007129 if (pickler == NULL)
7130 return NULL;
7131
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007132 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007133 goto error;
7134
7135 if (_Pickler_SetOutputStream(pickler, file) < 0)
7136 goto error;
7137
7138 if (dump(pickler, obj) < 0)
7139 goto error;
7140
7141 if (_Pickler_FlushToFile(pickler) < 0)
7142 goto error;
7143
7144 Py_DECREF(pickler);
7145 Py_RETURN_NONE;
7146
7147 error:
7148 Py_XDECREF(pickler);
7149 return NULL;
7150}
7151
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007152/*[clinic]
7153
7154_pickle.dumps
7155
7156 obj: object
7157 protocol: object = NULL
7158 *
7159 fix_imports: bool = True
7160
7161Return the pickled representation of the object as a bytes object.
7162
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007163The optional *protocol* argument tells the pickler to use the given
7164protocol; supported protocols are 0, 1, 2, 3 and 4. The default
7165protocol is 3; a backward-incompatible protocol designed for Python 3.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007166
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007167Specifying a negative protocol version selects the highest protocol
7168version supported. The higher the protocol used, the more recent the
7169version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007170
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007171If *fix_imports* is True and *protocol* is less than 3, pickle will
7172try to map the new Python 3 names to the old module names used in
7173Python 2, so that the pickle data stream is readable with Python 2.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007174[clinic]*/
7175
7176PyDoc_STRVAR(_pickle_dumps__doc__,
7177"dumps(obj, protocol=None, *, fix_imports=True)\n"
7178"Return the pickled representation of the object as a bytes object.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007179"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007180"The optional *protocol* argument tells the pickler to use the given\n"
7181"protocol; supported protocols are 0, 1, 2, 3 and 4. The default\n"
7182"protocol is 3; a backward-incompatible protocol designed for Python 3.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007183"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007184"Specifying a negative protocol version selects the highest protocol\n"
7185"version supported. The higher the protocol used, the more recent the\n"
7186"version of Python needed to read the pickle produced.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007187"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007188"If *fix_imports* is True and *protocol* is less than 3, pickle will\n"
7189"try to map the new Python 3 names to the old module names used in\n"
7190"Python 2, so that the pickle data stream is readable with Python 2.");
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007191
7192#define _PICKLE_DUMPS_METHODDEF \
7193 {"dumps", (PyCFunction)_pickle_dumps, METH_VARARGS|METH_KEYWORDS, _pickle_dumps__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007194
7195static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007196_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol, int fix_imports);
7197
7198static PyObject *
7199_pickle_dumps(PyModuleDef *module, PyObject *args, PyObject *kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007200{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007201 PyObject *return_value = NULL;
7202 static char *_keywords[] = {"obj", "protocol", "fix_imports", NULL};
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007203 PyObject *obj;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007204 PyObject *protocol = NULL;
7205 int fix_imports = 1;
7206
7207 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
7208 "O|O$p:dumps", _keywords,
7209 &obj, &protocol, &fix_imports))
7210 goto exit;
7211 return_value = _pickle_dumps_impl(module, obj, protocol, fix_imports);
7212
7213exit:
7214 return return_value;
7215}
7216
7217static PyObject *
7218_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol, int fix_imports)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007219/*[clinic checksum: e9b915d61202a9692cb6c6718db74fe54fc9c4d1]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007220{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007221 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007222 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007223
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007224 if (pickler == NULL)
7225 return NULL;
7226
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007227 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007228 goto error;
7229
7230 if (dump(pickler, obj) < 0)
7231 goto error;
7232
7233 result = _Pickler_GetString(pickler);
7234 Py_DECREF(pickler);
7235 return result;
7236
7237 error:
7238 Py_XDECREF(pickler);
7239 return NULL;
7240}
7241
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007242/*[clinic]
7243
7244_pickle.load
7245
7246 file: object
7247 *
7248 fix_imports: bool = True
7249 encoding: str = 'ASCII'
7250 errors: str = 'strict'
7251
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007252Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007253
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007254This is equivalent to ``Unpickler(file).load()``, but may be more
7255efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007256
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007257The protocol version of the pickle is detected automatically, so no
7258protocol argument is needed. Bytes past the pickled object's
7259representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007260
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007261The argument *file* must have two methods, a read() method that takes
7262an integer argument, and a readline() method that requires no
7263arguments. Both methods should return bytes. Thus *file* can be a
7264binary file object opened for reading, a io.BytesIO object, or any
7265other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007266
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007267Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
7268which are used to control compatiblity support for pickle stream
7269generated by Python 2. If *fix_imports* is True, pickle will try to
7270map the old Python 2 names to the new names used in Python 3. The
7271*encoding* and *errors* tell pickle how to decode 8-bit string
7272instances pickled by Python 2; these default to 'ASCII' and 'strict',
7273respectively. The *encoding* can be 'bytes' to read these 8-bit
7274string instances as bytes objects.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007275[clinic]*/
7276
7277PyDoc_STRVAR(_pickle_load__doc__,
7278"load(file, *, fix_imports=True, encoding=\'ASCII\', errors=\'strict\')\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007279"Read and return an object from the pickle data stored in a file.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007280"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007281"This is equivalent to ``Unpickler(file).load()``, but may be more\n"
7282"efficient.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007283"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007284"The protocol version of the pickle is detected automatically, so no\n"
7285"protocol argument is needed. Bytes past the pickled object\'s\n"
7286"representation are ignored.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007287"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007288"The argument *file* must have two methods, a read() method that takes\n"
7289"an integer argument, and a readline() method that requires no\n"
7290"arguments. Both methods should return bytes. Thus *file* can be a\n"
7291"binary file object opened for reading, a io.BytesIO object, or any\n"
7292"other custom object that meets this interface.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007293"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007294"Optional keyword arguments are *fix_imports*, *encoding* and *errors*,\n"
7295"which are used to control compatiblity support for pickle stream\n"
7296"generated by Python 2. If *fix_imports* is True, pickle will try to\n"
7297"map the old Python 2 names to the new names used in Python 3. The\n"
7298"*encoding* and *errors* tell pickle how to decode 8-bit string\n"
7299"instances pickled by Python 2; these default to \'ASCII\' and \'strict\',\n"
7300"respectively. The *encoding* can be \'bytes\' to read these 8-bit\n"
7301"string instances as bytes objects.");
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007302
7303#define _PICKLE_LOAD_METHODDEF \
7304 {"load", (PyCFunction)_pickle_load, METH_VARARGS|METH_KEYWORDS, _pickle_load__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007305
7306static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007307_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports, const char *encoding, const char *errors);
7308
7309static PyObject *
7310_pickle_load(PyModuleDef *module, PyObject *args, PyObject *kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007311{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007312 PyObject *return_value = NULL;
7313 static char *_keywords[] = {"file", "fix_imports", "encoding", "errors", NULL};
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007314 PyObject *file;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007315 int fix_imports = 1;
7316 const char *encoding = "ASCII";
7317 const char *errors = "strict";
7318
7319 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
7320 "O|$pss:load", _keywords,
7321 &file, &fix_imports, &encoding, &errors))
7322 goto exit;
7323 return_value = _pickle_load_impl(module, file, fix_imports, encoding, errors);
7324
7325exit:
7326 return return_value;
7327}
7328
7329static PyObject *
7330_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports, const char *encoding, const char *errors)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007331/*[clinic checksum: b41f06970e57acf2fd602e4b7f88e3f3e1e53087]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007332{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007333 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007334 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007335
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007336 if (unpickler == NULL)
7337 return NULL;
7338
7339 if (_Unpickler_SetInputStream(unpickler, file) < 0)
7340 goto error;
7341
7342 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7343 goto error;
7344
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007345 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007346
7347 result = load(unpickler);
7348 Py_DECREF(unpickler);
7349 return result;
7350
7351 error:
7352 Py_XDECREF(unpickler);
7353 return NULL;
7354}
7355
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007356/*[clinic]
7357
7358_pickle.loads
7359
7360 data: object
7361 *
7362 fix_imports: bool = True
7363 encoding: str = 'ASCII'
7364 errors: str = 'strict'
7365
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007366Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007367
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007368The protocol version of the pickle is detected automatically, so no
7369protocol argument is needed. Bytes past the pickled object's
7370representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007371
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007372Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
7373which are used to control compatiblity support for pickle stream
7374generated by Python 2. If *fix_imports* is True, pickle will try to
7375map the old Python 2 names to the new names used in Python 3. The
7376*encoding* and *errors* tell pickle how to decode 8-bit string
7377instances pickled by Python 2; these default to 'ASCII' and 'strict',
7378respectively. The *encoding* can be 'bytes' to read these 8-bit
7379string instances as bytes objects.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007380[clinic]*/
7381
7382PyDoc_STRVAR(_pickle_loads__doc__,
7383"loads(data, *, fix_imports=True, encoding=\'ASCII\', errors=\'strict\')\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007384"Read and return an object from the given pickle data.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007385"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007386"The protocol version of the pickle is detected automatically, so no\n"
7387"protocol argument is needed. Bytes past the pickled object\'s\n"
7388"representation are ignored.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007389"\n"
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007390"Optional keyword arguments are *fix_imports*, *encoding* and *errors*,\n"
7391"which are used to control compatiblity support for pickle stream\n"
7392"generated by Python 2. If *fix_imports* is True, pickle will try to\n"
7393"map the old Python 2 names to the new names used in Python 3. The\n"
7394"*encoding* and *errors* tell pickle how to decode 8-bit string\n"
7395"instances pickled by Python 2; these default to \'ASCII\' and \'strict\',\n"
7396"respectively. The *encoding* can be \'bytes\' to read these 8-bit\n"
7397"string instances as bytes objects.");
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007398
7399#define _PICKLE_LOADS_METHODDEF \
7400 {"loads", (PyCFunction)_pickle_loads, METH_VARARGS|METH_KEYWORDS, _pickle_loads__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007401
7402static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007403_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports, const char *encoding, const char *errors);
7404
7405static PyObject *
7406_pickle_loads(PyModuleDef *module, PyObject *args, PyObject *kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007407{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007408 PyObject *return_value = NULL;
7409 static char *_keywords[] = {"data", "fix_imports", "encoding", "errors", NULL};
7410 PyObject *data;
7411 int fix_imports = 1;
7412 const char *encoding = "ASCII";
7413 const char *errors = "strict";
7414
7415 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
7416 "O|$pss:loads", _keywords,
7417 &data, &fix_imports, &encoding, &errors))
7418 goto exit;
7419 return_value = _pickle_loads_impl(module, data, fix_imports, encoding, errors);
7420
7421exit:
7422 return return_value;
7423}
7424
7425static PyObject *
7426_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports, const char *encoding, const char *errors)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007427/*[clinic checksum: 0663de43aca6c21508a777e29d98c9c3a6e7f72d]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007428{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007429 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007430 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007431
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007432 if (unpickler == NULL)
7433 return NULL;
7434
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007435 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007436 goto error;
7437
7438 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7439 goto error;
7440
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007441 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007442
7443 result = load(unpickler);
7444 Py_DECREF(unpickler);
7445 return result;
7446
7447 error:
7448 Py_XDECREF(unpickler);
7449 return NULL;
7450}
7451
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007452static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007453 _PICKLE_DUMP_METHODDEF
7454 _PICKLE_DUMPS_METHODDEF
7455 _PICKLE_LOAD_METHODDEF
7456 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007457 {NULL, NULL} /* sentinel */
7458};
7459
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007460static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007461pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007462{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007463 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007464 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007465}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007466
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007467static int
7468pickle_traverse(PyObject *m, visitproc visit, void *arg)
7469{
7470 PickleState *st = _Pickle_GetState(m);
7471 Py_VISIT(st->PickleError);
7472 Py_VISIT(st->PicklingError);
7473 Py_VISIT(st->UnpicklingError);
7474 Py_VISIT(st->dispatch_table);
7475 Py_VISIT(st->extension_registry);
7476 Py_VISIT(st->extension_cache);
7477 Py_VISIT(st->inverted_registry);
7478 Py_VISIT(st->name_mapping_2to3);
7479 Py_VISIT(st->import_mapping_2to3);
7480 Py_VISIT(st->name_mapping_3to2);
7481 Py_VISIT(st->import_mapping_3to2);
7482 Py_VISIT(st->codecs_encode);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007483 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007484}
7485
7486static struct PyModuleDef _picklemodule = {
7487 PyModuleDef_HEAD_INIT,
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007488 "_pickle", /* m_name */
7489 pickle_module_doc, /* m_doc */
7490 sizeof(PickleState), /* m_size */
7491 pickle_methods, /* m_methods */
7492 NULL, /* m_reload */
7493 pickle_traverse, /* m_traverse */
7494 pickle_clear, /* m_clear */
7495 NULL /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007496};
7497
7498PyMODINIT_FUNC
7499PyInit__pickle(void)
7500{
7501 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007502 PickleState *st;
7503
7504 m = PyState_FindModule(&_picklemodule);
7505 if (m) {
7506 Py_INCREF(m);
7507 return m;
7508 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007509
7510 if (PyType_Ready(&Unpickler_Type) < 0)
7511 return NULL;
7512 if (PyType_Ready(&Pickler_Type) < 0)
7513 return NULL;
7514 if (PyType_Ready(&Pdata_Type) < 0)
7515 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007516 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7517 return NULL;
7518 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7519 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007520
7521 /* Create the module and add the functions. */
7522 m = PyModule_Create(&_picklemodule);
7523 if (m == NULL)
7524 return NULL;
7525
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007526 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007527 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7528 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007529 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007530 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7531 return NULL;
7532
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007533 st = _Pickle_GetState(m);
7534
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007535 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007536 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7537 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007538 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007539 st->PicklingError = \
7540 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7541 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007542 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007543 st->UnpicklingError = \
7544 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7545 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007546 return NULL;
7547
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007548 Py_INCREF(st->PickleError);
7549 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007550 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007551 Py_INCREF(st->PicklingError);
7552 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007553 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007554 Py_INCREF(st->UnpicklingError);
7555 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007556 return NULL;
7557
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007558 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007559 return NULL;
7560
7561 return m;
7562}