blob: 330b17ddca54b24b33c4843c129521149445f0ab [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
4019The optional protocol argument tells the pickler to use the
4020given protocol; supported protocols are 0, 1, 2, 3 and 4. The
4021default protocol is 3; a backward-incompatible protocol designed for
4022Python 3.
4023
4024Specifying a negative protocol version selects the highest
4025protocol version supported. The higher the protocol used, the
4026more recent the version of Python needed to read the pickle
4027produced.
4028
4029The file argument must have a write() method that accepts a single
4030bytes argument. It can thus be a file object opened for binary
4031writing, a io.BytesIO instance, or any other custom object that
4032meets this interface.
4033
4034If fix_imports is True and protocol is less than 3, pickle will try to
4035map the new Python 3 names to the old module names used in Python 2,
4036so that the pickle data stream is readable with Python 2.
4037[clinic]*/
4038
4039PyDoc_STRVAR(_pickle_Pickler___init____doc__,
4040"__init__(file, protocol=None, fix_imports=True)\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004041"This takes a binary file for writing a pickle data stream.\n"
4042"\n"
4043"The optional protocol argument tells the pickler to use the\n"
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004044"given protocol; supported protocols are 0, 1, 2, 3 and 4. The\n"
4045"default protocol is 3; a backward-incompatible protocol designed for\n"
4046"Python 3.\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004047"\n"
4048"Specifying a negative protocol version selects the highest\n"
4049"protocol version supported. The higher the protocol used, the\n"
4050"more recent the version of Python needed to read the pickle\n"
4051"produced.\n"
4052"\n"
4053"The file argument must have a write() method that accepts a single\n"
4054"bytes argument. It can thus be a file object opened for binary\n"
4055"writing, a io.BytesIO instance, or any other custom object that\n"
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004056"meets this interface.\n"
4057"\n"
4058"If fix_imports is True and protocol is less than 3, pickle will try to\n"
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004059"map the new Python 3 names to the old module names used in Python 2,\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004060"so that the pickle data stream is readable with Python 2.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004061
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004062#define _PICKLE_PICKLER___INIT___METHODDEF \
4063 {"__init__", (PyCFunction)_pickle_Pickler___init__, METH_VARARGS|METH_KEYWORDS, _pickle_Pickler___init____doc__},
4064
4065static PyObject *
4066_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports);
4067
4068static PyObject *
4069_pickle_Pickler___init__(PyObject *self, PyObject *args, PyObject *kwargs)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004070{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004071 PyObject *return_value = NULL;
4072 static char *_keywords[] = {"file", "protocol", "fix_imports", NULL};
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004073 PyObject *file;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004074 PyObject *protocol = NULL;
4075 int fix_imports = 1;
4076
4077 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
4078 "O|Op:__init__", _keywords,
4079 &file, &protocol, &fix_imports))
4080 goto exit;
4081 return_value = _pickle_Pickler___init___impl((PicklerObject *)self, file, protocol, fix_imports);
4082
4083exit:
4084 return return_value;
4085}
4086
4087static PyObject *
4088_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports)
4089/*[clinic checksum: c99ff417bd703a74affc4b708167e56e135e8969]*/
4090{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004091 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004092 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004093
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004094 /* In case of multiple __init__() calls, clear previous content. */
4095 if (self->write != NULL)
4096 (void)Pickler_clear(self);
4097
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004098 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
4099 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004100
4101 if (_Pickler_SetOutputStream(self, file) < 0)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004102 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004103
4104 /* memo and output_buffer may have already been created in _Pickler_New */
4105 if (self->memo == NULL) {
4106 self->memo = PyMemoTable_New();
4107 if (self->memo == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004108 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004109 }
4110 self->output_len = 0;
4111 if (self->output_buffer == NULL) {
4112 self->max_output_len = WRITE_BUF_SIZE;
4113 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4114 self->max_output_len);
4115 if (self->output_buffer == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004116 return NULL;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004117 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004118
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004119 self->fast = 0;
4120 self->fast_nesting = 0;
4121 self->fast_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004122 self->pers_func = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004123 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) {
4124 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
4125 &PyId_persistent_id);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004126 if (self->pers_func == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004127 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004128 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004129 self->dispatch_table = NULL;
4130 if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) {
4131 self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
4132 &PyId_dispatch_table);
4133 if (self->dispatch_table == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004134 return NULL;
4135 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004136
4137 Py_RETURN_NONE;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004138}
4139
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004140/* Wrap the Clinic generated signature to slot it in tp_init. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004141static int
4142Pickler_init(PyObject *self, PyObject *args, PyObject *kwargs)
4143{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004144 PyObject *result = _pickle_Pickler___init__(self, args, kwargs);
4145 if (result == NULL) {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004146 return -1;
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004147 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004148 Py_DECREF(result);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004149 return 0;
4150}
4151
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004152/* Define a proxy object for the Pickler's internal memo object. This is to
4153 * avoid breaking code like:
4154 * pickler.memo.clear()
4155 * and
4156 * pickler.memo = saved_memo
4157 * Is this a good idea? Not really, but we don't want to break code that uses
4158 * it. Note that we don't implement the entire mapping API here. This is
4159 * intentional, as these should be treated as black-box implementation details.
4160 */
4161
4162typedef struct {
4163 PyObject_HEAD
4164 PicklerObject *pickler; /* Pickler whose memo table we're proxying. */
4165} PicklerMemoProxyObject;
4166
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004167/*[clinic]
4168_pickle.PicklerMemoProxy.clear
4169
4170 self: PicklerMemoProxyObject
4171
4172Remove all items from memo.
4173[clinic]*/
4174
4175PyDoc_STRVAR(_pickle_PicklerMemoProxy_clear__doc__,
4176"clear()\n"
4177"Remove all items from memo.");
4178
4179#define _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF \
4180 {"clear", (PyCFunction)_pickle_PicklerMemoProxy_clear, METH_NOARGS, _pickle_PicklerMemoProxy_clear__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004181
4182static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004183_pickle_PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4184/*[clinic checksum: 507f13938721992e175a3e58b5ad02620045a1cc]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004185{
4186 if (self->pickler->memo)
4187 PyMemoTable_Clear(self->pickler->memo);
4188 Py_RETURN_NONE;
4189}
4190
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004191/*[clinic]
4192_pickle.PicklerMemoProxy.copy
4193
4194 self: PicklerMemoProxyObject
4195
4196Copy the memo to a new object.
4197[clinic]*/
4198
4199PyDoc_STRVAR(_pickle_PicklerMemoProxy_copy__doc__,
4200"copy()\n"
4201"Copy the memo to a new object.");
4202
4203#define _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF \
4204 {"copy", (PyCFunction)_pickle_PicklerMemoProxy_copy, METH_NOARGS, _pickle_PicklerMemoProxy_copy__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004205
4206static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004207_pickle_PicklerMemoProxy_copy(PicklerMemoProxyObject *self)
4208/*[clinic checksum: 73a5117ab354290ebdbe07bd0bf7232d0936a69d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004209{
4210 Py_ssize_t i;
4211 PyMemoTable *memo;
4212 PyObject *new_memo = PyDict_New();
4213 if (new_memo == NULL)
4214 return NULL;
4215
4216 memo = self->pickler->memo;
4217 for (i = 0; i < memo->mt_allocated; ++i) {
4218 PyMemoEntry entry = memo->mt_table[i];
4219 if (entry.me_key != NULL) {
4220 int status;
4221 PyObject *key, *value;
4222
4223 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004224 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004225
4226 if (key == NULL || value == NULL) {
4227 Py_XDECREF(key);
4228 Py_XDECREF(value);
4229 goto error;
4230 }
4231 status = PyDict_SetItem(new_memo, key, value);
4232 Py_DECREF(key);
4233 Py_DECREF(value);
4234 if (status < 0)
4235 goto error;
4236 }
4237 }
4238 return new_memo;
4239
4240 error:
4241 Py_XDECREF(new_memo);
4242 return NULL;
4243}
4244
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004245/*[clinic]
4246_pickle.PicklerMemoProxy.__reduce__
4247
4248 self: PicklerMemoProxyObject
4249
4250Implement pickle support.
4251[clinic]*/
4252
4253PyDoc_STRVAR(_pickle_PicklerMemoProxy___reduce____doc__,
4254"__reduce__()\n"
4255"Implement pickle support.");
4256
4257#define _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF \
4258 {"__reduce__", (PyCFunction)_pickle_PicklerMemoProxy___reduce__, METH_NOARGS, _pickle_PicklerMemoProxy___reduce____doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004259
4260static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004261_pickle_PicklerMemoProxy___reduce__(PicklerMemoProxyObject *self)
4262/*[clinic checksum: 40f0bf7a9b161e77130674f0481bda0a0184dcce]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004263{
4264 PyObject *reduce_value, *dict_args;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004265 PyObject *contents = _pickle_PicklerMemoProxy_copy(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004266 if (contents == NULL)
4267 return NULL;
4268
4269 reduce_value = PyTuple_New(2);
4270 if (reduce_value == NULL) {
4271 Py_DECREF(contents);
4272 return NULL;
4273 }
4274 dict_args = PyTuple_New(1);
4275 if (dict_args == NULL) {
4276 Py_DECREF(contents);
4277 Py_DECREF(reduce_value);
4278 return NULL;
4279 }
4280 PyTuple_SET_ITEM(dict_args, 0, contents);
4281 Py_INCREF((PyObject *)&PyDict_Type);
4282 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4283 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4284 return reduce_value;
4285}
4286
4287static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004288 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4289 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4290 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004291 {NULL, NULL} /* sentinel */
4292};
4293
4294static void
4295PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4296{
4297 PyObject_GC_UnTrack(self);
4298 Py_XDECREF(self->pickler);
4299 PyObject_GC_Del((PyObject *)self);
4300}
4301
4302static int
4303PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4304 visitproc visit, void *arg)
4305{
4306 Py_VISIT(self->pickler);
4307 return 0;
4308}
4309
4310static int
4311PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4312{
4313 Py_CLEAR(self->pickler);
4314 return 0;
4315}
4316
4317static PyTypeObject PicklerMemoProxyType = {
4318 PyVarObject_HEAD_INIT(NULL, 0)
4319 "_pickle.PicklerMemoProxy", /*tp_name*/
4320 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4321 0,
4322 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4323 0, /* tp_print */
4324 0, /* tp_getattr */
4325 0, /* tp_setattr */
4326 0, /* tp_compare */
4327 0, /* tp_repr */
4328 0, /* tp_as_number */
4329 0, /* tp_as_sequence */
4330 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004331 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004332 0, /* tp_call */
4333 0, /* tp_str */
4334 PyObject_GenericGetAttr, /* tp_getattro */
4335 PyObject_GenericSetAttr, /* tp_setattro */
4336 0, /* tp_as_buffer */
4337 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4338 0, /* tp_doc */
4339 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4340 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4341 0, /* tp_richcompare */
4342 0, /* tp_weaklistoffset */
4343 0, /* tp_iter */
4344 0, /* tp_iternext */
4345 picklerproxy_methods, /* tp_methods */
4346};
4347
4348static PyObject *
4349PicklerMemoProxy_New(PicklerObject *pickler)
4350{
4351 PicklerMemoProxyObject *self;
4352
4353 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4354 if (self == NULL)
4355 return NULL;
4356 Py_INCREF(pickler);
4357 self->pickler = pickler;
4358 PyObject_GC_Track(self);
4359 return (PyObject *)self;
4360}
4361
4362/*****************************************************************************/
4363
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004364static PyObject *
4365Pickler_get_memo(PicklerObject *self)
4366{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004367 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004368}
4369
4370static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004371Pickler_set_memo(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004372{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004373 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004374
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004375 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004376 PyErr_SetString(PyExc_TypeError,
4377 "attribute deletion is not supported");
4378 return -1;
4379 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004380
4381 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4382 PicklerObject *pickler =
4383 ((PicklerMemoProxyObject *)obj)->pickler;
4384
4385 new_memo = PyMemoTable_Copy(pickler->memo);
4386 if (new_memo == NULL)
4387 return -1;
4388 }
4389 else if (PyDict_Check(obj)) {
4390 Py_ssize_t i = 0;
4391 PyObject *key, *value;
4392
4393 new_memo = PyMemoTable_New();
4394 if (new_memo == NULL)
4395 return -1;
4396
4397 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004398 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004399 PyObject *memo_obj;
4400
4401 if (!PyTuple_Check(value) || Py_SIZE(value) != 2) {
4402 PyErr_SetString(PyExc_TypeError,
4403 "'memo' values must be 2-item tuples");
4404 goto error;
4405 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004406 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004407 if (memo_id == -1 && PyErr_Occurred())
4408 goto error;
4409 memo_obj = PyTuple_GET_ITEM(value, 1);
4410 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4411 goto error;
4412 }
4413 }
4414 else {
4415 PyErr_Format(PyExc_TypeError,
4416 "'memo' attribute must be an PicklerMemoProxy object"
4417 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004418 return -1;
4419 }
4420
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004421 PyMemoTable_Del(self->memo);
4422 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004423
4424 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004425
4426 error:
4427 if (new_memo)
4428 PyMemoTable_Del(new_memo);
4429 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004430}
4431
4432static PyObject *
4433Pickler_get_persid(PicklerObject *self)
4434{
4435 if (self->pers_func == NULL)
4436 PyErr_SetString(PyExc_AttributeError, "persistent_id");
4437 else
4438 Py_INCREF(self->pers_func);
4439 return self->pers_func;
4440}
4441
4442static int
4443Pickler_set_persid(PicklerObject *self, PyObject *value)
4444{
4445 PyObject *tmp;
4446
4447 if (value == NULL) {
4448 PyErr_SetString(PyExc_TypeError,
4449 "attribute deletion is not supported");
4450 return -1;
4451 }
4452 if (!PyCallable_Check(value)) {
4453 PyErr_SetString(PyExc_TypeError,
4454 "persistent_id must be a callable taking one argument");
4455 return -1;
4456 }
4457
4458 tmp = self->pers_func;
4459 Py_INCREF(value);
4460 self->pers_func = value;
4461 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
4462
4463 return 0;
4464}
4465
4466static PyMemberDef Pickler_members[] = {
4467 {"bin", T_INT, offsetof(PicklerObject, bin)},
4468 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004469 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004470 {NULL}
4471};
4472
4473static PyGetSetDef Pickler_getsets[] = {
4474 {"memo", (getter)Pickler_get_memo,
4475 (setter)Pickler_set_memo},
4476 {"persistent_id", (getter)Pickler_get_persid,
4477 (setter)Pickler_set_persid},
4478 {NULL}
4479};
4480
4481static PyTypeObject Pickler_Type = {
4482 PyVarObject_HEAD_INIT(NULL, 0)
4483 "_pickle.Pickler" , /*tp_name*/
4484 sizeof(PicklerObject), /*tp_basicsize*/
4485 0, /*tp_itemsize*/
4486 (destructor)Pickler_dealloc, /*tp_dealloc*/
4487 0, /*tp_print*/
4488 0, /*tp_getattr*/
4489 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00004490 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004491 0, /*tp_repr*/
4492 0, /*tp_as_number*/
4493 0, /*tp_as_sequence*/
4494 0, /*tp_as_mapping*/
4495 0, /*tp_hash*/
4496 0, /*tp_call*/
4497 0, /*tp_str*/
4498 0, /*tp_getattro*/
4499 0, /*tp_setattro*/
4500 0, /*tp_as_buffer*/
4501 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004502 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004503 (traverseproc)Pickler_traverse, /*tp_traverse*/
4504 (inquiry)Pickler_clear, /*tp_clear*/
4505 0, /*tp_richcompare*/
4506 0, /*tp_weaklistoffset*/
4507 0, /*tp_iter*/
4508 0, /*tp_iternext*/
4509 Pickler_methods, /*tp_methods*/
4510 Pickler_members, /*tp_members*/
4511 Pickler_getsets, /*tp_getset*/
4512 0, /*tp_base*/
4513 0, /*tp_dict*/
4514 0, /*tp_descr_get*/
4515 0, /*tp_descr_set*/
4516 0, /*tp_dictoffset*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004517 Pickler_init, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004518 PyType_GenericAlloc, /*tp_alloc*/
4519 PyType_GenericNew, /*tp_new*/
4520 PyObject_GC_Del, /*tp_free*/
4521 0, /*tp_is_gc*/
4522};
4523
Victor Stinner121aab42011-09-29 23:40:53 +02004524/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004525
4526 XXX: It would be nice to able to avoid Python function call overhead, by
4527 using directly the C version of find_class(), when find_class() is not
4528 overridden by a subclass. Although, this could become rather hackish. A
4529 simpler optimization would be to call the C function when self is not a
4530 subclass instance. */
4531static PyObject *
4532find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4533{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004534 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004535
4536 return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO",
4537 module_name, global_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004538}
4539
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004540static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004541marker(UnpicklerObject *self)
4542{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004543 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004544 if (self->num_marks < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004545 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004546 return -1;
4547 }
4548
4549 return self->marks[--self->num_marks];
4550}
4551
4552static int
4553load_none(UnpicklerObject *self)
4554{
4555 PDATA_APPEND(self->stack, Py_None, -1);
4556 return 0;
4557}
4558
4559static int
4560bad_readline(void)
4561{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004562 PickleState *st = _Pickle_GetGlobalState();
4563 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004564 return -1;
4565}
4566
4567static int
4568load_int(UnpicklerObject *self)
4569{
4570 PyObject *value;
4571 char *endptr, *s;
4572 Py_ssize_t len;
4573 long x;
4574
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004575 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004576 return -1;
4577 if (len < 2)
4578 return bad_readline();
4579
4580 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02004581 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004582 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004583 x = strtol(s, &endptr, 0);
4584
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004585 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004586 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03004587 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004588 errno = 0;
4589 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004590 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004591 if (value == NULL) {
4592 PyErr_SetString(PyExc_ValueError,
4593 "could not convert string to int");
4594 return -1;
4595 }
4596 }
4597 else {
4598 if (len == 3 && (x == 0 || x == 1)) {
4599 if ((value = PyBool_FromLong(x)) == NULL)
4600 return -1;
4601 }
4602 else {
4603 if ((value = PyLong_FromLong(x)) == NULL)
4604 return -1;
4605 }
4606 }
4607
4608 PDATA_PUSH(self->stack, value, -1);
4609 return 0;
4610}
4611
4612static int
4613load_bool(UnpicklerObject *self, PyObject *boolean)
4614{
4615 assert(boolean == Py_True || boolean == Py_False);
4616 PDATA_APPEND(self->stack, boolean, -1);
4617 return 0;
4618}
4619
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004620/* s contains x bytes of an unsigned little-endian integer. Return its value
4621 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4622 */
4623static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004624calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004625{
4626 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004627 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004628 size_t x = 0;
4629
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004630 for (i = 0; i < nbytes && i < sizeof(size_t); i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004631 x |= (size_t) s[i] << (8 * i);
4632 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004633
4634 if (x > PY_SSIZE_T_MAX)
4635 return -1;
4636 else
4637 return (Py_ssize_t) x;
4638}
4639
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004640/* s contains x bytes of a little-endian integer. Return its value as a
4641 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
4642 * int, but when x is 4 it's a signed one. This is an historical source
4643 * of x-platform bugs.
4644 */
4645static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004646calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004647{
4648 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004649 int i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004650 long x = 0;
4651
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004652 for (i = 0; i < nbytes; i++) {
4653 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004654 }
4655
4656 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4657 * is signed, so on a box with longs bigger than 4 bytes we need
4658 * to extend a BININT's sign bit to the full width.
4659 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004660 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004661 x |= -(x & (1L << 31));
4662 }
4663
4664 return x;
4665}
4666
4667static int
4668load_binintx(UnpicklerObject *self, char *s, int size)
4669{
4670 PyObject *value;
4671 long x;
4672
4673 x = calc_binint(s, size);
4674
4675 if ((value = PyLong_FromLong(x)) == NULL)
4676 return -1;
4677
4678 PDATA_PUSH(self->stack, value, -1);
4679 return 0;
4680}
4681
4682static int
4683load_binint(UnpicklerObject *self)
4684{
4685 char *s;
4686
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004687 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004688 return -1;
4689
4690 return load_binintx(self, s, 4);
4691}
4692
4693static int
4694load_binint1(UnpicklerObject *self)
4695{
4696 char *s;
4697
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004698 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004699 return -1;
4700
4701 return load_binintx(self, s, 1);
4702}
4703
4704static int
4705load_binint2(UnpicklerObject *self)
4706{
4707 char *s;
4708
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004709 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004710 return -1;
4711
4712 return load_binintx(self, s, 2);
4713}
4714
4715static int
4716load_long(UnpicklerObject *self)
4717{
4718 PyObject *value;
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004719 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004720 Py_ssize_t len;
4721
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004722 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004723 return -1;
4724 if (len < 2)
4725 return bad_readline();
4726
Mark Dickinson8dd05142009-01-20 20:43:58 +00004727 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4728 the 'L' before calling PyLong_FromString. In order to maintain
4729 compatibility with Python 3.0.0, we don't actually *require*
4730 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004731 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004732 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00004733 /* XXX: Should the base argument explicitly set to 10? */
4734 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00004735 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004736 return -1;
4737
4738 PDATA_PUSH(self->stack, value, -1);
4739 return 0;
4740}
4741
4742/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4743 * data following.
4744 */
4745static int
4746load_counted_long(UnpicklerObject *self, int size)
4747{
4748 PyObject *value;
4749 char *nbytes;
4750 char *pdata;
4751
4752 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004753 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004754 return -1;
4755
4756 size = calc_binint(nbytes, size);
4757 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004758 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004759 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004760 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004761 "LONG pickle has negative byte count");
4762 return -1;
4763 }
4764
4765 if (size == 0)
4766 value = PyLong_FromLong(0L);
4767 else {
4768 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004769 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004770 return -1;
4771 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
4772 1 /* little endian */ , 1 /* signed */ );
4773 }
4774 if (value == NULL)
4775 return -1;
4776 PDATA_PUSH(self->stack, value, -1);
4777 return 0;
4778}
4779
4780static int
4781load_float(UnpicklerObject *self)
4782{
4783 PyObject *value;
4784 char *endptr, *s;
4785 Py_ssize_t len;
4786 double d;
4787
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004788 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004789 return -1;
4790 if (len < 2)
4791 return bad_readline();
4792
4793 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004794 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
4795 if (d == -1.0 && PyErr_Occurred())
4796 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004797 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004798 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
4799 return -1;
4800 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00004801 value = PyFloat_FromDouble(d);
4802 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004803 return -1;
4804
4805 PDATA_PUSH(self->stack, value, -1);
4806 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004807}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004808
4809static int
4810load_binfloat(UnpicklerObject *self)
4811{
4812 PyObject *value;
4813 double x;
4814 char *s;
4815
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004816 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004817 return -1;
4818
4819 x = _PyFloat_Unpack8((unsigned char *)s, 0);
4820 if (x == -1.0 && PyErr_Occurred())
4821 return -1;
4822
4823 if ((value = PyFloat_FromDouble(x)) == NULL)
4824 return -1;
4825
4826 PDATA_PUSH(self->stack, value, -1);
4827 return 0;
4828}
4829
4830static int
4831load_string(UnpicklerObject *self)
4832{
4833 PyObject *bytes;
4834 PyObject *str = NULL;
4835 Py_ssize_t len;
4836 char *s, *p;
4837
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004838 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004839 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004840 /* Strip the newline */
4841 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004842 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004843 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004844 p = s + 1;
4845 len -= 2;
4846 }
4847 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004848 PickleState *st = _Pickle_GetGlobalState();
4849 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004850 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004851 return -1;
4852 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004853 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004854
4855 /* Use the PyBytes API to decode the string, since that is what is used
4856 to encode, and then coerce the result to Unicode. */
4857 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004858 if (bytes == NULL)
4859 return -1;
4860 str = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
4861 Py_DECREF(bytes);
4862 if (str == NULL)
4863 return -1;
4864
4865 PDATA_PUSH(self->stack, str, -1);
4866 return 0;
4867}
4868
4869static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004870load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004871{
4872 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004873 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004874 char *s;
4875
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004876 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004877 return -1;
4878
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004879 size = calc_binsize(s, nbytes);
4880 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004881 PyErr_Format(PyExc_OverflowError,
4882 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004883 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004884 return -1;
4885 }
4886
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004887 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004888 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004889
4890 bytes = PyBytes_FromStringAndSize(s, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004891 if (bytes == NULL)
4892 return -1;
4893
4894 PDATA_PUSH(self->stack, bytes, -1);
4895 return 0;
4896}
4897
4898static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004899load_counted_binstring(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004900{
4901 PyObject *str;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004902 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004903 char *s;
4904
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004905 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004906 return -1;
4907
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004908 size = calc_binsize(s, nbytes);
4909 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004910 PickleState *st = _Pickle_GetGlobalState();
4911 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004912 "BINSTRING exceeds system's maximum size of %zd bytes",
4913 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004914 return -1;
4915 }
4916
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004917 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004918 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004919 /* Convert Python 2.x strings to unicode. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004920 str = PyUnicode_Decode(s, size, self->encoding, self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004921 if (str == NULL)
4922 return -1;
4923
4924 PDATA_PUSH(self->stack, str, -1);
4925 return 0;
4926}
4927
4928static int
4929load_unicode(UnpicklerObject *self)
4930{
4931 PyObject *str;
4932 Py_ssize_t len;
4933 char *s;
4934
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004935 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004936 return -1;
4937 if (len < 1)
4938 return bad_readline();
4939
4940 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
4941 if (str == NULL)
4942 return -1;
4943
4944 PDATA_PUSH(self->stack, str, -1);
4945 return 0;
4946}
4947
4948static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004949load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004950{
4951 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004952 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004953 char *s;
4954
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004955 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004956 return -1;
4957
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004958 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004959 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004960 PyErr_Format(PyExc_OverflowError,
4961 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004962 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004963 return -1;
4964 }
4965
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004966 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004967 return -1;
4968
Victor Stinner485fb562010-04-13 11:07:24 +00004969 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004970 if (str == NULL)
4971 return -1;
4972
4973 PDATA_PUSH(self->stack, str, -1);
4974 return 0;
4975}
4976
4977static int
4978load_tuple(UnpicklerObject *self)
4979{
4980 PyObject *tuple;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004981 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004982
4983 if ((i = marker(self)) < 0)
4984 return -1;
4985
4986 tuple = Pdata_poptuple(self->stack, i);
4987 if (tuple == NULL)
4988 return -1;
4989 PDATA_PUSH(self->stack, tuple, -1);
4990 return 0;
4991}
4992
4993static int
4994load_counted_tuple(UnpicklerObject *self, int len)
4995{
4996 PyObject *tuple;
4997
4998 tuple = PyTuple_New(len);
4999 if (tuple == NULL)
5000 return -1;
5001
5002 while (--len >= 0) {
5003 PyObject *item;
5004
5005 PDATA_POP(self->stack, item);
5006 if (item == NULL)
5007 return -1;
5008 PyTuple_SET_ITEM(tuple, len, item);
5009 }
5010 PDATA_PUSH(self->stack, tuple, -1);
5011 return 0;
5012}
5013
5014static int
5015load_empty_list(UnpicklerObject *self)
5016{
5017 PyObject *list;
5018
5019 if ((list = PyList_New(0)) == NULL)
5020 return -1;
5021 PDATA_PUSH(self->stack, list, -1);
5022 return 0;
5023}
5024
5025static int
5026load_empty_dict(UnpicklerObject *self)
5027{
5028 PyObject *dict;
5029
5030 if ((dict = PyDict_New()) == NULL)
5031 return -1;
5032 PDATA_PUSH(self->stack, dict, -1);
5033 return 0;
5034}
5035
5036static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005037load_empty_set(UnpicklerObject *self)
5038{
5039 PyObject *set;
5040
5041 if ((set = PySet_New(NULL)) == NULL)
5042 return -1;
5043 PDATA_PUSH(self->stack, set, -1);
5044 return 0;
5045}
5046
5047static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005048load_list(UnpicklerObject *self)
5049{
5050 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005051 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005052
5053 if ((i = marker(self)) < 0)
5054 return -1;
5055
5056 list = Pdata_poplist(self->stack, i);
5057 if (list == NULL)
5058 return -1;
5059 PDATA_PUSH(self->stack, list, -1);
5060 return 0;
5061}
5062
5063static int
5064load_dict(UnpicklerObject *self)
5065{
5066 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005067 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005068
5069 if ((i = marker(self)) < 0)
5070 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005071 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005072
5073 if ((dict = PyDict_New()) == NULL)
5074 return -1;
5075
5076 for (k = i + 1; k < j; k += 2) {
5077 key = self->stack->data[k - 1];
5078 value = self->stack->data[k];
5079 if (PyDict_SetItem(dict, key, value) < 0) {
5080 Py_DECREF(dict);
5081 return -1;
5082 }
5083 }
5084 Pdata_clear(self->stack, i);
5085 PDATA_PUSH(self->stack, dict, -1);
5086 return 0;
5087}
5088
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005089static int
5090load_frozenset(UnpicklerObject *self)
5091{
5092 PyObject *items;
5093 PyObject *frozenset;
5094 Py_ssize_t i;
5095
5096 if ((i = marker(self)) < 0)
5097 return -1;
5098
5099 items = Pdata_poptuple(self->stack, i);
5100 if (items == NULL)
5101 return -1;
5102
5103 frozenset = PyFrozenSet_New(items);
5104 Py_DECREF(items);
5105 if (frozenset == NULL)
5106 return -1;
5107
5108 PDATA_PUSH(self->stack, frozenset, -1);
5109 return 0;
5110}
5111
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005112static PyObject *
5113instantiate(PyObject *cls, PyObject *args)
5114{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005115 PyObject *result = NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005116 _Py_IDENTIFIER(__getinitargs__);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005117 /* Caller must assure args are a tuple. Normally, args come from
5118 Pdata_poptuple which packs objects from the top of the stack
5119 into a newly created tuple. */
5120 assert(PyTuple_Check(args));
5121 if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005122 _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005123 result = PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005124 }
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005125 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005126 _Py_IDENTIFIER(__new__);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005127
5128 result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005129 }
5130 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005131}
5132
5133static int
5134load_obj(UnpicklerObject *self)
5135{
5136 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005137 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005138
5139 if ((i = marker(self)) < 0)
5140 return -1;
5141
5142 args = Pdata_poptuple(self->stack, i + 1);
5143 if (args == NULL)
5144 return -1;
5145
5146 PDATA_POP(self->stack, cls);
5147 if (cls) {
5148 obj = instantiate(cls, args);
5149 Py_DECREF(cls);
5150 }
5151 Py_DECREF(args);
5152 if (obj == NULL)
5153 return -1;
5154
5155 PDATA_PUSH(self->stack, obj, -1);
5156 return 0;
5157}
5158
5159static int
5160load_inst(UnpicklerObject *self)
5161{
5162 PyObject *cls = NULL;
5163 PyObject *args = NULL;
5164 PyObject *obj = NULL;
5165 PyObject *module_name;
5166 PyObject *class_name;
5167 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005168 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005169 char *s;
5170
5171 if ((i = marker(self)) < 0)
5172 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005173 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005174 return -1;
5175 if (len < 2)
5176 return bad_readline();
5177
5178 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5179 identifiers are permitted in Python 3.0, since the INST opcode is only
5180 supported by older protocols on Python 2.x. */
5181 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5182 if (module_name == NULL)
5183 return -1;
5184
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005185 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005186 if (len < 2)
5187 return bad_readline();
5188 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005189 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005190 cls = find_class(self, module_name, class_name);
5191 Py_DECREF(class_name);
5192 }
5193 }
5194 Py_DECREF(module_name);
5195
5196 if (cls == NULL)
5197 return -1;
5198
5199 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5200 obj = instantiate(cls, args);
5201 Py_DECREF(args);
5202 }
5203 Py_DECREF(cls);
5204
5205 if (obj == NULL)
5206 return -1;
5207
5208 PDATA_PUSH(self->stack, obj, -1);
5209 return 0;
5210}
5211
5212static int
5213load_newobj(UnpicklerObject *self)
5214{
5215 PyObject *args = NULL;
5216 PyObject *clsraw = NULL;
5217 PyTypeObject *cls; /* clsraw cast to its true type */
5218 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005219 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005220
5221 /* Stack is ... cls argtuple, and we want to call
5222 * cls.__new__(cls, *argtuple).
5223 */
5224 PDATA_POP(self->stack, args);
5225 if (args == NULL)
5226 goto error;
5227 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005228 PyErr_SetString(st->UnpicklingError,
5229 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005230 goto error;
5231 }
5232
5233 PDATA_POP(self->stack, clsraw);
5234 cls = (PyTypeObject *)clsraw;
5235 if (cls == NULL)
5236 goto error;
5237 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005238 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005239 "isn't a type object");
5240 goto error;
5241 }
5242 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005243 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005244 "has NULL tp_new");
5245 goto error;
5246 }
5247
5248 /* Call __new__. */
5249 obj = cls->tp_new(cls, args, NULL);
5250 if (obj == NULL)
5251 goto error;
5252
5253 Py_DECREF(args);
5254 Py_DECREF(clsraw);
5255 PDATA_PUSH(self->stack, obj, -1);
5256 return 0;
5257
5258 error:
5259 Py_XDECREF(args);
5260 Py_XDECREF(clsraw);
5261 return -1;
5262}
5263
5264static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005265load_newobj_ex(UnpicklerObject *self)
5266{
5267 PyObject *cls, *args, *kwargs;
5268 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005269 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005270
5271 PDATA_POP(self->stack, kwargs);
5272 if (kwargs == NULL) {
5273 return -1;
5274 }
5275 PDATA_POP(self->stack, args);
5276 if (args == NULL) {
5277 Py_DECREF(kwargs);
5278 return -1;
5279 }
5280 PDATA_POP(self->stack, cls);
5281 if (cls == NULL) {
5282 Py_DECREF(kwargs);
5283 Py_DECREF(args);
5284 return -1;
5285 }
5286
5287 if (!PyType_Check(cls)) {
5288 Py_DECREF(kwargs);
5289 Py_DECREF(args);
5290 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005291 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005292 "NEWOBJ_EX class argument must be a type, not %.200s",
5293 Py_TYPE(cls)->tp_name);
5294 return -1;
5295 }
5296
5297 if (((PyTypeObject *)cls)->tp_new == NULL) {
5298 Py_DECREF(kwargs);
5299 Py_DECREF(args);
5300 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005301 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005302 "NEWOBJ_EX class argument doesn't have __new__");
5303 return -1;
5304 }
5305 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5306 Py_DECREF(kwargs);
5307 Py_DECREF(args);
5308 Py_DECREF(cls);
5309 if (obj == NULL) {
5310 return -1;
5311 }
5312 PDATA_PUSH(self->stack, obj, -1);
5313 return 0;
5314}
5315
5316static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005317load_global(UnpicklerObject *self)
5318{
5319 PyObject *global = NULL;
5320 PyObject *module_name;
5321 PyObject *global_name;
5322 Py_ssize_t len;
5323 char *s;
5324
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005325 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005326 return -1;
5327 if (len < 2)
5328 return bad_readline();
5329 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5330 if (!module_name)
5331 return -1;
5332
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005333 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005334 if (len < 2) {
5335 Py_DECREF(module_name);
5336 return bad_readline();
5337 }
5338 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5339 if (global_name) {
5340 global = find_class(self, module_name, global_name);
5341 Py_DECREF(global_name);
5342 }
5343 }
5344 Py_DECREF(module_name);
5345
5346 if (global == NULL)
5347 return -1;
5348 PDATA_PUSH(self->stack, global, -1);
5349 return 0;
5350}
5351
5352static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005353load_stack_global(UnpicklerObject *self)
5354{
5355 PyObject *global;
5356 PyObject *module_name;
5357 PyObject *global_name;
5358
5359 PDATA_POP(self->stack, global_name);
5360 PDATA_POP(self->stack, module_name);
5361 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5362 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005363 PickleState *st = _Pickle_GetGlobalState();
5364 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005365 Py_XDECREF(global_name);
5366 Py_XDECREF(module_name);
5367 return -1;
5368 }
5369 global = find_class(self, module_name, global_name);
5370 Py_DECREF(global_name);
5371 Py_DECREF(module_name);
5372 if (global == NULL)
5373 return -1;
5374 PDATA_PUSH(self->stack, global, -1);
5375 return 0;
5376}
5377
5378static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005379load_persid(UnpicklerObject *self)
5380{
5381 PyObject *pid;
5382 Py_ssize_t len;
5383 char *s;
5384
5385 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005386 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005387 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08005388 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005389 return bad_readline();
5390
5391 pid = PyBytes_FromStringAndSize(s, len - 1);
5392 if (pid == NULL)
5393 return -1;
5394
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005395 /* This does not leak since _Pickle_FastCall() steals the reference
5396 to pid first. */
5397 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005398 if (pid == NULL)
5399 return -1;
5400
5401 PDATA_PUSH(self->stack, pid, -1);
5402 return 0;
5403 }
5404 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005405 PickleState *st = _Pickle_GetGlobalState();
5406 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005407 "A load persistent id instruction was encountered,\n"
5408 "but no persistent_load function was specified.");
5409 return -1;
5410 }
5411}
5412
5413static int
5414load_binpersid(UnpicklerObject *self)
5415{
5416 PyObject *pid;
5417
5418 if (self->pers_func) {
5419 PDATA_POP(self->stack, pid);
5420 if (pid == NULL)
5421 return -1;
5422
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005423 /* This does not leak since _Pickle_FastCall() steals the
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005424 reference to pid first. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005425 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005426 if (pid == NULL)
5427 return -1;
5428
5429 PDATA_PUSH(self->stack, pid, -1);
5430 return 0;
5431 }
5432 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005433 PickleState *st = _Pickle_GetGlobalState();
5434 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005435 "A load persistent id instruction was encountered,\n"
5436 "but no persistent_load function was specified.");
5437 return -1;
5438 }
5439}
5440
5441static int
5442load_pop(UnpicklerObject *self)
5443{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005444 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005445
5446 /* Note that we split the (pickle.py) stack into two stacks,
5447 * an object stack and a mark stack. We have to be clever and
5448 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005449 * mark stack first, and only signalling a stack underflow if
5450 * the object stack is empty and the mark stack doesn't match
5451 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005452 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005453 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005454 self->num_marks--;
Antoine Pitrou01a15ea2010-01-07 17:57:31 +00005455 } else if (len > 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005456 len--;
5457 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005458 Py_SIZE(self->stack) = len;
Collin Winter8ca69de2009-05-26 16:53:41 +00005459 } else {
5460 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005461 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005462 return 0;
5463}
5464
5465static int
5466load_pop_mark(UnpicklerObject *self)
5467{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005468 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005469
5470 if ((i = marker(self)) < 0)
5471 return -1;
5472
5473 Pdata_clear(self->stack, i);
5474
5475 return 0;
5476}
5477
5478static int
5479load_dup(UnpicklerObject *self)
5480{
5481 PyObject *last;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005482 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005483
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005484 if ((len = Py_SIZE(self->stack)) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005485 return stack_underflow();
5486 last = self->stack->data[len - 1];
5487 PDATA_APPEND(self->stack, last, -1);
5488 return 0;
5489}
5490
5491static int
5492load_get(UnpicklerObject *self)
5493{
5494 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005495 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005496 Py_ssize_t len;
5497 char *s;
5498
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005499 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005500 return -1;
5501 if (len < 2)
5502 return bad_readline();
5503
5504 key = PyLong_FromString(s, NULL, 10);
5505 if (key == NULL)
5506 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005507 idx = PyLong_AsSsize_t(key);
5508 if (idx == -1 && PyErr_Occurred()) {
5509 Py_DECREF(key);
5510 return -1;
5511 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005512
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005513 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005514 if (value == NULL) {
5515 if (!PyErr_Occurred())
5516 PyErr_SetObject(PyExc_KeyError, key);
5517 Py_DECREF(key);
5518 return -1;
5519 }
5520 Py_DECREF(key);
5521
5522 PDATA_APPEND(self->stack, value, -1);
5523 return 0;
5524}
5525
5526static int
5527load_binget(UnpicklerObject *self)
5528{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005529 PyObject *value;
5530 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005531 char *s;
5532
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005533 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005534 return -1;
5535
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005536 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005537
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005538 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005539 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005540 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005541 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005542 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005543 Py_DECREF(key);
5544 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005545 return -1;
5546 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005547
5548 PDATA_APPEND(self->stack, value, -1);
5549 return 0;
5550}
5551
5552static int
5553load_long_binget(UnpicklerObject *self)
5554{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005555 PyObject *value;
5556 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005557 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005558
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005559 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005560 return -1;
5561
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005562 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005563
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005564 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005565 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005566 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005567 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005568 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005569 Py_DECREF(key);
5570 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005571 return -1;
5572 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005573
5574 PDATA_APPEND(self->stack, value, -1);
5575 return 0;
5576}
5577
5578/* Push an object from the extension registry (EXT[124]). nbytes is
5579 * the number of bytes following the opcode, holding the index (code) value.
5580 */
5581static int
5582load_extension(UnpicklerObject *self, int nbytes)
5583{
5584 char *codebytes; /* the nbytes bytes after the opcode */
5585 long code; /* calc_binint returns long */
5586 PyObject *py_code; /* code as a Python int */
5587 PyObject *obj; /* the object to push */
5588 PyObject *pair; /* (module_name, class_name) */
5589 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005590 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005591
5592 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005593 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005594 return -1;
5595 code = calc_binint(codebytes, nbytes);
5596 if (code <= 0) { /* note that 0 is forbidden */
5597 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005598 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005599 return -1;
5600 }
5601
5602 /* Look for the code in the cache. */
5603 py_code = PyLong_FromLong(code);
5604 if (py_code == NULL)
5605 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005606 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005607 if (obj != NULL) {
5608 /* Bingo. */
5609 Py_DECREF(py_code);
5610 PDATA_APPEND(self->stack, obj, -1);
5611 return 0;
5612 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005613 if (PyErr_Occurred()) {
5614 Py_DECREF(py_code);
5615 return -1;
5616 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005617
5618 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005619 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005620 if (pair == NULL) {
5621 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005622 if (!PyErr_Occurred()) {
5623 PyErr_Format(PyExc_ValueError, "unregistered extension "
5624 "code %ld", code);
5625 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005626 return -1;
5627 }
5628 /* Since the extension registry is manipulable via Python code,
5629 * confirm that pair is really a 2-tuple of strings.
5630 */
5631 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5632 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5633 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5634 Py_DECREF(py_code);
5635 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5636 "isn't a 2-tuple of strings", code);
5637 return -1;
5638 }
5639 /* Load the object. */
5640 obj = find_class(self, module_name, class_name);
5641 if (obj == NULL) {
5642 Py_DECREF(py_code);
5643 return -1;
5644 }
5645 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005646 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005647 Py_DECREF(py_code);
5648 if (code < 0) {
5649 Py_DECREF(obj);
5650 return -1;
5651 }
5652 PDATA_PUSH(self->stack, obj, -1);
5653 return 0;
5654}
5655
5656static int
5657load_put(UnpicklerObject *self)
5658{
5659 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005660 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005661 Py_ssize_t len;
5662 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005663
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005664 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005665 return -1;
5666 if (len < 2)
5667 return bad_readline();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005668 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005669 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005670 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005671
5672 key = PyLong_FromString(s, NULL, 10);
5673 if (key == NULL)
5674 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005675 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005676 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005677 if (idx < 0) {
5678 if (!PyErr_Occurred())
5679 PyErr_SetString(PyExc_ValueError,
5680 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005681 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005682 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005683
5684 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005685}
5686
5687static int
5688load_binput(UnpicklerObject *self)
5689{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005690 PyObject *value;
5691 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005692 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005693
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005694 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005695 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005696
5697 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005698 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005699 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005700
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005701 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005702
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005703 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005704}
5705
5706static int
5707load_long_binput(UnpicklerObject *self)
5708{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005709 PyObject *value;
5710 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005711 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005712
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005713 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005714 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005715
5716 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005717 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005718 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005719
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005720 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005721 if (idx < 0) {
5722 PyErr_SetString(PyExc_ValueError,
5723 "negative LONG_BINPUT argument");
5724 return -1;
5725 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005726
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005727 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005728}
5729
5730static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005731load_memoize(UnpicklerObject *self)
5732{
5733 PyObject *value;
5734
5735 if (Py_SIZE(self->stack) <= 0)
5736 return stack_underflow();
5737 value = self->stack->data[Py_SIZE(self->stack) - 1];
5738
5739 return _Unpickler_MemoPut(self, self->memo_len, value);
5740}
5741
5742static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005743do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005744{
5745 PyObject *value;
5746 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005747 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005748
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005749 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005750 if (x > len || x <= 0)
5751 return stack_underflow();
5752 if (len == x) /* nothing to do */
5753 return 0;
5754
5755 list = self->stack->data[x - 1];
5756
5757 if (PyList_Check(list)) {
5758 PyObject *slice;
5759 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005760 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005761
5762 slice = Pdata_poplist(self->stack, x);
5763 if (!slice)
5764 return -1;
5765 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005766 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005767 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005768 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005769 }
5770 else {
5771 PyObject *append_func;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005772 _Py_IDENTIFIER(append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005773
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005774 append_func = _PyObject_GetAttrId(list, &PyId_append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005775 if (append_func == NULL)
5776 return -1;
5777 for (i = x; i < len; i++) {
5778 PyObject *result;
5779
5780 value = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005781 result = _Pickle_FastCall(append_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005782 if (result == NULL) {
5783 Pdata_clear(self->stack, i + 1);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005784 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005785 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005786 return -1;
5787 }
5788 Py_DECREF(result);
5789 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005790 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005791 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005792 }
5793
5794 return 0;
5795}
5796
5797static int
5798load_append(UnpicklerObject *self)
5799{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005800 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005801}
5802
5803static int
5804load_appends(UnpicklerObject *self)
5805{
5806 return do_append(self, marker(self));
5807}
5808
5809static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005810do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005811{
5812 PyObject *value, *key;
5813 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005814 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005815 int status = 0;
5816
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005817 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005818 if (x > len || x <= 0)
5819 return stack_underflow();
5820 if (len == x) /* nothing to do */
5821 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005822 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005823 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005824 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005825 PyErr_SetString(st->UnpicklingError,
5826 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005827 return -1;
5828 }
5829
5830 /* Here, dict does not actually need to be a PyDict; it could be anything
5831 that supports the __setitem__ attribute. */
5832 dict = self->stack->data[x - 1];
5833
5834 for (i = x + 1; i < len; i += 2) {
5835 key = self->stack->data[i - 1];
5836 value = self->stack->data[i];
5837 if (PyObject_SetItem(dict, key, value) < 0) {
5838 status = -1;
5839 break;
5840 }
5841 }
5842
5843 Pdata_clear(self->stack, x);
5844 return status;
5845}
5846
5847static int
5848load_setitem(UnpicklerObject *self)
5849{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005850 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005851}
5852
5853static int
5854load_setitems(UnpicklerObject *self)
5855{
5856 return do_setitems(self, marker(self));
5857}
5858
5859static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005860load_additems(UnpicklerObject *self)
5861{
5862 PyObject *set;
5863 Py_ssize_t mark, len, i;
5864
5865 mark = marker(self);
5866 len = Py_SIZE(self->stack);
5867 if (mark > len || mark <= 0)
5868 return stack_underflow();
5869 if (len == mark) /* nothing to do */
5870 return 0;
5871
5872 set = self->stack->data[mark - 1];
5873
5874 if (PySet_Check(set)) {
5875 PyObject *items;
5876 int status;
5877
5878 items = Pdata_poptuple(self->stack, mark);
5879 if (items == NULL)
5880 return -1;
5881
5882 status = _PySet_Update(set, items);
5883 Py_DECREF(items);
5884 return status;
5885 }
5886 else {
5887 PyObject *add_func;
5888 _Py_IDENTIFIER(add);
5889
5890 add_func = _PyObject_GetAttrId(set, &PyId_add);
5891 if (add_func == NULL)
5892 return -1;
5893 for (i = mark; i < len; i++) {
5894 PyObject *result;
5895 PyObject *item;
5896
5897 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005898 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005899 if (result == NULL) {
5900 Pdata_clear(self->stack, i + 1);
5901 Py_SIZE(self->stack) = mark;
5902 return -1;
5903 }
5904 Py_DECREF(result);
5905 }
5906 Py_SIZE(self->stack) = mark;
5907 }
5908
5909 return 0;
5910}
5911
5912static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005913load_build(UnpicklerObject *self)
5914{
5915 PyObject *state, *inst, *slotstate;
5916 PyObject *setstate;
5917 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005918 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005919
5920 /* Stack is ... instance, state. We want to leave instance at
5921 * the stack top, possibly mutated via instance.__setstate__(state).
5922 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005923 if (Py_SIZE(self->stack) < 2)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005924 return stack_underflow();
5925
5926 PDATA_POP(self->stack, state);
5927 if (state == NULL)
5928 return -1;
5929
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005930 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005931
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005932 setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005933 if (setstate == NULL) {
5934 if (PyErr_ExceptionMatches(PyExc_AttributeError))
5935 PyErr_Clear();
Antoine Pitroud79dc622008-09-05 00:03:33 +00005936 else {
5937 Py_DECREF(state);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005938 return -1;
Antoine Pitroud79dc622008-09-05 00:03:33 +00005939 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005940 }
5941 else {
5942 PyObject *result;
5943
5944 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005945 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005946 Py_DECREF(setstate);
5947 if (result == NULL)
5948 return -1;
5949 Py_DECREF(result);
5950 return 0;
5951 }
5952
5953 /* A default __setstate__. First see whether state embeds a
5954 * slot state dict too (a proto 2 addition).
5955 */
5956 if (PyTuple_Check(state) && Py_SIZE(state) == 2) {
5957 PyObject *tmp = state;
5958
5959 state = PyTuple_GET_ITEM(tmp, 0);
5960 slotstate = PyTuple_GET_ITEM(tmp, 1);
5961 Py_INCREF(state);
5962 Py_INCREF(slotstate);
5963 Py_DECREF(tmp);
5964 }
5965 else
5966 slotstate = NULL;
5967
5968 /* Set inst.__dict__ from the state dict (if any). */
5969 if (state != Py_None) {
5970 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005971 PyObject *d_key, *d_value;
5972 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005973 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005974
5975 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005976 PickleState *st = _Pickle_GetGlobalState();
5977 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005978 goto error;
5979 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005980 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005981 if (dict == NULL)
5982 goto error;
5983
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005984 i = 0;
5985 while (PyDict_Next(state, &i, &d_key, &d_value)) {
5986 /* normally the keys for instance attributes are
5987 interned. we should try to do that here. */
5988 Py_INCREF(d_key);
5989 if (PyUnicode_CheckExact(d_key))
5990 PyUnicode_InternInPlace(&d_key);
5991 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
5992 Py_DECREF(d_key);
5993 goto error;
5994 }
5995 Py_DECREF(d_key);
5996 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005997 Py_DECREF(dict);
5998 }
5999
6000 /* Also set instance attributes from the slotstate dict (if any). */
6001 if (slotstate != NULL) {
6002 PyObject *d_key, *d_value;
6003 Py_ssize_t i;
6004
6005 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006006 PickleState *st = _Pickle_GetGlobalState();
6007 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006008 "slot state is not a dictionary");
6009 goto error;
6010 }
6011 i = 0;
6012 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
6013 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
6014 goto error;
6015 }
6016 }
6017
6018 if (0) {
6019 error:
6020 status = -1;
6021 }
6022
6023 Py_DECREF(state);
6024 Py_XDECREF(slotstate);
6025 return status;
6026}
6027
6028static int
6029load_mark(UnpicklerObject *self)
6030{
6031
6032 /* Note that we split the (pickle.py) stack into two stacks, an
6033 * object stack and a mark stack. Here we push a mark onto the
6034 * mark stack.
6035 */
6036
6037 if ((self->num_marks + 1) >= self->marks_size) {
6038 size_t alloc;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006039 Py_ssize_t *marks;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006040
6041 /* Use the size_t type to check for overflow. */
6042 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006043 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00006044 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006045 PyErr_NoMemory();
6046 return -1;
6047 }
6048
6049 if (self->marks == NULL)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006050 marks = (Py_ssize_t *) PyMem_Malloc(alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006051 else
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006052 marks = (Py_ssize_t *) PyMem_Realloc(self->marks,
6053 alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006054 if (marks == NULL) {
6055 PyErr_NoMemory();
6056 return -1;
6057 }
6058 self->marks = marks;
6059 self->marks_size = (Py_ssize_t)alloc;
6060 }
6061
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006062 self->marks[self->num_marks++] = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006063
6064 return 0;
6065}
6066
6067static int
6068load_reduce(UnpicklerObject *self)
6069{
6070 PyObject *callable = NULL;
6071 PyObject *argtup = NULL;
6072 PyObject *obj = NULL;
6073
6074 PDATA_POP(self->stack, argtup);
6075 if (argtup == NULL)
6076 return -1;
6077 PDATA_POP(self->stack, callable);
6078 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006079 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006080 Py_DECREF(callable);
6081 }
6082 Py_DECREF(argtup);
6083
6084 if (obj == NULL)
6085 return -1;
6086
6087 PDATA_PUSH(self->stack, obj, -1);
6088 return 0;
6089}
6090
6091/* Just raises an error if we don't know the protocol specified. PROTO
6092 * is the first opcode for protocols >= 2.
6093 */
6094static int
6095load_proto(UnpicklerObject *self)
6096{
6097 char *s;
6098 int i;
6099
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006100 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006101 return -1;
6102
6103 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006104 if (i <= HIGHEST_PROTOCOL) {
6105 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006106 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006107 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006108
6109 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6110 return -1;
6111}
6112
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006113static int
6114load_frame(UnpicklerObject *self)
6115{
6116 char *s;
6117 Py_ssize_t frame_len;
6118
6119 if (_Unpickler_Read(self, &s, 8) < 0)
6120 return -1;
6121
6122 frame_len = calc_binsize(s, 8);
6123 if (frame_len < 0) {
6124 PyErr_Format(PyExc_OverflowError,
6125 "FRAME length exceeds system's maximum of %zd bytes",
6126 PY_SSIZE_T_MAX);
6127 return -1;
6128 }
6129
6130 if (_Unpickler_Read(self, &s, frame_len) < 0)
6131 return -1;
6132
6133 /* Rewind to start of frame */
6134 self->next_read_idx -= frame_len;
6135 return 0;
6136}
6137
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006138static PyObject *
6139load(UnpicklerObject *self)
6140{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006141 PyObject *value = NULL;
6142 char *s;
6143
6144 self->num_marks = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006145 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006146 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006147 Pdata_clear(self->stack, 0);
6148
6149 /* Convenient macros for the dispatch while-switch loop just below. */
6150#define OP(opcode, load_func) \
6151 case opcode: if (load_func(self) < 0) break; continue;
6152
6153#define OP_ARG(opcode, load_func, arg) \
6154 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6155
6156 while (1) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006157 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006158 break;
6159
6160 switch ((enum opcode)s[0]) {
6161 OP(NONE, load_none)
6162 OP(BININT, load_binint)
6163 OP(BININT1, load_binint1)
6164 OP(BININT2, load_binint2)
6165 OP(INT, load_int)
6166 OP(LONG, load_long)
6167 OP_ARG(LONG1, load_counted_long, 1)
6168 OP_ARG(LONG4, load_counted_long, 4)
6169 OP(FLOAT, load_float)
6170 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006171 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6172 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6173 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6174 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6175 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006176 OP(STRING, load_string)
6177 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006178 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6179 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6180 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006181 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6182 OP_ARG(TUPLE1, load_counted_tuple, 1)
6183 OP_ARG(TUPLE2, load_counted_tuple, 2)
6184 OP_ARG(TUPLE3, load_counted_tuple, 3)
6185 OP(TUPLE, load_tuple)
6186 OP(EMPTY_LIST, load_empty_list)
6187 OP(LIST, load_list)
6188 OP(EMPTY_DICT, load_empty_dict)
6189 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006190 OP(EMPTY_SET, load_empty_set)
6191 OP(ADDITEMS, load_additems)
6192 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006193 OP(OBJ, load_obj)
6194 OP(INST, load_inst)
6195 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006196 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006197 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006198 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006199 OP(APPEND, load_append)
6200 OP(APPENDS, load_appends)
6201 OP(BUILD, load_build)
6202 OP(DUP, load_dup)
6203 OP(BINGET, load_binget)
6204 OP(LONG_BINGET, load_long_binget)
6205 OP(GET, load_get)
6206 OP(MARK, load_mark)
6207 OP(BINPUT, load_binput)
6208 OP(LONG_BINPUT, load_long_binput)
6209 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006210 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006211 OP(POP, load_pop)
6212 OP(POP_MARK, load_pop_mark)
6213 OP(SETITEM, load_setitem)
6214 OP(SETITEMS, load_setitems)
6215 OP(PERSID, load_persid)
6216 OP(BINPERSID, load_binpersid)
6217 OP(REDUCE, load_reduce)
6218 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006219 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006220 OP_ARG(EXT1, load_extension, 1)
6221 OP_ARG(EXT2, load_extension, 2)
6222 OP_ARG(EXT4, load_extension, 4)
6223 OP_ARG(NEWTRUE, load_bool, Py_True)
6224 OP_ARG(NEWFALSE, load_bool, Py_False)
6225
6226 case STOP:
6227 break;
6228
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006229 default:
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006230 if (s[0] == '\0') {
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006231 PyErr_SetNone(PyExc_EOFError);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006232 }
6233 else {
6234 PickleState *st = _Pickle_GetGlobalState();
6235 PyErr_Format(st->UnpicklingError,
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006236 "invalid load key, '%c'.", s[0]);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006237 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006238 return NULL;
6239 }
6240
6241 break; /* and we are done! */
6242 }
6243
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006244 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006245 return NULL;
6246 }
6247
Victor Stinner2ae57e32013-10-31 13:39:23 +01006248 if (_Unpickler_SkipConsumed(self) < 0)
6249 return NULL;
6250
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006251 PDATA_POP(self->stack, value);
6252 return value;
6253}
6254
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006255/*[clinic]
6256
6257_pickle.Unpickler.load
6258
6259Load a pickle.
6260
6261Read a pickled object representation from the open file object given in
6262the constructor, and return the reconstituted object hierarchy specified
6263therein.
6264[clinic]*/
6265
6266PyDoc_STRVAR(_pickle_Unpickler_load__doc__,
6267"load()\n"
6268"Load a pickle.\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006269"\n"
6270"Read a pickled object representation from the open file object given in\n"
6271"the constructor, and return the reconstituted object hierarchy specified\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006272"therein.");
6273
6274#define _PICKLE_UNPICKLER_LOAD_METHODDEF \
6275 {"load", (PyCFunction)_pickle_Unpickler_load, METH_NOARGS, _pickle_Unpickler_load__doc__},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006276
6277static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006278_pickle_Unpickler_load(PyObject *self)
6279/*[clinic checksum: 9a30ba4e4d9221d4dcd705e1471ab11b2c9e3ac6]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006280{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006281 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006282
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006283 /* Check whether the Unpickler was initialized correctly. This prevents
6284 segfaulting if a subclass overridden __init__ with a function that does
6285 not call Unpickler.__init__(). Here, we simply ensure that self->read
6286 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006287 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006288 PickleState *st = _Pickle_GetGlobalState();
6289 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006290 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006291 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006292 return NULL;
6293 }
6294
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006295 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006296}
6297
6298/* The name of find_class() is misleading. In newer pickle protocols, this
6299 function is used for loading any global (i.e., functions), not just
6300 classes. The name is kept only for backward compatibility. */
6301
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006302/*[clinic]
6303
6304_pickle.Unpickler.find_class
6305
6306 self: UnpicklerObject
6307 module_name: object
6308 global_name: object
6309 /
6310
6311Return an object from a specified module.
6312
6313If necessary, the module will be imported. Subclasses may override this
6314method (e.g. to restrict unpickling of arbitrary classes and functions).
6315
6316This method is called whenever a class or a function object is
6317needed. Both arguments passed are str objects.
6318[clinic]*/
6319
6320PyDoc_STRVAR(_pickle_Unpickler_find_class__doc__,
6321"find_class(module_name, global_name)\n"
6322"Return an object from a specified module.\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006323"\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006324"If necessary, the module will be imported. Subclasses may override this\n"
6325"method (e.g. to restrict unpickling of arbitrary classes and functions).\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006326"\n"
6327"This method is called whenever a class or a function object is\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006328"needed. Both arguments passed are str objects.");
6329
6330#define _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF \
6331 {"find_class", (PyCFunction)_pickle_Unpickler_find_class, METH_VARARGS, _pickle_Unpickler_find_class__doc__},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006332
6333static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006334_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyObject *module_name, PyObject *global_name);
6335
6336static PyObject *
6337_pickle_Unpickler_find_class(PyObject *self, PyObject *args)
6338{
6339 PyObject *return_value = NULL;
6340 PyObject *module_name;
6341 PyObject *global_name;
6342
6343 if (!PyArg_ParseTuple(args,
6344 "OO:find_class",
6345 &module_name, &global_name))
6346 goto exit;
6347 return_value = _pickle_Unpickler_find_class_impl((UnpicklerObject *)self, module_name, global_name);
6348
6349exit:
6350 return return_value;
6351}
6352
6353static PyObject *
6354_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
6355/*[clinic checksum: b7d05d4dd8adc698e5780c1ac2be0f5062d33915]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006356{
6357 PyObject *global;
6358 PyObject *modules_dict;
6359 PyObject *module;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006360 _Py_IDENTIFIER(modules);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006361
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006362 /* Try to map the old names used in Python 2.x to the new ones used in
6363 Python 3.x. We do this only with old pickle protocols and when the
6364 user has not disabled the feature. */
6365 if (self->proto < 3 && self->fix_imports) {
6366 PyObject *key;
6367 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006368 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006369
6370 /* Check if the global (i.e., a function or a class) was renamed
6371 or moved to another module. */
6372 key = PyTuple_Pack(2, module_name, global_name);
6373 if (key == NULL)
6374 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006375 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006376 Py_DECREF(key);
6377 if (item) {
6378 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6379 PyErr_Format(PyExc_RuntimeError,
6380 "_compat_pickle.NAME_MAPPING values should be "
6381 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6382 return NULL;
6383 }
6384 module_name = PyTuple_GET_ITEM(item, 0);
6385 global_name = PyTuple_GET_ITEM(item, 1);
6386 if (!PyUnicode_Check(module_name) ||
6387 !PyUnicode_Check(global_name)) {
6388 PyErr_Format(PyExc_RuntimeError,
6389 "_compat_pickle.NAME_MAPPING values should be "
6390 "pairs of str, not (%.200s, %.200s)",
6391 Py_TYPE(module_name)->tp_name,
6392 Py_TYPE(global_name)->tp_name);
6393 return NULL;
6394 }
6395 }
6396 else if (PyErr_Occurred()) {
6397 return NULL;
6398 }
6399
6400 /* Check if the module was renamed. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006401 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006402 if (item) {
6403 if (!PyUnicode_Check(item)) {
6404 PyErr_Format(PyExc_RuntimeError,
6405 "_compat_pickle.IMPORT_MAPPING values should be "
6406 "strings, not %.200s", Py_TYPE(item)->tp_name);
6407 return NULL;
6408 }
6409 module_name = item;
6410 }
6411 else if (PyErr_Occurred()) {
6412 return NULL;
6413 }
6414 }
6415
Victor Stinnerbb520202013-11-06 22:40:41 +01006416 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02006417 if (modules_dict == NULL) {
6418 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006419 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02006420 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006421
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006422 module = PyDict_GetItemWithError(modules_dict, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006423 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006424 if (PyErr_Occurred())
6425 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006426 module = PyImport_Import(module_name);
6427 if (module == NULL)
6428 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006429 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006430 Py_DECREF(module);
6431 }
Victor Stinner121aab42011-09-29 23:40:53 +02006432 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006433 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006434 }
6435 return global;
6436}
6437
6438static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006439 _PICKLE_UNPICKLER_LOAD_METHODDEF
6440 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006441 {NULL, NULL} /* sentinel */
6442};
6443
6444static void
6445Unpickler_dealloc(UnpicklerObject *self)
6446{
6447 PyObject_GC_UnTrack((PyObject *)self);
6448 Py_XDECREF(self->readline);
6449 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006450 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006451 Py_XDECREF(self->stack);
6452 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006453 if (self->buffer.buf != NULL) {
6454 PyBuffer_Release(&self->buffer);
6455 self->buffer.buf = NULL;
6456 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006457
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006458 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006459 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006460 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006461 PyMem_Free(self->encoding);
6462 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006463
6464 Py_TYPE(self)->tp_free((PyObject *)self);
6465}
6466
6467static int
6468Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6469{
6470 Py_VISIT(self->readline);
6471 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006472 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006473 Py_VISIT(self->stack);
6474 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006475 return 0;
6476}
6477
6478static int
6479Unpickler_clear(UnpicklerObject *self)
6480{
6481 Py_CLEAR(self->readline);
6482 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006483 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006484 Py_CLEAR(self->stack);
6485 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006486 if (self->buffer.buf != NULL) {
6487 PyBuffer_Release(&self->buffer);
6488 self->buffer.buf = NULL;
6489 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006490
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006491 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006492 PyMem_Free(self->marks);
6493 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006494 PyMem_Free(self->input_line);
6495 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006496 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006497 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006498 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006499 self->errors = NULL;
6500
6501 return 0;
6502}
6503
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006504/*[clinic]
6505
6506_pickle.Unpickler.__init__
6507
6508 self: UnpicklerObject
6509 file: object
6510 *
6511 fix_imports: bool = True
6512 encoding: str = 'ASCII'
6513 errors: str = 'strict'
6514
6515This takes a binary file for reading a pickle data stream.
6516
6517The protocol version of the pickle is detected automatically, so no
6518proto argument is needed.
6519
6520The file-like object must have two methods, a read() method
6521that takes an integer argument, and a readline() method that
6522requires no arguments. Both methods should return bytes.
6523Thus file-like object can be a binary file object opened for
6524reading, a BytesIO object, or any other custom object that
6525meets this interface.
6526
6527Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6528which are used to control compatiblity support for pickle stream
6529generated by Python 2.x. If *fix_imports* is True, pickle will try to
6530map the old Python 2.x names to the new names used in Python 3.x. The
6531*encoding* and *errors* tell pickle how to decode 8-bit string
6532instances pickled by Python 2.x; these default to 'ASCII' and
6533'strict', respectively.
6534
6535[clinic]*/
6536
6537PyDoc_STRVAR(_pickle_Unpickler___init____doc__,
6538"__init__(file, *, fix_imports=True, encoding=\'ASCII\', errors=\'strict\')\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006539"This takes a binary file for reading a pickle data stream.\n"
6540"\n"
6541"The protocol version of the pickle is detected automatically, so no\n"
6542"proto argument is needed.\n"
6543"\n"
6544"The file-like object must have two methods, a read() method\n"
6545"that takes an integer argument, and a readline() method that\n"
6546"requires no arguments. Both methods should return bytes.\n"
6547"Thus file-like object can be a binary file object opened for\n"
6548"reading, a BytesIO object, or any other custom object that\n"
6549"meets this interface.\n"
6550"\n"
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006551"Optional keyword arguments are *fix_imports*, *encoding* and *errors*,\n"
6552"which are used to control compatiblity support for pickle stream\n"
6553"generated by Python 2.x. If *fix_imports* is True, pickle will try to\n"
6554"map the old Python 2.x names to the new names used in Python 3.x. The\n"
6555"*encoding* and *errors* tell pickle how to decode 8-bit string\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006556"instances pickled by Python 2.x; these default to \'ASCII\' and\n"
6557"\'strict\', respectively.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006558
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006559#define _PICKLE_UNPICKLER___INIT___METHODDEF \
6560 {"__init__", (PyCFunction)_pickle_Unpickler___init__, METH_VARARGS|METH_KEYWORDS, _pickle_Unpickler___init____doc__},
6561
6562static PyObject *
6563_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, const char *errors);
6564
6565static PyObject *
6566_pickle_Unpickler___init__(PyObject *self, PyObject *args, PyObject *kwargs)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006567{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006568 PyObject *return_value = NULL;
6569 static char *_keywords[] = {"file", "fix_imports", "encoding", "errors", NULL};
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006570 PyObject *file;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006571 int fix_imports = 1;
6572 const char *encoding = "ASCII";
6573 const char *errors = "strict";
6574
6575 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
6576 "O|$pss:__init__", _keywords,
6577 &file, &fix_imports, &encoding, &errors))
6578 goto exit;
6579 return_value = _pickle_Unpickler___init___impl((UnpicklerObject *)self, file, fix_imports, encoding, errors);
6580
6581exit:
6582 return return_value;
6583}
6584
6585static PyObject *
6586_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, const char *errors)
6587/*[clinic checksum: bed0d8bbe1c647960ccc6f997b33bf33935fa56f]*/
6588{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006589 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006590
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006591 /* In case of multiple __init__() calls, clear previous content. */
6592 if (self->read != NULL)
6593 (void)Unpickler_clear(self);
6594
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006595 if (_Unpickler_SetInputStream(self, file) < 0)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006596 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006597
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006598 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006599 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006600
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006601 self->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006602 if (self->fix_imports == -1)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006603 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006604
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006605 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006606 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
6607 &PyId_persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006608 if (self->pers_func == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006609 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006610 }
6611 else {
6612 self->pers_func = NULL;
6613 }
6614
6615 self->stack = (Pdata *)Pdata_New();
6616 if (self->stack == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006617 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006618
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006619 self->memo_size = 32;
6620 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006621 if (self->memo == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006622 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006623
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006624 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006625
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006626 Py_RETURN_NONE;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006627}
6628
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006629/* Wrap the Clinic generated signature to slot it in tp_init. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006630static int
6631Unpickler_init(PyObject *self, PyObject *args, PyObject *kwargs)
6632{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006633 PyObject *result = _pickle_Unpickler___init__(self, args, kwargs);
6634 if (result == NULL) {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006635 return -1;
6636 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006637 Py_DECREF(result);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006638 return 0;
6639}
6640
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006641/* Define a proxy object for the Unpickler's internal memo object. This is to
6642 * avoid breaking code like:
6643 * unpickler.memo.clear()
6644 * and
6645 * unpickler.memo = saved_memo
6646 * Is this a good idea? Not really, but we don't want to break code that uses
6647 * it. Note that we don't implement the entire mapping API here. This is
6648 * intentional, as these should be treated as black-box implementation details.
6649 *
6650 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006651 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006652 */
6653
6654typedef struct {
6655 PyObject_HEAD
6656 UnpicklerObject *unpickler;
6657} UnpicklerMemoProxyObject;
6658
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006659/*[clinic]
6660_pickle.UnpicklerMemoProxy.clear
6661
6662 self: UnpicklerMemoProxyObject
6663
6664Remove all items from memo.
6665[clinic]*/
6666
6667PyDoc_STRVAR(_pickle_UnpicklerMemoProxy_clear__doc__,
6668"clear()\n"
6669"Remove all items from memo.");
6670
6671#define _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF \
6672 {"clear", (PyCFunction)_pickle_UnpicklerMemoProxy_clear, METH_NOARGS, _pickle_UnpicklerMemoProxy_clear__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006673
6674static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006675_pickle_UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6676/*[clinic checksum: 46fecf4e33c0c873124f845edf6cc3a2e9864bd5]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006677{
6678 _Unpickler_MemoCleanup(self->unpickler);
6679 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6680 if (self->unpickler->memo == NULL)
6681 return NULL;
6682 Py_RETURN_NONE;
6683}
6684
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006685/*[clinic]
6686_pickle.UnpicklerMemoProxy.copy
6687
6688 self: UnpicklerMemoProxyObject
6689
6690Copy the memo to a new object.
6691[clinic]*/
6692
6693PyDoc_STRVAR(_pickle_UnpicklerMemoProxy_copy__doc__,
6694"copy()\n"
6695"Copy the memo to a new object.");
6696
6697#define _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF \
6698 {"copy", (PyCFunction)_pickle_UnpicklerMemoProxy_copy, METH_NOARGS, _pickle_UnpicklerMemoProxy_copy__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006699
6700static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006701_pickle_UnpicklerMemoProxy_copy(UnpicklerMemoProxyObject *self)
6702/*[clinic checksum: f8856c4e8a33540886dfbb245f286af3008fa0ad]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006703{
6704 Py_ssize_t i;
6705 PyObject *new_memo = PyDict_New();
6706 if (new_memo == NULL)
6707 return NULL;
6708
6709 for (i = 0; i < self->unpickler->memo_size; i++) {
6710 int status;
6711 PyObject *key, *value;
6712
6713 value = self->unpickler->memo[i];
6714 if (value == NULL)
6715 continue;
6716
6717 key = PyLong_FromSsize_t(i);
6718 if (key == NULL)
6719 goto error;
6720 status = PyDict_SetItem(new_memo, key, value);
6721 Py_DECREF(key);
6722 if (status < 0)
6723 goto error;
6724 }
6725 return new_memo;
6726
6727error:
6728 Py_DECREF(new_memo);
6729 return NULL;
6730}
6731
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006732/*[clinic]
6733_pickle.UnpicklerMemoProxy.__reduce__
6734
6735 self: UnpicklerMemoProxyObject
6736
6737Implement pickling support.
6738[clinic]*/
6739
6740PyDoc_STRVAR(_pickle_UnpicklerMemoProxy___reduce____doc__,
6741"__reduce__()\n"
6742"Implement pickling support.");
6743
6744#define _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF \
6745 {"__reduce__", (PyCFunction)_pickle_UnpicklerMemoProxy___reduce__, METH_NOARGS, _pickle_UnpicklerMemoProxy___reduce____doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006746
6747static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006748_pickle_UnpicklerMemoProxy___reduce__(UnpicklerMemoProxyObject *self)
6749/*[clinic checksum: ab5516a77659144e1191c7dd70a0c6c7455660bc]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006750{
6751 PyObject *reduce_value;
6752 PyObject *constructor_args;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006753 PyObject *contents = _pickle_UnpicklerMemoProxy_copy(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006754 if (contents == NULL)
6755 return NULL;
6756
6757 reduce_value = PyTuple_New(2);
6758 if (reduce_value == NULL) {
6759 Py_DECREF(contents);
6760 return NULL;
6761 }
6762 constructor_args = PyTuple_New(1);
6763 if (constructor_args == NULL) {
6764 Py_DECREF(contents);
6765 Py_DECREF(reduce_value);
6766 return NULL;
6767 }
6768 PyTuple_SET_ITEM(constructor_args, 0, contents);
6769 Py_INCREF((PyObject *)&PyDict_Type);
6770 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6771 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6772 return reduce_value;
6773}
6774
6775static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006776 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6777 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6778 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006779 {NULL, NULL} /* sentinel */
6780};
6781
6782static void
6783UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6784{
6785 PyObject_GC_UnTrack(self);
6786 Py_XDECREF(self->unpickler);
6787 PyObject_GC_Del((PyObject *)self);
6788}
6789
6790static int
6791UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6792 visitproc visit, void *arg)
6793{
6794 Py_VISIT(self->unpickler);
6795 return 0;
6796}
6797
6798static int
6799UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6800{
6801 Py_CLEAR(self->unpickler);
6802 return 0;
6803}
6804
6805static PyTypeObject UnpicklerMemoProxyType = {
6806 PyVarObject_HEAD_INIT(NULL, 0)
6807 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6808 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6809 0,
6810 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6811 0, /* tp_print */
6812 0, /* tp_getattr */
6813 0, /* tp_setattr */
6814 0, /* tp_compare */
6815 0, /* tp_repr */
6816 0, /* tp_as_number */
6817 0, /* tp_as_sequence */
6818 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006819 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006820 0, /* tp_call */
6821 0, /* tp_str */
6822 PyObject_GenericGetAttr, /* tp_getattro */
6823 PyObject_GenericSetAttr, /* tp_setattro */
6824 0, /* tp_as_buffer */
6825 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6826 0, /* tp_doc */
6827 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6828 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6829 0, /* tp_richcompare */
6830 0, /* tp_weaklistoffset */
6831 0, /* tp_iter */
6832 0, /* tp_iternext */
6833 unpicklerproxy_methods, /* tp_methods */
6834};
6835
6836static PyObject *
6837UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6838{
6839 UnpicklerMemoProxyObject *self;
6840
6841 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6842 &UnpicklerMemoProxyType);
6843 if (self == NULL)
6844 return NULL;
6845 Py_INCREF(unpickler);
6846 self->unpickler = unpickler;
6847 PyObject_GC_Track(self);
6848 return (PyObject *)self;
6849}
6850
6851/*****************************************************************************/
6852
6853
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006854static PyObject *
6855Unpickler_get_memo(UnpicklerObject *self)
6856{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006857 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006858}
6859
6860static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006861Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006862{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006863 PyObject **new_memo;
6864 Py_ssize_t new_memo_size = 0;
6865 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006866
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006867 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006868 PyErr_SetString(PyExc_TypeError,
6869 "attribute deletion is not supported");
6870 return -1;
6871 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006872
6873 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6874 UnpicklerObject *unpickler =
6875 ((UnpicklerMemoProxyObject *)obj)->unpickler;
6876
6877 new_memo_size = unpickler->memo_size;
6878 new_memo = _Unpickler_NewMemo(new_memo_size);
6879 if (new_memo == NULL)
6880 return -1;
6881
6882 for (i = 0; i < new_memo_size; i++) {
6883 Py_XINCREF(unpickler->memo[i]);
6884 new_memo[i] = unpickler->memo[i];
6885 }
6886 }
6887 else if (PyDict_Check(obj)) {
6888 Py_ssize_t i = 0;
6889 PyObject *key, *value;
6890
6891 new_memo_size = PyDict_Size(obj);
6892 new_memo = _Unpickler_NewMemo(new_memo_size);
6893 if (new_memo == NULL)
6894 return -1;
6895
6896 while (PyDict_Next(obj, &i, &key, &value)) {
6897 Py_ssize_t idx;
6898 if (!PyLong_Check(key)) {
6899 PyErr_SetString(PyExc_TypeError,
6900 "memo key must be integers");
6901 goto error;
6902 }
6903 idx = PyLong_AsSsize_t(key);
6904 if (idx == -1 && PyErr_Occurred())
6905 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02006906 if (idx < 0) {
6907 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02006908 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02006909 goto error;
6910 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006911 if (_Unpickler_MemoPut(self, idx, value) < 0)
6912 goto error;
6913 }
6914 }
6915 else {
6916 PyErr_Format(PyExc_TypeError,
6917 "'memo' attribute must be an UnpicklerMemoProxy object"
6918 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006919 return -1;
6920 }
6921
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006922 _Unpickler_MemoCleanup(self);
6923 self->memo_size = new_memo_size;
6924 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006925
6926 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006927
6928 error:
6929 if (new_memo_size) {
6930 i = new_memo_size;
6931 while (--i >= 0) {
6932 Py_XDECREF(new_memo[i]);
6933 }
6934 PyMem_FREE(new_memo);
6935 }
6936 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006937}
6938
6939static PyObject *
6940Unpickler_get_persload(UnpicklerObject *self)
6941{
6942 if (self->pers_func == NULL)
6943 PyErr_SetString(PyExc_AttributeError, "persistent_load");
6944 else
6945 Py_INCREF(self->pers_func);
6946 return self->pers_func;
6947}
6948
6949static int
6950Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
6951{
6952 PyObject *tmp;
6953
6954 if (value == NULL) {
6955 PyErr_SetString(PyExc_TypeError,
6956 "attribute deletion is not supported");
6957 return -1;
6958 }
6959 if (!PyCallable_Check(value)) {
6960 PyErr_SetString(PyExc_TypeError,
6961 "persistent_load must be a callable taking "
6962 "one argument");
6963 return -1;
6964 }
6965
6966 tmp = self->pers_func;
6967 Py_INCREF(value);
6968 self->pers_func = value;
6969 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
6970
6971 return 0;
6972}
6973
6974static PyGetSetDef Unpickler_getsets[] = {
6975 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
6976 {"persistent_load", (getter)Unpickler_get_persload,
6977 (setter)Unpickler_set_persload},
6978 {NULL}
6979};
6980
6981static PyTypeObject Unpickler_Type = {
6982 PyVarObject_HEAD_INIT(NULL, 0)
6983 "_pickle.Unpickler", /*tp_name*/
6984 sizeof(UnpicklerObject), /*tp_basicsize*/
6985 0, /*tp_itemsize*/
6986 (destructor)Unpickler_dealloc, /*tp_dealloc*/
6987 0, /*tp_print*/
6988 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006989 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00006990 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006991 0, /*tp_repr*/
6992 0, /*tp_as_number*/
6993 0, /*tp_as_sequence*/
6994 0, /*tp_as_mapping*/
6995 0, /*tp_hash*/
6996 0, /*tp_call*/
6997 0, /*tp_str*/
6998 0, /*tp_getattro*/
6999 0, /*tp_setattro*/
7000 0, /*tp_as_buffer*/
7001 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007002 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007003 (traverseproc)Unpickler_traverse, /*tp_traverse*/
7004 (inquiry)Unpickler_clear, /*tp_clear*/
7005 0, /*tp_richcompare*/
7006 0, /*tp_weaklistoffset*/
7007 0, /*tp_iter*/
7008 0, /*tp_iternext*/
7009 Unpickler_methods, /*tp_methods*/
7010 0, /*tp_members*/
7011 Unpickler_getsets, /*tp_getset*/
7012 0, /*tp_base*/
7013 0, /*tp_dict*/
7014 0, /*tp_descr_get*/
7015 0, /*tp_descr_set*/
7016 0, /*tp_dictoffset*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007017 Unpickler_init, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007018 PyType_GenericAlloc, /*tp_alloc*/
7019 PyType_GenericNew, /*tp_new*/
7020 PyObject_GC_Del, /*tp_free*/
7021 0, /*tp_is_gc*/
7022};
7023
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007024/*[clinic]
7025
7026_pickle.dump
7027
7028 obj: object
7029 file: object
7030 protocol: object = NULL
7031 *
7032 fix_imports: bool = True
7033
7034Write a pickled representation of obj to the open file object file.
7035
7036This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may be more
7037efficient.
7038
7039The optional protocol argument tells the pickler to use the given protocol
7040supported protocols are 0, 1, 2, 3. The default protocol is 3; a
7041backward-incompatible protocol designed for Python 3.0.
7042
7043Specifying a negative protocol version selects the highest protocol version
7044supported. The higher the protocol used, the more recent the version of
7045Python needed to read the pickle produced.
7046
7047The file argument must have a write() method that accepts a single bytes
7048argument. It can thus be a file object opened for binary writing, a
7049io.BytesIO instance, or any other custom object that meets this interface.
7050
7051If fix_imports is True and protocol is less than 3, pickle will try to
7052map the new Python 3.x names to the old module names used in Python 2.x,
7053so that the pickle data stream is readable with Python 2.x.
7054[clinic]*/
7055
7056PyDoc_STRVAR(_pickle_dump__doc__,
7057"dump(obj, file, protocol=None, *, fix_imports=True)\n"
7058"Write a pickled representation of obj to the open file object file.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007059"\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007060"This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may be more\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007061"efficient.\n"
7062"\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007063"The optional protocol argument tells the pickler to use the given protocol\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007064"supported protocols are 0, 1, 2, 3. The default protocol is 3; a\n"
7065"backward-incompatible protocol designed for Python 3.0.\n"
7066"\n"
7067"Specifying a negative protocol version selects the highest protocol version\n"
7068"supported. The higher the protocol used, the more recent the version of\n"
7069"Python needed to read the pickle produced.\n"
7070"\n"
7071"The file argument must have a write() method that accepts a single bytes\n"
7072"argument. It can thus be a file object opened for binary writing, a\n"
7073"io.BytesIO instance, or any other custom object that meets this interface.\n"
7074"\n"
7075"If fix_imports is True and protocol is less than 3, pickle will try to\n"
7076"map the new Python 3.x names to the old module names used in Python 2.x,\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007077"so that the pickle data stream is readable with Python 2.x.");
7078
7079#define _PICKLE_DUMP_METHODDEF \
7080 {"dump", (PyCFunction)_pickle_dump, METH_VARARGS|METH_KEYWORDS, _pickle_dump__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007081
7082static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007083_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports);
7084
7085static PyObject *
7086_pickle_dump(PyModuleDef *module, PyObject *args, PyObject *kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007087{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007088 PyObject *return_value = NULL;
7089 static char *_keywords[] = {"obj", "file", "protocol", "fix_imports", NULL};
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007090 PyObject *obj;
7091 PyObject *file;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007092 PyObject *protocol = NULL;
7093 int fix_imports = 1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007094
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007095 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
7096 "OO|O$p:dump", _keywords,
7097 &obj, &file, &protocol, &fix_imports))
7098 goto exit;
7099 return_value = _pickle_dump_impl(module, obj, file, protocol, fix_imports);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007100
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007101exit:
7102 return return_value;
7103}
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007104
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007105static PyObject *
7106_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports)
7107/*[clinic checksum: e442721b16052d921b5e3fbd146d0a62e94a459e]*/
7108{
7109 PicklerObject *pickler = _Pickler_New();
7110
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007111 if (pickler == NULL)
7112 return NULL;
7113
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007114 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007115 goto error;
7116
7117 if (_Pickler_SetOutputStream(pickler, file) < 0)
7118 goto error;
7119
7120 if (dump(pickler, obj) < 0)
7121 goto error;
7122
7123 if (_Pickler_FlushToFile(pickler) < 0)
7124 goto error;
7125
7126 Py_DECREF(pickler);
7127 Py_RETURN_NONE;
7128
7129 error:
7130 Py_XDECREF(pickler);
7131 return NULL;
7132}
7133
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007134/*[clinic]
7135
7136_pickle.dumps
7137
7138 obj: object
7139 protocol: object = NULL
7140 *
7141 fix_imports: bool = True
7142
7143Return the pickled representation of the object as a bytes object.
7144
7145The optional protocol argument tells the pickler to use the given protocol;
7146supported protocols are 0, 1, 2, 3. The default protocol is 3; a
7147backward-incompatible protocol designed for Python 3.0.
7148
7149Specifying a negative protocol version selects the highest protocol version
7150supported. The higher the protocol used, the more recent the version of
7151Python needed to read the pickle produced.
7152
7153If fix_imports is True and *protocol* is less than 3, pickle will try to
7154map the new Python 3.x names to the old module names used in Python 2.x,
7155so that the pickle data stream is readable with Python 2.x.
7156[clinic]*/
7157
7158PyDoc_STRVAR(_pickle_dumps__doc__,
7159"dumps(obj, protocol=None, *, fix_imports=True)\n"
7160"Return the pickled representation of the object as a bytes object.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007161"\n"
7162"The optional protocol argument tells the pickler to use the given protocol;\n"
7163"supported protocols are 0, 1, 2, 3. The default protocol is 3; a\n"
7164"backward-incompatible protocol designed for Python 3.0.\n"
7165"\n"
7166"Specifying a negative protocol version selects the highest protocol version\n"
7167"supported. The higher the protocol used, the more recent the version of\n"
7168"Python needed to read the pickle produced.\n"
7169"\n"
7170"If fix_imports is True and *protocol* is less than 3, pickle will try to\n"
7171"map the new Python 3.x names to the old module names used in Python 2.x,\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007172"so that the pickle data stream is readable with Python 2.x.");
7173
7174#define _PICKLE_DUMPS_METHODDEF \
7175 {"dumps", (PyCFunction)_pickle_dumps, METH_VARARGS|METH_KEYWORDS, _pickle_dumps__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007176
7177static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007178_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol, int fix_imports);
7179
7180static PyObject *
7181_pickle_dumps(PyModuleDef *module, PyObject *args, PyObject *kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007182{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007183 PyObject *return_value = NULL;
7184 static char *_keywords[] = {"obj", "protocol", "fix_imports", NULL};
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007185 PyObject *obj;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007186 PyObject *protocol = NULL;
7187 int fix_imports = 1;
7188
7189 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
7190 "O|O$p:dumps", _keywords,
7191 &obj, &protocol, &fix_imports))
7192 goto exit;
7193 return_value = _pickle_dumps_impl(module, obj, protocol, fix_imports);
7194
7195exit:
7196 return return_value;
7197}
7198
7199static PyObject *
7200_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol, int fix_imports)
7201/*[clinic checksum: df6262c4c487f537f47aec8a1709318204c1e174]*/
7202{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007203 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007204 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007205
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007206 if (pickler == NULL)
7207 return NULL;
7208
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007209 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007210 goto error;
7211
7212 if (dump(pickler, obj) < 0)
7213 goto error;
7214
7215 result = _Pickler_GetString(pickler);
7216 Py_DECREF(pickler);
7217 return result;
7218
7219 error:
7220 Py_XDECREF(pickler);
7221 return NULL;
7222}
7223
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007224/*[clinic]
7225
7226_pickle.load
7227
7228 file: object
7229 *
7230 fix_imports: bool = True
7231 encoding: str = 'ASCII'
7232 errors: str = 'strict'
7233
7234Return a reconstituted object from the pickle data stored in a file.
7235
7236This is equivalent to ``Unpickler(file).load()``, but may be more efficient.
7237
7238The protocol version of the pickle is detected automatically, so no protocol
7239argument is needed. Bytes past the pickled object's representation are
7240ignored.
7241
7242The argument file must have two methods, a read() method that takes an
7243integer argument, and a readline() method that requires no arguments. Both
7244methods should return bytes. Thus *file* can be a binary file object opened
7245for reading, a BytesIO object, or any other custom object that meets this
7246interface.
7247
7248Optional keyword arguments are fix_imports, encoding and errors,
7249which are used to control compatiblity support for pickle stream generated
7250by Python 2.x. If fix_imports is True, pickle will try to map the old
7251Python 2.x names to the new names used in Python 3.x. The encoding and
7252errors tell pickle how to decode 8-bit string instances pickled by Python
72532.x; these default to 'ASCII' and 'strict', respectively.
7254[clinic]*/
7255
7256PyDoc_STRVAR(_pickle_load__doc__,
7257"load(file, *, fix_imports=True, encoding=\'ASCII\', errors=\'strict\')\n"
7258"Return a reconstituted object from the pickle data stored in a file.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007259"\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007260"This is equivalent to ``Unpickler(file).load()``, but may be more efficient.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007261"\n"
7262"The protocol version of the pickle is detected automatically, so no protocol\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007263"argument is needed. Bytes past the pickled object\'s representation are\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007264"ignored.\n"
7265"\n"
7266"The argument file must have two methods, a read() method that takes an\n"
7267"integer argument, and a readline() method that requires no arguments. Both\n"
7268"methods should return bytes. Thus *file* can be a binary file object opened\n"
7269"for reading, a BytesIO object, or any other custom object that meets this\n"
7270"interface.\n"
7271"\n"
7272"Optional keyword arguments are fix_imports, encoding and errors,\n"
7273"which are used to control compatiblity support for pickle stream generated\n"
7274"by Python 2.x. If fix_imports is True, pickle will try to map the old\n"
7275"Python 2.x names to the new names used in Python 3.x. The encoding and\n"
7276"errors tell pickle how to decode 8-bit string instances pickled by Python\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007277"2.x; these default to \'ASCII\' and \'strict\', respectively.");
7278
7279#define _PICKLE_LOAD_METHODDEF \
7280 {"load", (PyCFunction)_pickle_load, METH_VARARGS|METH_KEYWORDS, _pickle_load__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007281
7282static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007283_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports, const char *encoding, const char *errors);
7284
7285static PyObject *
7286_pickle_load(PyModuleDef *module, PyObject *args, PyObject *kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007287{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007288 PyObject *return_value = NULL;
7289 static char *_keywords[] = {"file", "fix_imports", "encoding", "errors", NULL};
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007290 PyObject *file;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007291 int fix_imports = 1;
7292 const char *encoding = "ASCII";
7293 const char *errors = "strict";
7294
7295 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
7296 "O|$pss:load", _keywords,
7297 &file, &fix_imports, &encoding, &errors))
7298 goto exit;
7299 return_value = _pickle_load_impl(module, file, fix_imports, encoding, errors);
7300
7301exit:
7302 return return_value;
7303}
7304
7305static PyObject *
7306_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports, const char *encoding, const char *errors)
7307/*[clinic checksum: e10796f6765b22ce48dca6940f11b3933853ca35]*/
7308{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007309 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007310 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007311
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007312 if (unpickler == NULL)
7313 return NULL;
7314
7315 if (_Unpickler_SetInputStream(unpickler, file) < 0)
7316 goto error;
7317
7318 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7319 goto error;
7320
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007321 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007322
7323 result = load(unpickler);
7324 Py_DECREF(unpickler);
7325 return result;
7326
7327 error:
7328 Py_XDECREF(unpickler);
7329 return NULL;
7330}
7331
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007332/*[clinic]
7333
7334_pickle.loads
7335
7336 data: object
7337 *
7338 fix_imports: bool = True
7339 encoding: str = 'ASCII'
7340 errors: str = 'strict'
7341
7342Return a reconstituted object from the given pickle data.
7343
7344The protocol version of the pickle is detected automatically, so no protocol
7345argument is needed. Bytes past the pickled object's representation are
7346ignored.
7347
7348Optional keyword arguments are fix_imports, encoding and errors, which
7349are used to control compatiblity support for pickle stream generated
7350by Python 2.x. If fix_imports is True, pickle will try to map the old
7351Python 2.x names to the new names used in Python 3.x. The encoding and
7352errors tell pickle how to decode 8-bit string instances pickled by Python
73532.x; these default to 'ASCII' and 'strict', respectively.
7354[clinic]*/
7355
7356PyDoc_STRVAR(_pickle_loads__doc__,
7357"loads(data, *, fix_imports=True, encoding=\'ASCII\', errors=\'strict\')\n"
7358"Return a reconstituted object from the given pickle data.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007359"\n"
7360"The protocol version of the pickle is detected automatically, so no protocol\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007361"argument is needed. Bytes past the pickled object\'s representation are\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007362"ignored.\n"
7363"\n"
7364"Optional keyword arguments are fix_imports, encoding and errors, which\n"
7365"are used to control compatiblity support for pickle stream generated\n"
7366"by Python 2.x. If fix_imports is True, pickle will try to map the old\n"
7367"Python 2.x names to the new names used in Python 3.x. The encoding and\n"
7368"errors tell pickle how to decode 8-bit string instances pickled by Python\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007369"2.x; these default to \'ASCII\' and \'strict\', respectively.");
7370
7371#define _PICKLE_LOADS_METHODDEF \
7372 {"loads", (PyCFunction)_pickle_loads, METH_VARARGS|METH_KEYWORDS, _pickle_loads__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007373
7374static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007375_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports, const char *encoding, const char *errors);
7376
7377static PyObject *
7378_pickle_loads(PyModuleDef *module, PyObject *args, PyObject *kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007379{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007380 PyObject *return_value = NULL;
7381 static char *_keywords[] = {"data", "fix_imports", "encoding", "errors", NULL};
7382 PyObject *data;
7383 int fix_imports = 1;
7384 const char *encoding = "ASCII";
7385 const char *errors = "strict";
7386
7387 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
7388 "O|$pss:loads", _keywords,
7389 &data, &fix_imports, &encoding, &errors))
7390 goto exit;
7391 return_value = _pickle_loads_impl(module, data, fix_imports, encoding, errors);
7392
7393exit:
7394 return return_value;
7395}
7396
7397static PyObject *
7398_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports, const char *encoding, const char *errors)
7399/*[clinic checksum: 29ee725efcbf51a3533c19cb8261a8e267b7080a]*/
7400{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007401 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007402 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007403
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007404 if (unpickler == NULL)
7405 return NULL;
7406
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007407 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007408 goto error;
7409
7410 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7411 goto error;
7412
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007413 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007414
7415 result = load(unpickler);
7416 Py_DECREF(unpickler);
7417 return result;
7418
7419 error:
7420 Py_XDECREF(unpickler);
7421 return NULL;
7422}
7423
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007424static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007425 _PICKLE_DUMP_METHODDEF
7426 _PICKLE_DUMPS_METHODDEF
7427 _PICKLE_LOAD_METHODDEF
7428 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007429 {NULL, NULL} /* sentinel */
7430};
7431
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007432static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007433pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007434{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007435 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007436 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007437}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007438
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007439static int
7440pickle_traverse(PyObject *m, visitproc visit, void *arg)
7441{
7442 PickleState *st = _Pickle_GetState(m);
7443 Py_VISIT(st->PickleError);
7444 Py_VISIT(st->PicklingError);
7445 Py_VISIT(st->UnpicklingError);
7446 Py_VISIT(st->dispatch_table);
7447 Py_VISIT(st->extension_registry);
7448 Py_VISIT(st->extension_cache);
7449 Py_VISIT(st->inverted_registry);
7450 Py_VISIT(st->name_mapping_2to3);
7451 Py_VISIT(st->import_mapping_2to3);
7452 Py_VISIT(st->name_mapping_3to2);
7453 Py_VISIT(st->import_mapping_3to2);
7454 Py_VISIT(st->codecs_encode);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007455 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007456}
7457
7458static struct PyModuleDef _picklemodule = {
7459 PyModuleDef_HEAD_INIT,
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007460 "_pickle", /* m_name */
7461 pickle_module_doc, /* m_doc */
7462 sizeof(PickleState), /* m_size */
7463 pickle_methods, /* m_methods */
7464 NULL, /* m_reload */
7465 pickle_traverse, /* m_traverse */
7466 pickle_clear, /* m_clear */
7467 NULL /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007468};
7469
7470PyMODINIT_FUNC
7471PyInit__pickle(void)
7472{
7473 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007474 PickleState *st;
7475
7476 m = PyState_FindModule(&_picklemodule);
7477 if (m) {
7478 Py_INCREF(m);
7479 return m;
7480 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007481
7482 if (PyType_Ready(&Unpickler_Type) < 0)
7483 return NULL;
7484 if (PyType_Ready(&Pickler_Type) < 0)
7485 return NULL;
7486 if (PyType_Ready(&Pdata_Type) < 0)
7487 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007488 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7489 return NULL;
7490 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7491 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007492
7493 /* Create the module and add the functions. */
7494 m = PyModule_Create(&_picklemodule);
7495 if (m == NULL)
7496 return NULL;
7497
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007498 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007499 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7500 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007501 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007502 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7503 return NULL;
7504
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007505 st = _Pickle_GetState(m);
7506
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007507 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007508 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7509 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007510 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007511 st->PicklingError = \
7512 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7513 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007514 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007515 st->UnpicklingError = \
7516 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7517 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007518 return NULL;
7519
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007520 Py_INCREF(st->PickleError);
7521 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007522 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007523 Py_INCREF(st->PicklingError);
7524 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007525 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007526 Py_INCREF(st->UnpicklingError);
7527 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007528 return NULL;
7529
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007530 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007531 return NULL;
7532
7533 return m;
7534}