blob: a9fad0e94952f3fc35df42ca03d1d5f07c4c6e73 [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);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002030 len = 8;
2031 }
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
3291save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
3292{
3293 PyObject *pid = NULL;
3294 int status = 0;
3295
3296 const char persid_op = PERSID;
3297 const char binpersid_op = BINPERSID;
3298
3299 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003300 pid = _Pickle_FastCall(func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003301 if (pid == NULL)
3302 return -1;
3303
3304 if (pid != Py_None) {
3305 if (self->bin) {
3306 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003307 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003308 goto error;
3309 }
3310 else {
3311 PyObject *pid_str = NULL;
3312 char *pid_ascii_bytes;
3313 Py_ssize_t size;
3314
3315 pid_str = PyObject_Str(pid);
3316 if (pid_str == NULL)
3317 goto error;
3318
3319 /* XXX: Should it check whether the persistent id only contains
3320 ASCII characters? And what if the pid contains embedded
3321 newlines? */
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00003322 pid_ascii_bytes = _PyUnicode_AsStringAndSize(pid_str, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003323 Py_DECREF(pid_str);
3324 if (pid_ascii_bytes == NULL)
3325 goto error;
3326
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003327 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
3328 _Pickler_Write(self, pid_ascii_bytes, size) < 0 ||
3329 _Pickler_Write(self, "\n", 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003330 goto error;
3331 }
3332 status = 1;
3333 }
3334
3335 if (0) {
3336 error:
3337 status = -1;
3338 }
3339 Py_XDECREF(pid);
3340
3341 return status;
3342}
3343
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003344static PyObject *
3345get_class(PyObject *obj)
3346{
3347 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003348 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003349
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003350 cls = _PyObject_GetAttrId(obj, &PyId___class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003351 if (cls == NULL) {
3352 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3353 PyErr_Clear();
3354 cls = (PyObject *) Py_TYPE(obj);
3355 Py_INCREF(cls);
3356 }
3357 }
3358 return cls;
3359}
3360
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003361/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3362 * appropriate __reduce__ method for obj.
3363 */
3364static int
3365save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3366{
3367 PyObject *callable;
3368 PyObject *argtup;
3369 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003370 PyObject *listitems = Py_None;
3371 PyObject *dictitems = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003372 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003373 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003374 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003375
3376 const char reduce_op = REDUCE;
3377 const char build_op = BUILD;
3378 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003379 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003380
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003381 size = PyTuple_Size(args);
3382 if (size < 2 || size > 5) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003383 PyErr_SetString(st->PicklingError, "tuple returned by "
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003384 "__reduce__ must contain 2 through 5 elements");
3385 return -1;
3386 }
3387
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003388 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
3389 &callable, &argtup, &state, &listitems, &dictitems))
3390 return -1;
3391
3392 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003393 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003394 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003395 return -1;
3396 }
3397 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003398 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003399 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003400 return -1;
3401 }
3402
3403 if (state == Py_None)
3404 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003405
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003406 if (listitems == Py_None)
3407 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003408 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003409 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003410 "returned by __reduce__ must be an iterator, not %s",
3411 Py_TYPE(listitems)->tp_name);
3412 return -1;
3413 }
3414
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003415 if (dictitems == Py_None)
3416 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003417 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003418 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003419 "returned by __reduce__ must be an iterator, not %s",
3420 Py_TYPE(dictitems)->tp_name);
3421 return -1;
3422 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003423
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003424 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003425 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003426 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003427
Victor Stinner804e05e2013-11-14 01:26:17 +01003428 name = _PyObject_GetAttrId(callable, &PyId___name__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003429 if (name == NULL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003430 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003431 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003432 }
3433 PyErr_Clear();
3434 }
3435 else if (self->proto >= 4) {
3436 _Py_IDENTIFIER(__newobj_ex__);
3437 use_newobj_ex = PyUnicode_Check(name) &&
3438 PyUnicode_Compare(
3439 name, _PyUnicode_FromId(&PyId___newobj_ex__)) == 0;
3440 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003441 }
3442 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003443 _Py_IDENTIFIER(__newobj__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003444 use_newobj = PyUnicode_Check(name) &&
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003445 PyUnicode_Compare(
3446 name, _PyUnicode_FromId(&PyId___newobj__)) == 0;
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003447 Py_DECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003448 }
3449 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003450
3451 if (use_newobj_ex) {
3452 PyObject *cls;
3453 PyObject *args;
3454 PyObject *kwargs;
3455
3456 if (Py_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003457 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003458 "length of the NEWOBJ_EX argument tuple must be "
3459 "exactly 3, not %zd", Py_SIZE(argtup));
3460 return -1;
3461 }
3462
3463 cls = PyTuple_GET_ITEM(argtup, 0);
3464 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003465 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003466 "first item from NEWOBJ_EX argument tuple must "
3467 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
3468 return -1;
3469 }
3470 args = PyTuple_GET_ITEM(argtup, 1);
3471 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003472 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003473 "second item from NEWOBJ_EX argument tuple must "
3474 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
3475 return -1;
3476 }
3477 kwargs = PyTuple_GET_ITEM(argtup, 2);
3478 if (!PyDict_Check(kwargs)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003479 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003480 "third item from NEWOBJ_EX argument tuple must "
3481 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
3482 return -1;
3483 }
3484
3485 if (save(self, cls, 0) < 0 ||
3486 save(self, args, 0) < 0 ||
3487 save(self, kwargs, 0) < 0 ||
3488 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
3489 return -1;
3490 }
3491 }
3492 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003493 PyObject *cls;
3494 PyObject *newargtup;
3495 PyObject *obj_class;
3496 int p;
3497
3498 /* Sanity checks. */
3499 if (Py_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003500 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003501 return -1;
3502 }
3503
3504 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003505 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003506 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003507 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003508 return -1;
3509 }
3510
3511 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003512 obj_class = get_class(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003513 p = obj_class != cls; /* true iff a problem */
3514 Py_DECREF(obj_class);
3515 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003516 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003517 "__newobj__ args has the wrong class");
3518 return -1;
3519 }
3520 }
3521 /* XXX: These calls save() are prone to infinite recursion. Imagine
3522 what happen if the value returned by the __reduce__() method of
3523 some extension type contains another object of the same type. Ouch!
3524
3525 Here is a quick example, that I ran into, to illustrate what I
3526 mean:
3527
3528 >>> import pickle, copyreg
3529 >>> copyreg.dispatch_table.pop(complex)
3530 >>> pickle.dumps(1+2j)
3531 Traceback (most recent call last):
3532 ...
3533 RuntimeError: maximum recursion depth exceeded
3534
3535 Removing the complex class from copyreg.dispatch_table made the
3536 __reduce_ex__() method emit another complex object:
3537
3538 >>> (1+1j).__reduce_ex__(2)
3539 (<function __newobj__ at 0xb7b71c3c>,
3540 (<class 'complex'>, (1+1j)), None, None, None)
3541
3542 Thus when save() was called on newargstup (the 2nd item) recursion
3543 ensued. Of course, the bug was in the complex class which had a
3544 broken __getnewargs__() that emitted another complex object. But,
3545 the point, here, is it is quite easy to end up with a broken reduce
3546 function. */
3547
3548 /* Save the class and its __new__ arguments. */
3549 if (save(self, cls, 0) < 0)
3550 return -1;
3551
3552 newargtup = PyTuple_GetSlice(argtup, 1, Py_SIZE(argtup));
3553 if (newargtup == NULL)
3554 return -1;
3555
3556 p = save(self, newargtup, 0);
3557 Py_DECREF(newargtup);
3558 if (p < 0)
3559 return -1;
3560
3561 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003562 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003563 return -1;
3564 }
3565 else { /* Not using NEWOBJ. */
3566 if (save(self, callable, 0) < 0 ||
3567 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003568 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003569 return -1;
3570 }
3571
3572 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
3573 the caller do not want to memoize the object. Not particularly useful,
3574 but that is to mimic the behavior save_reduce() in pickle.py when
3575 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003576 if (obj != NULL) {
3577 /* If the object is already in the memo, this means it is
3578 recursive. In this case, throw away everything we put on the
3579 stack, and fetch the object back from the memo. */
3580 if (PyMemoTable_Get(self->memo, obj)) {
3581 const char pop_op = POP;
3582
3583 if (_Pickler_Write(self, &pop_op, 1) < 0)
3584 return -1;
3585 if (memo_get(self, obj) < 0)
3586 return -1;
3587
3588 return 0;
3589 }
3590 else if (memo_put(self, obj) < 0)
3591 return -1;
3592 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003593
3594 if (listitems && batch_list(self, listitems) < 0)
3595 return -1;
3596
3597 if (dictitems && batch_dict(self, dictitems) < 0)
3598 return -1;
3599
3600 if (state) {
Victor Stinner121aab42011-09-29 23:40:53 +02003601 if (save(self, state, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003602 _Pickler_Write(self, &build_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003603 return -1;
3604 }
3605
3606 return 0;
3607}
3608
3609static int
3610save(PicklerObject *self, PyObject *obj, int pers_save)
3611{
3612 PyTypeObject *type;
3613 PyObject *reduce_func = NULL;
3614 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003615 int status = 0;
3616
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003617 if (_Pickler_OpcodeBoundary(self) < 0)
3618 return -1;
3619
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003620 if (Py_EnterRecursiveCall(" while pickling an object"))
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003621 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003622
3623 /* The extra pers_save argument is necessary to avoid calling save_pers()
3624 on its returned object. */
3625 if (!pers_save && self->pers_func) {
3626 /* save_pers() returns:
3627 -1 to signal an error;
3628 0 if it did nothing successfully;
3629 1 if a persistent id was saved.
3630 */
3631 if ((status = save_pers(self, obj, self->pers_func)) != 0)
3632 goto done;
3633 }
3634
3635 type = Py_TYPE(obj);
3636
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003637 /* The old cPickle had an optimization that used switch-case statement
3638 dispatching on the first letter of the type name. This has was removed
3639 since benchmarks shown that this optimization was actually slowing
3640 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003641
3642 /* Atom types; these aren't memoized, so don't check the memo. */
3643
3644 if (obj == Py_None) {
3645 status = save_none(self, obj);
3646 goto done;
3647 }
3648 else if (obj == Py_False || obj == Py_True) {
3649 status = save_bool(self, obj);
3650 goto done;
3651 }
3652 else if (type == &PyLong_Type) {
3653 status = save_long(self, obj);
3654 goto done;
3655 }
3656 else if (type == &PyFloat_Type) {
3657 status = save_float(self, obj);
3658 goto done;
3659 }
3660
3661 /* Check the memo to see if it has the object. If so, generate
3662 a GET (or BINGET) opcode, instead of pickling the object
3663 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003664 if (PyMemoTable_Get(self->memo, obj)) {
3665 if (memo_get(self, obj) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003666 goto error;
3667 goto done;
3668 }
3669
3670 if (type == &PyBytes_Type) {
3671 status = save_bytes(self, obj);
3672 goto done;
3673 }
3674 else if (type == &PyUnicode_Type) {
3675 status = save_unicode(self, obj);
3676 goto done;
3677 }
3678 else if (type == &PyDict_Type) {
3679 status = save_dict(self, obj);
3680 goto done;
3681 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003682 else if (type == &PySet_Type) {
3683 status = save_set(self, obj);
3684 goto done;
3685 }
3686 else if (type == &PyFrozenSet_Type) {
3687 status = save_frozenset(self, obj);
3688 goto done;
3689 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003690 else if (type == &PyList_Type) {
3691 status = save_list(self, obj);
3692 goto done;
3693 }
3694 else if (type == &PyTuple_Type) {
3695 status = save_tuple(self, obj);
3696 goto done;
3697 }
3698 else if (type == &PyType_Type) {
3699 status = save_global(self, obj, NULL);
3700 goto done;
3701 }
3702 else if (type == &PyFunction_Type) {
3703 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08003704 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003705 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003706
3707 /* XXX: This part needs some unit tests. */
3708
3709 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003710 * self.dispatch_table, copyreg.dispatch_table, the object's
3711 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003712 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003713 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003714 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003715 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
3716 (PyObject *)type);
3717 if (reduce_func == NULL) {
3718 if (PyErr_Occurred()) {
3719 goto error;
3720 }
3721 } else {
3722 /* PyDict_GetItemWithError() returns a borrowed reference.
3723 Increase the reference count to be consistent with
3724 PyObject_GetItem and _PyObject_GetAttrId used below. */
3725 Py_INCREF(reduce_func);
3726 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003727 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003728 reduce_func = PyObject_GetItem(self->dispatch_table,
3729 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003730 if (reduce_func == NULL) {
3731 if (PyErr_ExceptionMatches(PyExc_KeyError))
3732 PyErr_Clear();
3733 else
3734 goto error;
3735 }
3736 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003737 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003738 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003739 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003740 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02003741 else if (PyType_IsSubtype(type, &PyType_Type)) {
3742 status = save_global(self, obj, NULL);
3743 goto done;
3744 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003745 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003746 _Py_IDENTIFIER(__reduce__);
3747 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003748
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003749
3750 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
3751 automatically defined as __reduce__. While this is convenient, this
3752 make it impossible to know which method was actually called. Of
3753 course, this is not a big deal. But still, it would be nice to let
3754 the user know which method was called when something go
3755 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
3756 don't actually have to check for a __reduce__ method. */
3757
3758 /* Check for a __reduce_ex__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003759 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003760 if (reduce_func != NULL) {
3761 PyObject *proto;
3762 proto = PyLong_FromLong(self->proto);
3763 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08003764 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003765 }
3766 }
3767 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003768 PickleState *st = _Pickle_GetGlobalState();
3769
3770 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003771 PyErr_Clear();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003772 }
3773 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003774 goto error;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003775 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003776 /* Check for a __reduce__ method. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003777 reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003778 if (reduce_func != NULL) {
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003779 PyObject *empty_tuple = PyTuple_New(0);
3780 reduce_value = PyObject_Call(reduce_func, empty_tuple,
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003781 NULL);
Alexandre Vassalotti6bf41e52013-11-28 15:17:29 -08003782 Py_DECREF(empty_tuple);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003783 }
3784 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003785 PyErr_Format(st->PicklingError,
3786 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003787 type->tp_name, obj);
3788 goto error;
3789 }
3790 }
3791 }
3792
3793 if (reduce_value == NULL)
3794 goto error;
3795
3796 if (PyUnicode_Check(reduce_value)) {
3797 status = save_global(self, obj, reduce_value);
3798 goto done;
3799 }
3800
3801 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003802 PickleState *st = _Pickle_GetGlobalState();
3803 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003804 "__reduce__ must return a string or tuple");
3805 goto error;
3806 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003807
3808 status = save_reduce(self, reduce_value, obj);
3809
3810 if (0) {
3811 error:
3812 status = -1;
3813 }
3814 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08003815
Alexandre Vassalottidff18342008-07-13 18:48:30 +00003816 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003817 Py_XDECREF(reduce_func);
3818 Py_XDECREF(reduce_value);
3819
3820 return status;
3821}
3822
3823static int
3824dump(PicklerObject *self, PyObject *obj)
3825{
3826 const char stop_op = STOP;
3827
3828 if (self->proto >= 2) {
3829 char header[2];
3830
3831 header[0] = PROTO;
3832 assert(self->proto >= 0 && self->proto < 256);
3833 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003834 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003835 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003836 if (self->proto >= 4)
3837 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003838 }
3839
3840 if (save(self, obj, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003841 _Pickler_Write(self, &stop_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003842 return -1;
3843
3844 return 0;
3845}
3846
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003847/*[clinic]
3848
3849_pickle.Pickler.clear_memo
3850
3851 self: PicklerObject
3852
3853Clears the pickler's "memo".
3854
3855The memo is the data structure that remembers which objects the
3856pickler has already seen, so that shared or recursive objects are
3857pickled by reference and not by value. This method is useful when
3858re-using picklers.
3859[clinic]*/
3860
3861PyDoc_STRVAR(_pickle_Pickler_clear_memo__doc__,
3862"clear_memo()\n"
3863"Clears the pickler\'s \"memo\".\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003864"\n"
3865"The memo is the data structure that remembers which objects the\n"
3866"pickler has already seen, so that shared or recursive objects are\n"
3867"pickled by reference and not by value. This method is useful when\n"
3868"re-using picklers.");
3869
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003870#define _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF \
3871 {"clear_memo", (PyCFunction)_pickle_Pickler_clear_memo, METH_NOARGS, _pickle_Pickler_clear_memo__doc__},
3872
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003873static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003874_pickle_Pickler_clear_memo(PicklerObject *self)
3875/*[clinic checksum: 9c32be7e7a17ff82a81aae409d0d4f469033a5b2]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003876{
3877 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003878 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003879
3880 Py_RETURN_NONE;
3881}
3882
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003883/*[clinic]
3884
3885_pickle.Pickler.dump
3886
3887 self: PicklerObject
3888 obj: object
3889 /
3890
3891Write a pickled representation of the given object to the open file.
3892[clinic]*/
3893
3894PyDoc_STRVAR(_pickle_Pickler_dump__doc__,
3895"dump(obj)\n"
3896"Write a pickled representation of the given object to the open file.");
3897
3898#define _PICKLE_PICKLER_DUMP_METHODDEF \
3899 {"dump", (PyCFunction)_pickle_Pickler_dump, METH_O, _pickle_Pickler_dump__doc__},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003900
3901static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003902_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
3903/*[clinic checksum: b72a69ec98737fabf66dae7c5a3210178bdbd3e6]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003904{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003905 /* Check whether the Pickler was initialized correctly (issue3664).
3906 Developers often forget to call __init__() in their subclasses, which
3907 would trigger a segfault without this check. */
3908 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003909 PickleState *st = _Pickle_GetGlobalState();
3910 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00003911 "Pickler.__init__() was not called by %s.__init__()",
3912 Py_TYPE(self)->tp_name);
3913 return NULL;
3914 }
3915
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003916 if (_Pickler_ClearBuffer(self) < 0)
3917 return NULL;
3918
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003919 if (dump(self, obj) < 0)
3920 return NULL;
3921
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003922 if (_Pickler_FlushToFile(self) < 0)
3923 return NULL;
3924
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003925 Py_RETURN_NONE;
3926}
3927
3928static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003929 _PICKLE_PICKLER_DUMP_METHODDEF
3930 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003931 {NULL, NULL} /* sentinel */
3932};
3933
3934static void
3935Pickler_dealloc(PicklerObject *self)
3936{
3937 PyObject_GC_UnTrack(self);
3938
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003939 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003940 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003941 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003942 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003943 Py_XDECREF(self->fast_memo);
3944
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003945 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003946
3947 Py_TYPE(self)->tp_free((PyObject *)self);
3948}
3949
3950static int
3951Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
3952{
3953 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003954 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003955 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003956 Py_VISIT(self->fast_memo);
3957 return 0;
3958}
3959
3960static int
3961Pickler_clear(PicklerObject *self)
3962{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003963 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003964 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003965 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01003966 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003967 Py_CLEAR(self->fast_memo);
3968
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003969 if (self->memo != NULL) {
3970 PyMemoTable *memo = self->memo;
3971 self->memo = NULL;
3972 PyMemoTable_Del(memo);
3973 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003974 return 0;
3975}
3976
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003977
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08003978/*[clinic]
3979
3980_pickle.Pickler.__init__
3981
3982 self: PicklerObject
3983 file: object
3984 protocol: object = NULL
3985 fix_imports: bool = True
3986
3987This takes a binary file for writing a pickle data stream.
3988
3989The optional protocol argument tells the pickler to use the
3990given protocol; supported protocols are 0, 1, 2, 3 and 4. The
3991default protocol is 3; a backward-incompatible protocol designed for
3992Python 3.
3993
3994Specifying a negative protocol version selects the highest
3995protocol version supported. The higher the protocol used, the
3996more recent the version of Python needed to read the pickle
3997produced.
3998
3999The file argument must have a write() method that accepts a single
4000bytes argument. It can thus be a file object opened for binary
4001writing, a io.BytesIO instance, or any other custom object that
4002meets this interface.
4003
4004If fix_imports is True and protocol is less than 3, pickle will try to
4005map the new Python 3 names to the old module names used in Python 2,
4006so that the pickle data stream is readable with Python 2.
4007[clinic]*/
4008
4009PyDoc_STRVAR(_pickle_Pickler___init____doc__,
4010"__init__(file, protocol=None, fix_imports=True)\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004011"This takes a binary file for writing a pickle data stream.\n"
4012"\n"
4013"The optional protocol argument tells the pickler to use the\n"
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004014"given protocol; supported protocols are 0, 1, 2, 3 and 4. The\n"
4015"default protocol is 3; a backward-incompatible protocol designed for\n"
4016"Python 3.\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004017"\n"
4018"Specifying a negative protocol version selects the highest\n"
4019"protocol version supported. The higher the protocol used, the\n"
4020"more recent the version of Python needed to read the pickle\n"
4021"produced.\n"
4022"\n"
4023"The file argument must have a write() method that accepts a single\n"
4024"bytes argument. It can thus be a file object opened for binary\n"
4025"writing, a io.BytesIO instance, or any other custom object that\n"
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004026"meets this interface.\n"
4027"\n"
4028"If fix_imports is True and protocol is less than 3, pickle will try to\n"
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004029"map the new Python 3 names to the old module names used in Python 2,\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004030"so that the pickle data stream is readable with Python 2.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004031
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004032#define _PICKLE_PICKLER___INIT___METHODDEF \
4033 {"__init__", (PyCFunction)_pickle_Pickler___init__, METH_VARARGS|METH_KEYWORDS, _pickle_Pickler___init____doc__},
4034
4035static PyObject *
4036_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports);
4037
4038static PyObject *
4039_pickle_Pickler___init__(PyObject *self, PyObject *args, PyObject *kwargs)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004040{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004041 PyObject *return_value = NULL;
4042 static char *_keywords[] = {"file", "protocol", "fix_imports", NULL};
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004043 PyObject *file;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004044 PyObject *protocol = NULL;
4045 int fix_imports = 1;
4046
4047 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
4048 "O|Op:__init__", _keywords,
4049 &file, &protocol, &fix_imports))
4050 goto exit;
4051 return_value = _pickle_Pickler___init___impl((PicklerObject *)self, file, protocol, fix_imports);
4052
4053exit:
4054 return return_value;
4055}
4056
4057static PyObject *
4058_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports)
4059/*[clinic checksum: c99ff417bd703a74affc4b708167e56e135e8969]*/
4060{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004061 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004062 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004063
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004064 /* In case of multiple __init__() calls, clear previous content. */
4065 if (self->write != NULL)
4066 (void)Pickler_clear(self);
4067
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004068 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
4069 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004070
4071 if (_Pickler_SetOutputStream(self, file) < 0)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004072 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004073
4074 /* memo and output_buffer may have already been created in _Pickler_New */
4075 if (self->memo == NULL) {
4076 self->memo = PyMemoTable_New();
4077 if (self->memo == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004078 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004079 }
4080 self->output_len = 0;
4081 if (self->output_buffer == NULL) {
4082 self->max_output_len = WRITE_BUF_SIZE;
4083 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4084 self->max_output_len);
4085 if (self->output_buffer == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004086 return NULL;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004087 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004088
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004089 self->fast = 0;
4090 self->fast_nesting = 0;
4091 self->fast_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004092 self->pers_func = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004093 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) {
4094 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
4095 &PyId_persistent_id);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004096 if (self->pers_func == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004097 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004098 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004099 self->dispatch_table = NULL;
4100 if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) {
4101 self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
4102 &PyId_dispatch_table);
4103 if (self->dispatch_table == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004104 return NULL;
4105 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004106
4107 Py_RETURN_NONE;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004108}
4109
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004110/* Wrap the Clinic generated signature to slot it in tp_init. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004111static int
4112Pickler_init(PyObject *self, PyObject *args, PyObject *kwargs)
4113{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004114 PyObject *result = _pickle_Pickler___init__(self, args, kwargs);
4115 if (result == NULL) {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004116 return -1;
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004117 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004118 Py_DECREF(result);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004119 return 0;
4120}
4121
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004122/* Define a proxy object for the Pickler's internal memo object. This is to
4123 * avoid breaking code like:
4124 * pickler.memo.clear()
4125 * and
4126 * pickler.memo = saved_memo
4127 * Is this a good idea? Not really, but we don't want to break code that uses
4128 * it. Note that we don't implement the entire mapping API here. This is
4129 * intentional, as these should be treated as black-box implementation details.
4130 */
4131
4132typedef struct {
4133 PyObject_HEAD
4134 PicklerObject *pickler; /* Pickler whose memo table we're proxying. */
4135} PicklerMemoProxyObject;
4136
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004137/*[clinic]
4138_pickle.PicklerMemoProxy.clear
4139
4140 self: PicklerMemoProxyObject
4141
4142Remove all items from memo.
4143[clinic]*/
4144
4145PyDoc_STRVAR(_pickle_PicklerMemoProxy_clear__doc__,
4146"clear()\n"
4147"Remove all items from memo.");
4148
4149#define _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF \
4150 {"clear", (PyCFunction)_pickle_PicklerMemoProxy_clear, METH_NOARGS, _pickle_PicklerMemoProxy_clear__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004151
4152static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004153_pickle_PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4154/*[clinic checksum: 507f13938721992e175a3e58b5ad02620045a1cc]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004155{
4156 if (self->pickler->memo)
4157 PyMemoTable_Clear(self->pickler->memo);
4158 Py_RETURN_NONE;
4159}
4160
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004161/*[clinic]
4162_pickle.PicklerMemoProxy.copy
4163
4164 self: PicklerMemoProxyObject
4165
4166Copy the memo to a new object.
4167[clinic]*/
4168
4169PyDoc_STRVAR(_pickle_PicklerMemoProxy_copy__doc__,
4170"copy()\n"
4171"Copy the memo to a new object.");
4172
4173#define _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF \
4174 {"copy", (PyCFunction)_pickle_PicklerMemoProxy_copy, METH_NOARGS, _pickle_PicklerMemoProxy_copy__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004175
4176static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004177_pickle_PicklerMemoProxy_copy(PicklerMemoProxyObject *self)
4178/*[clinic checksum: 73a5117ab354290ebdbe07bd0bf7232d0936a69d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004179{
4180 Py_ssize_t i;
4181 PyMemoTable *memo;
4182 PyObject *new_memo = PyDict_New();
4183 if (new_memo == NULL)
4184 return NULL;
4185
4186 memo = self->pickler->memo;
4187 for (i = 0; i < memo->mt_allocated; ++i) {
4188 PyMemoEntry entry = memo->mt_table[i];
4189 if (entry.me_key != NULL) {
4190 int status;
4191 PyObject *key, *value;
4192
4193 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004194 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004195
4196 if (key == NULL || value == NULL) {
4197 Py_XDECREF(key);
4198 Py_XDECREF(value);
4199 goto error;
4200 }
4201 status = PyDict_SetItem(new_memo, key, value);
4202 Py_DECREF(key);
4203 Py_DECREF(value);
4204 if (status < 0)
4205 goto error;
4206 }
4207 }
4208 return new_memo;
4209
4210 error:
4211 Py_XDECREF(new_memo);
4212 return NULL;
4213}
4214
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004215/*[clinic]
4216_pickle.PicklerMemoProxy.__reduce__
4217
4218 self: PicklerMemoProxyObject
4219
4220Implement pickle support.
4221[clinic]*/
4222
4223PyDoc_STRVAR(_pickle_PicklerMemoProxy___reduce____doc__,
4224"__reduce__()\n"
4225"Implement pickle support.");
4226
4227#define _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF \
4228 {"__reduce__", (PyCFunction)_pickle_PicklerMemoProxy___reduce__, METH_NOARGS, _pickle_PicklerMemoProxy___reduce____doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004229
4230static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004231_pickle_PicklerMemoProxy___reduce__(PicklerMemoProxyObject *self)
4232/*[clinic checksum: 40f0bf7a9b161e77130674f0481bda0a0184dcce]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004233{
4234 PyObject *reduce_value, *dict_args;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004235 PyObject *contents = _pickle_PicklerMemoProxy_copy(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004236 if (contents == NULL)
4237 return NULL;
4238
4239 reduce_value = PyTuple_New(2);
4240 if (reduce_value == NULL) {
4241 Py_DECREF(contents);
4242 return NULL;
4243 }
4244 dict_args = PyTuple_New(1);
4245 if (dict_args == NULL) {
4246 Py_DECREF(contents);
4247 Py_DECREF(reduce_value);
4248 return NULL;
4249 }
4250 PyTuple_SET_ITEM(dict_args, 0, contents);
4251 Py_INCREF((PyObject *)&PyDict_Type);
4252 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4253 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4254 return reduce_value;
4255}
4256
4257static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004258 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4259 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4260 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004261 {NULL, NULL} /* sentinel */
4262};
4263
4264static void
4265PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4266{
4267 PyObject_GC_UnTrack(self);
4268 Py_XDECREF(self->pickler);
4269 PyObject_GC_Del((PyObject *)self);
4270}
4271
4272static int
4273PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4274 visitproc visit, void *arg)
4275{
4276 Py_VISIT(self->pickler);
4277 return 0;
4278}
4279
4280static int
4281PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4282{
4283 Py_CLEAR(self->pickler);
4284 return 0;
4285}
4286
4287static PyTypeObject PicklerMemoProxyType = {
4288 PyVarObject_HEAD_INIT(NULL, 0)
4289 "_pickle.PicklerMemoProxy", /*tp_name*/
4290 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4291 0,
4292 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
4293 0, /* tp_print */
4294 0, /* tp_getattr */
4295 0, /* tp_setattr */
4296 0, /* tp_compare */
4297 0, /* tp_repr */
4298 0, /* tp_as_number */
4299 0, /* tp_as_sequence */
4300 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004301 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004302 0, /* tp_call */
4303 0, /* tp_str */
4304 PyObject_GenericGetAttr, /* tp_getattro */
4305 PyObject_GenericSetAttr, /* tp_setattro */
4306 0, /* tp_as_buffer */
4307 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4308 0, /* tp_doc */
4309 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4310 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4311 0, /* tp_richcompare */
4312 0, /* tp_weaklistoffset */
4313 0, /* tp_iter */
4314 0, /* tp_iternext */
4315 picklerproxy_methods, /* tp_methods */
4316};
4317
4318static PyObject *
4319PicklerMemoProxy_New(PicklerObject *pickler)
4320{
4321 PicklerMemoProxyObject *self;
4322
4323 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4324 if (self == NULL)
4325 return NULL;
4326 Py_INCREF(pickler);
4327 self->pickler = pickler;
4328 PyObject_GC_Track(self);
4329 return (PyObject *)self;
4330}
4331
4332/*****************************************************************************/
4333
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004334static PyObject *
4335Pickler_get_memo(PicklerObject *self)
4336{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004337 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004338}
4339
4340static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004341Pickler_set_memo(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004342{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004343 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004344
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004345 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004346 PyErr_SetString(PyExc_TypeError,
4347 "attribute deletion is not supported");
4348 return -1;
4349 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004350
4351 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4352 PicklerObject *pickler =
4353 ((PicklerMemoProxyObject *)obj)->pickler;
4354
4355 new_memo = PyMemoTable_Copy(pickler->memo);
4356 if (new_memo == NULL)
4357 return -1;
4358 }
4359 else if (PyDict_Check(obj)) {
4360 Py_ssize_t i = 0;
4361 PyObject *key, *value;
4362
4363 new_memo = PyMemoTable_New();
4364 if (new_memo == NULL)
4365 return -1;
4366
4367 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004368 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004369 PyObject *memo_obj;
4370
4371 if (!PyTuple_Check(value) || Py_SIZE(value) != 2) {
4372 PyErr_SetString(PyExc_TypeError,
4373 "'memo' values must be 2-item tuples");
4374 goto error;
4375 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004376 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004377 if (memo_id == -1 && PyErr_Occurred())
4378 goto error;
4379 memo_obj = PyTuple_GET_ITEM(value, 1);
4380 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4381 goto error;
4382 }
4383 }
4384 else {
4385 PyErr_Format(PyExc_TypeError,
4386 "'memo' attribute must be an PicklerMemoProxy object"
4387 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004388 return -1;
4389 }
4390
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004391 PyMemoTable_Del(self->memo);
4392 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004393
4394 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004395
4396 error:
4397 if (new_memo)
4398 PyMemoTable_Del(new_memo);
4399 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004400}
4401
4402static PyObject *
4403Pickler_get_persid(PicklerObject *self)
4404{
4405 if (self->pers_func == NULL)
4406 PyErr_SetString(PyExc_AttributeError, "persistent_id");
4407 else
4408 Py_INCREF(self->pers_func);
4409 return self->pers_func;
4410}
4411
4412static int
4413Pickler_set_persid(PicklerObject *self, PyObject *value)
4414{
4415 PyObject *tmp;
4416
4417 if (value == NULL) {
4418 PyErr_SetString(PyExc_TypeError,
4419 "attribute deletion is not supported");
4420 return -1;
4421 }
4422 if (!PyCallable_Check(value)) {
4423 PyErr_SetString(PyExc_TypeError,
4424 "persistent_id must be a callable taking one argument");
4425 return -1;
4426 }
4427
4428 tmp = self->pers_func;
4429 Py_INCREF(value);
4430 self->pers_func = value;
4431 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
4432
4433 return 0;
4434}
4435
4436static PyMemberDef Pickler_members[] = {
4437 {"bin", T_INT, offsetof(PicklerObject, bin)},
4438 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004439 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004440 {NULL}
4441};
4442
4443static PyGetSetDef Pickler_getsets[] = {
4444 {"memo", (getter)Pickler_get_memo,
4445 (setter)Pickler_set_memo},
4446 {"persistent_id", (getter)Pickler_get_persid,
4447 (setter)Pickler_set_persid},
4448 {NULL}
4449};
4450
4451static PyTypeObject Pickler_Type = {
4452 PyVarObject_HEAD_INIT(NULL, 0)
4453 "_pickle.Pickler" , /*tp_name*/
4454 sizeof(PicklerObject), /*tp_basicsize*/
4455 0, /*tp_itemsize*/
4456 (destructor)Pickler_dealloc, /*tp_dealloc*/
4457 0, /*tp_print*/
4458 0, /*tp_getattr*/
4459 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00004460 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004461 0, /*tp_repr*/
4462 0, /*tp_as_number*/
4463 0, /*tp_as_sequence*/
4464 0, /*tp_as_mapping*/
4465 0, /*tp_hash*/
4466 0, /*tp_call*/
4467 0, /*tp_str*/
4468 0, /*tp_getattro*/
4469 0, /*tp_setattro*/
4470 0, /*tp_as_buffer*/
4471 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004472 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004473 (traverseproc)Pickler_traverse, /*tp_traverse*/
4474 (inquiry)Pickler_clear, /*tp_clear*/
4475 0, /*tp_richcompare*/
4476 0, /*tp_weaklistoffset*/
4477 0, /*tp_iter*/
4478 0, /*tp_iternext*/
4479 Pickler_methods, /*tp_methods*/
4480 Pickler_members, /*tp_members*/
4481 Pickler_getsets, /*tp_getset*/
4482 0, /*tp_base*/
4483 0, /*tp_dict*/
4484 0, /*tp_descr_get*/
4485 0, /*tp_descr_set*/
4486 0, /*tp_dictoffset*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004487 Pickler_init, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004488 PyType_GenericAlloc, /*tp_alloc*/
4489 PyType_GenericNew, /*tp_new*/
4490 PyObject_GC_Del, /*tp_free*/
4491 0, /*tp_is_gc*/
4492};
4493
Victor Stinner121aab42011-09-29 23:40:53 +02004494/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004495
4496 XXX: It would be nice to able to avoid Python function call overhead, by
4497 using directly the C version of find_class(), when find_class() is not
4498 overridden by a subclass. Although, this could become rather hackish. A
4499 simpler optimization would be to call the C function when self is not a
4500 subclass instance. */
4501static PyObject *
4502find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
4503{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004504 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004505
4506 return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO",
4507 module_name, global_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004508}
4509
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004510static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004511marker(UnpicklerObject *self)
4512{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004513 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004514 if (self->num_marks < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004515 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004516 return -1;
4517 }
4518
4519 return self->marks[--self->num_marks];
4520}
4521
4522static int
4523load_none(UnpicklerObject *self)
4524{
4525 PDATA_APPEND(self->stack, Py_None, -1);
4526 return 0;
4527}
4528
4529static int
4530bad_readline(void)
4531{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004532 PickleState *st = _Pickle_GetGlobalState();
4533 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004534 return -1;
4535}
4536
4537static int
4538load_int(UnpicklerObject *self)
4539{
4540 PyObject *value;
4541 char *endptr, *s;
4542 Py_ssize_t len;
4543 long x;
4544
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004545 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004546 return -1;
4547 if (len < 2)
4548 return bad_readline();
4549
4550 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02004551 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004552 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004553 x = strtol(s, &endptr, 0);
4554
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004555 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004556 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03004557 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004558 errno = 0;
4559 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004560 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004561 if (value == NULL) {
4562 PyErr_SetString(PyExc_ValueError,
4563 "could not convert string to int");
4564 return -1;
4565 }
4566 }
4567 else {
4568 if (len == 3 && (x == 0 || x == 1)) {
4569 if ((value = PyBool_FromLong(x)) == NULL)
4570 return -1;
4571 }
4572 else {
4573 if ((value = PyLong_FromLong(x)) == NULL)
4574 return -1;
4575 }
4576 }
4577
4578 PDATA_PUSH(self->stack, value, -1);
4579 return 0;
4580}
4581
4582static int
4583load_bool(UnpicklerObject *self, PyObject *boolean)
4584{
4585 assert(boolean == Py_True || boolean == Py_False);
4586 PDATA_APPEND(self->stack, boolean, -1);
4587 return 0;
4588}
4589
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004590/* s contains x bytes of an unsigned little-endian integer. Return its value
4591 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
4592 */
4593static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004594calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004595{
4596 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004597 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004598 size_t x = 0;
4599
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004600 for (i = 0; i < nbytes && i < sizeof(size_t); i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004601 x |= (size_t) s[i] << (8 * i);
4602 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004603
4604 if (x > PY_SSIZE_T_MAX)
4605 return -1;
4606 else
4607 return (Py_ssize_t) x;
4608}
4609
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004610/* s contains x bytes of a little-endian integer. Return its value as a
4611 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
4612 * int, but when x is 4 it's a signed one. This is an historical source
4613 * of x-platform bugs.
4614 */
4615static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004616calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004617{
4618 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004619 int i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004620 long x = 0;
4621
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004622 for (i = 0; i < nbytes; i++) {
4623 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004624 }
4625
4626 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
4627 * is signed, so on a box with longs bigger than 4 bytes we need
4628 * to extend a BININT's sign bit to the full width.
4629 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004630 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004631 x |= -(x & (1L << 31));
4632 }
4633
4634 return x;
4635}
4636
4637static int
4638load_binintx(UnpicklerObject *self, char *s, int size)
4639{
4640 PyObject *value;
4641 long x;
4642
4643 x = calc_binint(s, size);
4644
4645 if ((value = PyLong_FromLong(x)) == NULL)
4646 return -1;
4647
4648 PDATA_PUSH(self->stack, value, -1);
4649 return 0;
4650}
4651
4652static int
4653load_binint(UnpicklerObject *self)
4654{
4655 char *s;
4656
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004657 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004658 return -1;
4659
4660 return load_binintx(self, s, 4);
4661}
4662
4663static int
4664load_binint1(UnpicklerObject *self)
4665{
4666 char *s;
4667
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004668 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004669 return -1;
4670
4671 return load_binintx(self, s, 1);
4672}
4673
4674static int
4675load_binint2(UnpicklerObject *self)
4676{
4677 char *s;
4678
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004679 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004680 return -1;
4681
4682 return load_binintx(self, s, 2);
4683}
4684
4685static int
4686load_long(UnpicklerObject *self)
4687{
4688 PyObject *value;
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004689 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004690 Py_ssize_t len;
4691
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004692 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004693 return -1;
4694 if (len < 2)
4695 return bad_readline();
4696
Mark Dickinson8dd05142009-01-20 20:43:58 +00004697 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
4698 the 'L' before calling PyLong_FromString. In order to maintain
4699 compatibility with Python 3.0.0, we don't actually *require*
4700 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004701 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00004702 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00004703 /* XXX: Should the base argument explicitly set to 10? */
4704 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00004705 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004706 return -1;
4707
4708 PDATA_PUSH(self->stack, value, -1);
4709 return 0;
4710}
4711
4712/* 'size' bytes contain the # of bytes of little-endian 256's-complement
4713 * data following.
4714 */
4715static int
4716load_counted_long(UnpicklerObject *self, int size)
4717{
4718 PyObject *value;
4719 char *nbytes;
4720 char *pdata;
4721
4722 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004723 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004724 return -1;
4725
4726 size = calc_binint(nbytes, size);
4727 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004728 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004729 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004730 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004731 "LONG pickle has negative byte count");
4732 return -1;
4733 }
4734
4735 if (size == 0)
4736 value = PyLong_FromLong(0L);
4737 else {
4738 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004739 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004740 return -1;
4741 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
4742 1 /* little endian */ , 1 /* signed */ );
4743 }
4744 if (value == NULL)
4745 return -1;
4746 PDATA_PUSH(self->stack, value, -1);
4747 return 0;
4748}
4749
4750static int
4751load_float(UnpicklerObject *self)
4752{
4753 PyObject *value;
4754 char *endptr, *s;
4755 Py_ssize_t len;
4756 double d;
4757
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004758 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004759 return -1;
4760 if (len < 2)
4761 return bad_readline();
4762
4763 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004764 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
4765 if (d == -1.0 && PyErr_Occurred())
4766 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004767 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004768 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
4769 return -1;
4770 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00004771 value = PyFloat_FromDouble(d);
4772 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004773 return -1;
4774
4775 PDATA_PUSH(self->stack, value, -1);
4776 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004777}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004778
4779static int
4780load_binfloat(UnpicklerObject *self)
4781{
4782 PyObject *value;
4783 double x;
4784 char *s;
4785
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004786 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004787 return -1;
4788
4789 x = _PyFloat_Unpack8((unsigned char *)s, 0);
4790 if (x == -1.0 && PyErr_Occurred())
4791 return -1;
4792
4793 if ((value = PyFloat_FromDouble(x)) == NULL)
4794 return -1;
4795
4796 PDATA_PUSH(self->stack, value, -1);
4797 return 0;
4798}
4799
4800static int
4801load_string(UnpicklerObject *self)
4802{
4803 PyObject *bytes;
4804 PyObject *str = NULL;
4805 Py_ssize_t len;
4806 char *s, *p;
4807
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004808 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004809 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004810 /* Strip the newline */
4811 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004812 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004813 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004814 p = s + 1;
4815 len -= 2;
4816 }
4817 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004818 PickleState *st = _Pickle_GetGlobalState();
4819 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004820 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004821 return -1;
4822 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07004823 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004824
4825 /* Use the PyBytes API to decode the string, since that is what is used
4826 to encode, and then coerce the result to Unicode. */
4827 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004828 if (bytes == NULL)
4829 return -1;
4830 str = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
4831 Py_DECREF(bytes);
4832 if (str == NULL)
4833 return -1;
4834
4835 PDATA_PUSH(self->stack, str, -1);
4836 return 0;
4837}
4838
4839static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004840load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004841{
4842 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004843 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004844 char *s;
4845
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004846 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004847 return -1;
4848
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004849 size = calc_binsize(s, nbytes);
4850 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004851 PyErr_Format(PyExc_OverflowError,
4852 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004853 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004854 return -1;
4855 }
4856
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004857 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004858 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004859
4860 bytes = PyBytes_FromStringAndSize(s, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004861 if (bytes == NULL)
4862 return -1;
4863
4864 PDATA_PUSH(self->stack, bytes, -1);
4865 return 0;
4866}
4867
4868static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004869load_counted_binstring(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004870{
4871 PyObject *str;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004872 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004873 char *s;
4874
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004875 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004876 return -1;
4877
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004878 size = calc_binsize(s, nbytes);
4879 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004880 PickleState *st = _Pickle_GetGlobalState();
4881 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004882 "BINSTRING exceeds system's maximum size of %zd bytes",
4883 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;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004889 /* Convert Python 2.x strings to unicode. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004890 str = PyUnicode_Decode(s, size, self->encoding, self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004891 if (str == NULL)
4892 return -1;
4893
4894 PDATA_PUSH(self->stack, str, -1);
4895 return 0;
4896}
4897
4898static int
4899load_unicode(UnpicklerObject *self)
4900{
4901 PyObject *str;
4902 Py_ssize_t len;
4903 char *s;
4904
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004905 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004906 return -1;
4907 if (len < 1)
4908 return bad_readline();
4909
4910 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
4911 if (str == NULL)
4912 return -1;
4913
4914 PDATA_PUSH(self->stack, str, -1);
4915 return 0;
4916}
4917
4918static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004919load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004920{
4921 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004922 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004923 char *s;
4924
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004925 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004926 return -1;
4927
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004928 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004929 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004930 PyErr_Format(PyExc_OverflowError,
4931 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07004932 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004933 return -1;
4934 }
4935
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004936 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004937 return -1;
4938
Victor Stinner485fb562010-04-13 11:07:24 +00004939 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004940 if (str == NULL)
4941 return -1;
4942
4943 PDATA_PUSH(self->stack, str, -1);
4944 return 0;
4945}
4946
4947static int
4948load_tuple(UnpicklerObject *self)
4949{
4950 PyObject *tuple;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004951 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004952
4953 if ((i = marker(self)) < 0)
4954 return -1;
4955
4956 tuple = Pdata_poptuple(self->stack, i);
4957 if (tuple == NULL)
4958 return -1;
4959 PDATA_PUSH(self->stack, tuple, -1);
4960 return 0;
4961}
4962
4963static int
4964load_counted_tuple(UnpicklerObject *self, int len)
4965{
4966 PyObject *tuple;
4967
4968 tuple = PyTuple_New(len);
4969 if (tuple == NULL)
4970 return -1;
4971
4972 while (--len >= 0) {
4973 PyObject *item;
4974
4975 PDATA_POP(self->stack, item);
4976 if (item == NULL)
4977 return -1;
4978 PyTuple_SET_ITEM(tuple, len, item);
4979 }
4980 PDATA_PUSH(self->stack, tuple, -1);
4981 return 0;
4982}
4983
4984static int
4985load_empty_list(UnpicklerObject *self)
4986{
4987 PyObject *list;
4988
4989 if ((list = PyList_New(0)) == NULL)
4990 return -1;
4991 PDATA_PUSH(self->stack, list, -1);
4992 return 0;
4993}
4994
4995static int
4996load_empty_dict(UnpicklerObject *self)
4997{
4998 PyObject *dict;
4999
5000 if ((dict = PyDict_New()) == NULL)
5001 return -1;
5002 PDATA_PUSH(self->stack, dict, -1);
5003 return 0;
5004}
5005
5006static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005007load_empty_set(UnpicklerObject *self)
5008{
5009 PyObject *set;
5010
5011 if ((set = PySet_New(NULL)) == NULL)
5012 return -1;
5013 PDATA_PUSH(self->stack, set, -1);
5014 return 0;
5015}
5016
5017static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005018load_list(UnpicklerObject *self)
5019{
5020 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005021 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005022
5023 if ((i = marker(self)) < 0)
5024 return -1;
5025
5026 list = Pdata_poplist(self->stack, i);
5027 if (list == NULL)
5028 return -1;
5029 PDATA_PUSH(self->stack, list, -1);
5030 return 0;
5031}
5032
5033static int
5034load_dict(UnpicklerObject *self)
5035{
5036 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005037 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005038
5039 if ((i = marker(self)) < 0)
5040 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005041 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005042
5043 if ((dict = PyDict_New()) == NULL)
5044 return -1;
5045
5046 for (k = i + 1; k < j; k += 2) {
5047 key = self->stack->data[k - 1];
5048 value = self->stack->data[k];
5049 if (PyDict_SetItem(dict, key, value) < 0) {
5050 Py_DECREF(dict);
5051 return -1;
5052 }
5053 }
5054 Pdata_clear(self->stack, i);
5055 PDATA_PUSH(self->stack, dict, -1);
5056 return 0;
5057}
5058
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005059static int
5060load_frozenset(UnpicklerObject *self)
5061{
5062 PyObject *items;
5063 PyObject *frozenset;
5064 Py_ssize_t i;
5065
5066 if ((i = marker(self)) < 0)
5067 return -1;
5068
5069 items = Pdata_poptuple(self->stack, i);
5070 if (items == NULL)
5071 return -1;
5072
5073 frozenset = PyFrozenSet_New(items);
5074 Py_DECREF(items);
5075 if (frozenset == NULL)
5076 return -1;
5077
5078 PDATA_PUSH(self->stack, frozenset, -1);
5079 return 0;
5080}
5081
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005082static PyObject *
5083instantiate(PyObject *cls, PyObject *args)
5084{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005085 PyObject *result = NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005086 _Py_IDENTIFIER(__getinitargs__);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005087 /* Caller must assure args are a tuple. Normally, args come from
5088 Pdata_poptuple which packs objects from the top of the stack
5089 into a newly created tuple. */
5090 assert(PyTuple_Check(args));
5091 if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02005092 _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005093 result = PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005094 }
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005095 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005096 _Py_IDENTIFIER(__new__);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005097
5098 result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005099 }
5100 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005101}
5102
5103static int
5104load_obj(UnpicklerObject *self)
5105{
5106 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005107 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005108
5109 if ((i = marker(self)) < 0)
5110 return -1;
5111
5112 args = Pdata_poptuple(self->stack, i + 1);
5113 if (args == NULL)
5114 return -1;
5115
5116 PDATA_POP(self->stack, cls);
5117 if (cls) {
5118 obj = instantiate(cls, args);
5119 Py_DECREF(cls);
5120 }
5121 Py_DECREF(args);
5122 if (obj == NULL)
5123 return -1;
5124
5125 PDATA_PUSH(self->stack, obj, -1);
5126 return 0;
5127}
5128
5129static int
5130load_inst(UnpicklerObject *self)
5131{
5132 PyObject *cls = NULL;
5133 PyObject *args = NULL;
5134 PyObject *obj = NULL;
5135 PyObject *module_name;
5136 PyObject *class_name;
5137 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005138 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005139 char *s;
5140
5141 if ((i = marker(self)) < 0)
5142 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005143 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005144 return -1;
5145 if (len < 2)
5146 return bad_readline();
5147
5148 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5149 identifiers are permitted in Python 3.0, since the INST opcode is only
5150 supported by older protocols on Python 2.x. */
5151 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5152 if (module_name == NULL)
5153 return -1;
5154
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005155 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005156 if (len < 2)
5157 return bad_readline();
5158 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005159 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005160 cls = find_class(self, module_name, class_name);
5161 Py_DECREF(class_name);
5162 }
5163 }
5164 Py_DECREF(module_name);
5165
5166 if (cls == NULL)
5167 return -1;
5168
5169 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5170 obj = instantiate(cls, args);
5171 Py_DECREF(args);
5172 }
5173 Py_DECREF(cls);
5174
5175 if (obj == NULL)
5176 return -1;
5177
5178 PDATA_PUSH(self->stack, obj, -1);
5179 return 0;
5180}
5181
5182static int
5183load_newobj(UnpicklerObject *self)
5184{
5185 PyObject *args = NULL;
5186 PyObject *clsraw = NULL;
5187 PyTypeObject *cls; /* clsraw cast to its true type */
5188 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005189 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005190
5191 /* Stack is ... cls argtuple, and we want to call
5192 * cls.__new__(cls, *argtuple).
5193 */
5194 PDATA_POP(self->stack, args);
5195 if (args == NULL)
5196 goto error;
5197 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005198 PyErr_SetString(st->UnpicklingError,
5199 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005200 goto error;
5201 }
5202
5203 PDATA_POP(self->stack, clsraw);
5204 cls = (PyTypeObject *)clsraw;
5205 if (cls == NULL)
5206 goto error;
5207 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005208 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005209 "isn't a type object");
5210 goto error;
5211 }
5212 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005213 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005214 "has NULL tp_new");
5215 goto error;
5216 }
5217
5218 /* Call __new__. */
5219 obj = cls->tp_new(cls, args, NULL);
5220 if (obj == NULL)
5221 goto error;
5222
5223 Py_DECREF(args);
5224 Py_DECREF(clsraw);
5225 PDATA_PUSH(self->stack, obj, -1);
5226 return 0;
5227
5228 error:
5229 Py_XDECREF(args);
5230 Py_XDECREF(clsraw);
5231 return -1;
5232}
5233
5234static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005235load_newobj_ex(UnpicklerObject *self)
5236{
5237 PyObject *cls, *args, *kwargs;
5238 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005239 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005240
5241 PDATA_POP(self->stack, kwargs);
5242 if (kwargs == NULL) {
5243 return -1;
5244 }
5245 PDATA_POP(self->stack, args);
5246 if (args == NULL) {
5247 Py_DECREF(kwargs);
5248 return -1;
5249 }
5250 PDATA_POP(self->stack, cls);
5251 if (cls == NULL) {
5252 Py_DECREF(kwargs);
5253 Py_DECREF(args);
5254 return -1;
5255 }
5256
5257 if (!PyType_Check(cls)) {
5258 Py_DECREF(kwargs);
5259 Py_DECREF(args);
5260 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005261 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005262 "NEWOBJ_EX class argument must be a type, not %.200s",
5263 Py_TYPE(cls)->tp_name);
5264 return -1;
5265 }
5266
5267 if (((PyTypeObject *)cls)->tp_new == NULL) {
5268 Py_DECREF(kwargs);
5269 Py_DECREF(args);
5270 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005271 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005272 "NEWOBJ_EX class argument doesn't have __new__");
5273 return -1;
5274 }
5275 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5276 Py_DECREF(kwargs);
5277 Py_DECREF(args);
5278 Py_DECREF(cls);
5279 if (obj == NULL) {
5280 return -1;
5281 }
5282 PDATA_PUSH(self->stack, obj, -1);
5283 return 0;
5284}
5285
5286static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005287load_global(UnpicklerObject *self)
5288{
5289 PyObject *global = NULL;
5290 PyObject *module_name;
5291 PyObject *global_name;
5292 Py_ssize_t len;
5293 char *s;
5294
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005295 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005296 return -1;
5297 if (len < 2)
5298 return bad_readline();
5299 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5300 if (!module_name)
5301 return -1;
5302
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005303 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005304 if (len < 2) {
5305 Py_DECREF(module_name);
5306 return bad_readline();
5307 }
5308 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
5309 if (global_name) {
5310 global = find_class(self, module_name, global_name);
5311 Py_DECREF(global_name);
5312 }
5313 }
5314 Py_DECREF(module_name);
5315
5316 if (global == NULL)
5317 return -1;
5318 PDATA_PUSH(self->stack, global, -1);
5319 return 0;
5320}
5321
5322static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005323load_stack_global(UnpicklerObject *self)
5324{
5325 PyObject *global;
5326 PyObject *module_name;
5327 PyObject *global_name;
5328
5329 PDATA_POP(self->stack, global_name);
5330 PDATA_POP(self->stack, module_name);
5331 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
5332 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005333 PickleState *st = _Pickle_GetGlobalState();
5334 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005335 Py_XDECREF(global_name);
5336 Py_XDECREF(module_name);
5337 return -1;
5338 }
5339 global = find_class(self, module_name, global_name);
5340 Py_DECREF(global_name);
5341 Py_DECREF(module_name);
5342 if (global == NULL)
5343 return -1;
5344 PDATA_PUSH(self->stack, global, -1);
5345 return 0;
5346}
5347
5348static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005349load_persid(UnpicklerObject *self)
5350{
5351 PyObject *pid;
5352 Py_ssize_t len;
5353 char *s;
5354
5355 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005356 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005357 return -1;
5358 if (len < 2)
5359 return bad_readline();
5360
5361 pid = PyBytes_FromStringAndSize(s, len - 1);
5362 if (pid == NULL)
5363 return -1;
5364
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005365 /* This does not leak since _Pickle_FastCall() steals the reference
5366 to pid first. */
5367 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005368 if (pid == NULL)
5369 return -1;
5370
5371 PDATA_PUSH(self->stack, pid, -1);
5372 return 0;
5373 }
5374 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005375 PickleState *st = _Pickle_GetGlobalState();
5376 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005377 "A load persistent id instruction was encountered,\n"
5378 "but no persistent_load function was specified.");
5379 return -1;
5380 }
5381}
5382
5383static int
5384load_binpersid(UnpicklerObject *self)
5385{
5386 PyObject *pid;
5387
5388 if (self->pers_func) {
5389 PDATA_POP(self->stack, pid);
5390 if (pid == NULL)
5391 return -1;
5392
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005393 /* This does not leak since _Pickle_FastCall() steals the
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005394 reference to pid first. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005395 pid = _Pickle_FastCall(self->pers_func, pid);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005396 if (pid == NULL)
5397 return -1;
5398
5399 PDATA_PUSH(self->stack, pid, -1);
5400 return 0;
5401 }
5402 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005403 PickleState *st = _Pickle_GetGlobalState();
5404 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005405 "A load persistent id instruction was encountered,\n"
5406 "but no persistent_load function was specified.");
5407 return -1;
5408 }
5409}
5410
5411static int
5412load_pop(UnpicklerObject *self)
5413{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005414 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005415
5416 /* Note that we split the (pickle.py) stack into two stacks,
5417 * an object stack and a mark stack. We have to be clever and
5418 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00005419 * mark stack first, and only signalling a stack underflow if
5420 * the object stack is empty and the mark stack doesn't match
5421 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005422 */
Collin Winter8ca69de2009-05-26 16:53:41 +00005423 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005424 self->num_marks--;
Antoine Pitrou01a15ea2010-01-07 17:57:31 +00005425 } else if (len > 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005426 len--;
5427 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005428 Py_SIZE(self->stack) = len;
Collin Winter8ca69de2009-05-26 16:53:41 +00005429 } else {
5430 return stack_underflow();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005431 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005432 return 0;
5433}
5434
5435static int
5436load_pop_mark(UnpicklerObject *self)
5437{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005438 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005439
5440 if ((i = marker(self)) < 0)
5441 return -1;
5442
5443 Pdata_clear(self->stack, i);
5444
5445 return 0;
5446}
5447
5448static int
5449load_dup(UnpicklerObject *self)
5450{
5451 PyObject *last;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005452 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005453
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005454 if ((len = Py_SIZE(self->stack)) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005455 return stack_underflow();
5456 last = self->stack->data[len - 1];
5457 PDATA_APPEND(self->stack, last, -1);
5458 return 0;
5459}
5460
5461static int
5462load_get(UnpicklerObject *self)
5463{
5464 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005465 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005466 Py_ssize_t len;
5467 char *s;
5468
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005469 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005470 return -1;
5471 if (len < 2)
5472 return bad_readline();
5473
5474 key = PyLong_FromString(s, NULL, 10);
5475 if (key == NULL)
5476 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005477 idx = PyLong_AsSsize_t(key);
5478 if (idx == -1 && PyErr_Occurred()) {
5479 Py_DECREF(key);
5480 return -1;
5481 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005482
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005483 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005484 if (value == NULL) {
5485 if (!PyErr_Occurred())
5486 PyErr_SetObject(PyExc_KeyError, key);
5487 Py_DECREF(key);
5488 return -1;
5489 }
5490 Py_DECREF(key);
5491
5492 PDATA_APPEND(self->stack, value, -1);
5493 return 0;
5494}
5495
5496static int
5497load_binget(UnpicklerObject *self)
5498{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005499 PyObject *value;
5500 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005501 char *s;
5502
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005503 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005504 return -1;
5505
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005506 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005507
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005508 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005509 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005510 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005511 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005512 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005513 Py_DECREF(key);
5514 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005515 return -1;
5516 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005517
5518 PDATA_APPEND(self->stack, value, -1);
5519 return 0;
5520}
5521
5522static int
5523load_long_binget(UnpicklerObject *self)
5524{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005525 PyObject *value;
5526 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005527 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005528
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005529 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005530 return -1;
5531
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005532 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005533
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005534 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005535 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005536 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005537 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005538 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02005539 Py_DECREF(key);
5540 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005541 return -1;
5542 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005543
5544 PDATA_APPEND(self->stack, value, -1);
5545 return 0;
5546}
5547
5548/* Push an object from the extension registry (EXT[124]). nbytes is
5549 * the number of bytes following the opcode, holding the index (code) value.
5550 */
5551static int
5552load_extension(UnpicklerObject *self, int nbytes)
5553{
5554 char *codebytes; /* the nbytes bytes after the opcode */
5555 long code; /* calc_binint returns long */
5556 PyObject *py_code; /* code as a Python int */
5557 PyObject *obj; /* the object to push */
5558 PyObject *pair; /* (module_name, class_name) */
5559 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005560 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005561
5562 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005563 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005564 return -1;
5565 code = calc_binint(codebytes, nbytes);
5566 if (code <= 0) { /* note that 0 is forbidden */
5567 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005568 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005569 return -1;
5570 }
5571
5572 /* Look for the code in the cache. */
5573 py_code = PyLong_FromLong(code);
5574 if (py_code == NULL)
5575 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005576 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005577 if (obj != NULL) {
5578 /* Bingo. */
5579 Py_DECREF(py_code);
5580 PDATA_APPEND(self->stack, obj, -1);
5581 return 0;
5582 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005583 if (PyErr_Occurred()) {
5584 Py_DECREF(py_code);
5585 return -1;
5586 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005587
5588 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005589 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005590 if (pair == NULL) {
5591 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08005592 if (!PyErr_Occurred()) {
5593 PyErr_Format(PyExc_ValueError, "unregistered extension "
5594 "code %ld", code);
5595 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005596 return -1;
5597 }
5598 /* Since the extension registry is manipulable via Python code,
5599 * confirm that pair is really a 2-tuple of strings.
5600 */
5601 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
5602 !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
5603 !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
5604 Py_DECREF(py_code);
5605 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
5606 "isn't a 2-tuple of strings", code);
5607 return -1;
5608 }
5609 /* Load the object. */
5610 obj = find_class(self, module_name, class_name);
5611 if (obj == NULL) {
5612 Py_DECREF(py_code);
5613 return -1;
5614 }
5615 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005616 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005617 Py_DECREF(py_code);
5618 if (code < 0) {
5619 Py_DECREF(obj);
5620 return -1;
5621 }
5622 PDATA_PUSH(self->stack, obj, -1);
5623 return 0;
5624}
5625
5626static int
5627load_put(UnpicklerObject *self)
5628{
5629 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005630 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005631 Py_ssize_t len;
5632 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005633
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005634 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005635 return -1;
5636 if (len < 2)
5637 return bad_readline();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005638 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005639 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005640 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005641
5642 key = PyLong_FromString(s, NULL, 10);
5643 if (key == NULL)
5644 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005645 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005646 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005647 if (idx < 0) {
5648 if (!PyErr_Occurred())
5649 PyErr_SetString(PyExc_ValueError,
5650 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005651 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005652 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005653
5654 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005655}
5656
5657static int
5658load_binput(UnpicklerObject *self)
5659{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005660 PyObject *value;
5661 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005662 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005663
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005664 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005665 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005666
5667 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005668 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005669 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005670
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005671 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005672
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005673 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005674}
5675
5676static int
5677load_long_binput(UnpicklerObject *self)
5678{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005679 PyObject *value;
5680 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005681 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005682
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005683 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005684 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005685
5686 if (Py_SIZE(self->stack) <= 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005687 return stack_underflow();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005688 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005689
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005690 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02005691 if (idx < 0) {
5692 PyErr_SetString(PyExc_ValueError,
5693 "negative LONG_BINPUT argument");
5694 return -1;
5695 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005696
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005697 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005698}
5699
5700static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005701load_memoize(UnpicklerObject *self)
5702{
5703 PyObject *value;
5704
5705 if (Py_SIZE(self->stack) <= 0)
5706 return stack_underflow();
5707 value = self->stack->data[Py_SIZE(self->stack) - 1];
5708
5709 return _Unpickler_MemoPut(self, self->memo_len, value);
5710}
5711
5712static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005713do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005714{
5715 PyObject *value;
5716 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005717 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005718
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005719 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005720 if (x > len || x <= 0)
5721 return stack_underflow();
5722 if (len == x) /* nothing to do */
5723 return 0;
5724
5725 list = self->stack->data[x - 1];
5726
5727 if (PyList_Check(list)) {
5728 PyObject *slice;
5729 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005730 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005731
5732 slice = Pdata_poplist(self->stack, x);
5733 if (!slice)
5734 return -1;
5735 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005736 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005737 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005738 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005739 }
5740 else {
5741 PyObject *append_func;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005742 _Py_IDENTIFIER(append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005743
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005744 append_func = _PyObject_GetAttrId(list, &PyId_append);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005745 if (append_func == NULL)
5746 return -1;
5747 for (i = x; i < len; i++) {
5748 PyObject *result;
5749
5750 value = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005751 result = _Pickle_FastCall(append_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005752 if (result == NULL) {
5753 Pdata_clear(self->stack, i + 1);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005754 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005755 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005756 return -1;
5757 }
5758 Py_DECREF(result);
5759 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005760 Py_SIZE(self->stack) = x;
Alexandre Vassalotti637c7c42013-04-20 21:28:21 -07005761 Py_DECREF(append_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005762 }
5763
5764 return 0;
5765}
5766
5767static int
5768load_append(UnpicklerObject *self)
5769{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005770 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005771}
5772
5773static int
5774load_appends(UnpicklerObject *self)
5775{
5776 return do_append(self, marker(self));
5777}
5778
5779static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005780do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005781{
5782 PyObject *value, *key;
5783 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005784 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005785 int status = 0;
5786
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005787 len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005788 if (x > len || x <= 0)
5789 return stack_underflow();
5790 if (len == x) /* nothing to do */
5791 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005792 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005793 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005794 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005795 PyErr_SetString(st->UnpicklingError,
5796 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005797 return -1;
5798 }
5799
5800 /* Here, dict does not actually need to be a PyDict; it could be anything
5801 that supports the __setitem__ attribute. */
5802 dict = self->stack->data[x - 1];
5803
5804 for (i = x + 1; i < len; i += 2) {
5805 key = self->stack->data[i - 1];
5806 value = self->stack->data[i];
5807 if (PyObject_SetItem(dict, key, value) < 0) {
5808 status = -1;
5809 break;
5810 }
5811 }
5812
5813 Pdata_clear(self->stack, x);
5814 return status;
5815}
5816
5817static int
5818load_setitem(UnpicklerObject *self)
5819{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005820 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005821}
5822
5823static int
5824load_setitems(UnpicklerObject *self)
5825{
5826 return do_setitems(self, marker(self));
5827}
5828
5829static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005830load_additems(UnpicklerObject *self)
5831{
5832 PyObject *set;
5833 Py_ssize_t mark, len, i;
5834
5835 mark = marker(self);
5836 len = Py_SIZE(self->stack);
5837 if (mark > len || mark <= 0)
5838 return stack_underflow();
5839 if (len == mark) /* nothing to do */
5840 return 0;
5841
5842 set = self->stack->data[mark - 1];
5843
5844 if (PySet_Check(set)) {
5845 PyObject *items;
5846 int status;
5847
5848 items = Pdata_poptuple(self->stack, mark);
5849 if (items == NULL)
5850 return -1;
5851
5852 status = _PySet_Update(set, items);
5853 Py_DECREF(items);
5854 return status;
5855 }
5856 else {
5857 PyObject *add_func;
5858 _Py_IDENTIFIER(add);
5859
5860 add_func = _PyObject_GetAttrId(set, &PyId_add);
5861 if (add_func == NULL)
5862 return -1;
5863 for (i = mark; i < len; i++) {
5864 PyObject *result;
5865 PyObject *item;
5866
5867 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005868 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005869 if (result == NULL) {
5870 Pdata_clear(self->stack, i + 1);
5871 Py_SIZE(self->stack) = mark;
5872 return -1;
5873 }
5874 Py_DECREF(result);
5875 }
5876 Py_SIZE(self->stack) = mark;
5877 }
5878
5879 return 0;
5880}
5881
5882static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005883load_build(UnpicklerObject *self)
5884{
5885 PyObject *state, *inst, *slotstate;
5886 PyObject *setstate;
5887 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005888 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005889
5890 /* Stack is ... instance, state. We want to leave instance at
5891 * the stack top, possibly mutated via instance.__setstate__(state).
5892 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005893 if (Py_SIZE(self->stack) < 2)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005894 return stack_underflow();
5895
5896 PDATA_POP(self->stack, state);
5897 if (state == NULL)
5898 return -1;
5899
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005900 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005901
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005902 setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005903 if (setstate == NULL) {
5904 if (PyErr_ExceptionMatches(PyExc_AttributeError))
5905 PyErr_Clear();
Antoine Pitroud79dc622008-09-05 00:03:33 +00005906 else {
5907 Py_DECREF(state);
Alexandre Vassalotti1f9d9072008-08-15 03:07:47 +00005908 return -1;
Antoine Pitroud79dc622008-09-05 00:03:33 +00005909 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005910 }
5911 else {
5912 PyObject *result;
5913
5914 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08005915 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005916 Py_DECREF(setstate);
5917 if (result == NULL)
5918 return -1;
5919 Py_DECREF(result);
5920 return 0;
5921 }
5922
5923 /* A default __setstate__. First see whether state embeds a
5924 * slot state dict too (a proto 2 addition).
5925 */
5926 if (PyTuple_Check(state) && Py_SIZE(state) == 2) {
5927 PyObject *tmp = state;
5928
5929 state = PyTuple_GET_ITEM(tmp, 0);
5930 slotstate = PyTuple_GET_ITEM(tmp, 1);
5931 Py_INCREF(state);
5932 Py_INCREF(slotstate);
5933 Py_DECREF(tmp);
5934 }
5935 else
5936 slotstate = NULL;
5937
5938 /* Set inst.__dict__ from the state dict (if any). */
5939 if (state != Py_None) {
5940 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005941 PyObject *d_key, *d_value;
5942 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005943 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005944
5945 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005946 PickleState *st = _Pickle_GetGlobalState();
5947 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005948 goto error;
5949 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005950 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005951 if (dict == NULL)
5952 goto error;
5953
Antoine Pitroua9f48a02009-05-02 21:41:14 +00005954 i = 0;
5955 while (PyDict_Next(state, &i, &d_key, &d_value)) {
5956 /* normally the keys for instance attributes are
5957 interned. we should try to do that here. */
5958 Py_INCREF(d_key);
5959 if (PyUnicode_CheckExact(d_key))
5960 PyUnicode_InternInPlace(&d_key);
5961 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
5962 Py_DECREF(d_key);
5963 goto error;
5964 }
5965 Py_DECREF(d_key);
5966 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005967 Py_DECREF(dict);
5968 }
5969
5970 /* Also set instance attributes from the slotstate dict (if any). */
5971 if (slotstate != NULL) {
5972 PyObject *d_key, *d_value;
5973 Py_ssize_t i;
5974
5975 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005976 PickleState *st = _Pickle_GetGlobalState();
5977 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005978 "slot state is not a dictionary");
5979 goto error;
5980 }
5981 i = 0;
5982 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
5983 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
5984 goto error;
5985 }
5986 }
5987
5988 if (0) {
5989 error:
5990 status = -1;
5991 }
5992
5993 Py_DECREF(state);
5994 Py_XDECREF(slotstate);
5995 return status;
5996}
5997
5998static int
5999load_mark(UnpicklerObject *self)
6000{
6001
6002 /* Note that we split the (pickle.py) stack into two stacks, an
6003 * object stack and a mark stack. Here we push a mark onto the
6004 * mark stack.
6005 */
6006
6007 if ((self->num_marks + 1) >= self->marks_size) {
6008 size_t alloc;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006009 Py_ssize_t *marks;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006010
6011 /* Use the size_t type to check for overflow. */
6012 alloc = ((size_t)self->num_marks << 1) + 20;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006013 if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) ||
Alexandre Vassalotti7634ff52008-06-13 02:16:06 +00006014 alloc <= ((size_t)self->num_marks + 1)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006015 PyErr_NoMemory();
6016 return -1;
6017 }
6018
6019 if (self->marks == NULL)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006020 marks = (Py_ssize_t *) PyMem_Malloc(alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006021 else
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006022 marks = (Py_ssize_t *) PyMem_Realloc(self->marks,
6023 alloc * sizeof(Py_ssize_t));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006024 if (marks == NULL) {
6025 PyErr_NoMemory();
6026 return -1;
6027 }
6028 self->marks = marks;
6029 self->marks_size = (Py_ssize_t)alloc;
6030 }
6031
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006032 self->marks[self->num_marks++] = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006033
6034 return 0;
6035}
6036
6037static int
6038load_reduce(UnpicklerObject *self)
6039{
6040 PyObject *callable = NULL;
6041 PyObject *argtup = NULL;
6042 PyObject *obj = NULL;
6043
6044 PDATA_POP(self->stack, argtup);
6045 if (argtup == NULL)
6046 return -1;
6047 PDATA_POP(self->stack, callable);
6048 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006049 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006050 Py_DECREF(callable);
6051 }
6052 Py_DECREF(argtup);
6053
6054 if (obj == NULL)
6055 return -1;
6056
6057 PDATA_PUSH(self->stack, obj, -1);
6058 return 0;
6059}
6060
6061/* Just raises an error if we don't know the protocol specified. PROTO
6062 * is the first opcode for protocols >= 2.
6063 */
6064static int
6065load_proto(UnpicklerObject *self)
6066{
6067 char *s;
6068 int i;
6069
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006070 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006071 return -1;
6072
6073 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006074 if (i <= HIGHEST_PROTOCOL) {
6075 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006076 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006077 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006078
6079 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6080 return -1;
6081}
6082
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006083static int
6084load_frame(UnpicklerObject *self)
6085{
6086 char *s;
6087 Py_ssize_t frame_len;
6088
6089 if (_Unpickler_Read(self, &s, 8) < 0)
6090 return -1;
6091
6092 frame_len = calc_binsize(s, 8);
6093 if (frame_len < 0) {
6094 PyErr_Format(PyExc_OverflowError,
6095 "FRAME length exceeds system's maximum of %zd bytes",
6096 PY_SSIZE_T_MAX);
6097 return -1;
6098 }
6099
6100 if (_Unpickler_Read(self, &s, frame_len) < 0)
6101 return -1;
6102
6103 /* Rewind to start of frame */
6104 self->next_read_idx -= frame_len;
6105 return 0;
6106}
6107
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006108static PyObject *
6109load(UnpicklerObject *self)
6110{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006111 PyObject *value = NULL;
6112 char *s;
6113
6114 self->num_marks = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006115 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006116 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006117 Pdata_clear(self->stack, 0);
6118
6119 /* Convenient macros for the dispatch while-switch loop just below. */
6120#define OP(opcode, load_func) \
6121 case opcode: if (load_func(self) < 0) break; continue;
6122
6123#define OP_ARG(opcode, load_func, arg) \
6124 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6125
6126 while (1) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006127 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006128 break;
6129
6130 switch ((enum opcode)s[0]) {
6131 OP(NONE, load_none)
6132 OP(BININT, load_binint)
6133 OP(BININT1, load_binint1)
6134 OP(BININT2, load_binint2)
6135 OP(INT, load_int)
6136 OP(LONG, load_long)
6137 OP_ARG(LONG1, load_counted_long, 1)
6138 OP_ARG(LONG4, load_counted_long, 4)
6139 OP(FLOAT, load_float)
6140 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006141 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6142 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6143 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
6144 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6145 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006146 OP(STRING, load_string)
6147 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006148 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6149 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6150 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006151 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6152 OP_ARG(TUPLE1, load_counted_tuple, 1)
6153 OP_ARG(TUPLE2, load_counted_tuple, 2)
6154 OP_ARG(TUPLE3, load_counted_tuple, 3)
6155 OP(TUPLE, load_tuple)
6156 OP(EMPTY_LIST, load_empty_list)
6157 OP(LIST, load_list)
6158 OP(EMPTY_DICT, load_empty_dict)
6159 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006160 OP(EMPTY_SET, load_empty_set)
6161 OP(ADDITEMS, load_additems)
6162 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006163 OP(OBJ, load_obj)
6164 OP(INST, load_inst)
6165 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006166 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006167 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006168 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006169 OP(APPEND, load_append)
6170 OP(APPENDS, load_appends)
6171 OP(BUILD, load_build)
6172 OP(DUP, load_dup)
6173 OP(BINGET, load_binget)
6174 OP(LONG_BINGET, load_long_binget)
6175 OP(GET, load_get)
6176 OP(MARK, load_mark)
6177 OP(BINPUT, load_binput)
6178 OP(LONG_BINPUT, load_long_binput)
6179 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006180 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006181 OP(POP, load_pop)
6182 OP(POP_MARK, load_pop_mark)
6183 OP(SETITEM, load_setitem)
6184 OP(SETITEMS, load_setitems)
6185 OP(PERSID, load_persid)
6186 OP(BINPERSID, load_binpersid)
6187 OP(REDUCE, load_reduce)
6188 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006189 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006190 OP_ARG(EXT1, load_extension, 1)
6191 OP_ARG(EXT2, load_extension, 2)
6192 OP_ARG(EXT4, load_extension, 4)
6193 OP_ARG(NEWTRUE, load_bool, Py_True)
6194 OP_ARG(NEWFALSE, load_bool, Py_False)
6195
6196 case STOP:
6197 break;
6198
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006199 default:
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006200 if (s[0] == '\0') {
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006201 PyErr_SetNone(PyExc_EOFError);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006202 }
6203 else {
6204 PickleState *st = _Pickle_GetGlobalState();
6205 PyErr_Format(st->UnpicklingError,
Benjamin Petersonadde86d2011-09-23 13:41:41 -04006206 "invalid load key, '%c'.", s[0]);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006207 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006208 return NULL;
6209 }
6210
6211 break; /* and we are done! */
6212 }
6213
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006214 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006215 return NULL;
6216 }
6217
Victor Stinner2ae57e32013-10-31 13:39:23 +01006218 if (_Unpickler_SkipConsumed(self) < 0)
6219 return NULL;
6220
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006221 PDATA_POP(self->stack, value);
6222 return value;
6223}
6224
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006225/*[clinic]
6226
6227_pickle.Unpickler.load
6228
6229Load a pickle.
6230
6231Read a pickled object representation from the open file object given in
6232the constructor, and return the reconstituted object hierarchy specified
6233therein.
6234[clinic]*/
6235
6236PyDoc_STRVAR(_pickle_Unpickler_load__doc__,
6237"load()\n"
6238"Load a pickle.\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006239"\n"
6240"Read a pickled object representation from the open file object given in\n"
6241"the constructor, and return the reconstituted object hierarchy specified\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006242"therein.");
6243
6244#define _PICKLE_UNPICKLER_LOAD_METHODDEF \
6245 {"load", (PyCFunction)_pickle_Unpickler_load, METH_NOARGS, _pickle_Unpickler_load__doc__},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006246
6247static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006248_pickle_Unpickler_load(PyObject *self)
6249/*[clinic checksum: 9a30ba4e4d9221d4dcd705e1471ab11b2c9e3ac6]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006250{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006251 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006252
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006253 /* Check whether the Unpickler was initialized correctly. This prevents
6254 segfaulting if a subclass overridden __init__ with a function that does
6255 not call Unpickler.__init__(). Here, we simply ensure that self->read
6256 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006257 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006258 PickleState *st = _Pickle_GetGlobalState();
6259 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006260 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006261 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006262 return NULL;
6263 }
6264
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006265 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006266}
6267
6268/* The name of find_class() is misleading. In newer pickle protocols, this
6269 function is used for loading any global (i.e., functions), not just
6270 classes. The name is kept only for backward compatibility. */
6271
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006272/*[clinic]
6273
6274_pickle.Unpickler.find_class
6275
6276 self: UnpicklerObject
6277 module_name: object
6278 global_name: object
6279 /
6280
6281Return an object from a specified module.
6282
6283If necessary, the module will be imported. Subclasses may override this
6284method (e.g. to restrict unpickling of arbitrary classes and functions).
6285
6286This method is called whenever a class or a function object is
6287needed. Both arguments passed are str objects.
6288[clinic]*/
6289
6290PyDoc_STRVAR(_pickle_Unpickler_find_class__doc__,
6291"find_class(module_name, global_name)\n"
6292"Return an object from a specified module.\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006293"\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006294"If necessary, the module will be imported. Subclasses may override this\n"
6295"method (e.g. to restrict unpickling of arbitrary classes and functions).\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006296"\n"
6297"This method is called whenever a class or a function object is\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006298"needed. Both arguments passed are str objects.");
6299
6300#define _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF \
6301 {"find_class", (PyCFunction)_pickle_Unpickler_find_class, METH_VARARGS, _pickle_Unpickler_find_class__doc__},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006302
6303static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006304_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyObject *module_name, PyObject *global_name);
6305
6306static PyObject *
6307_pickle_Unpickler_find_class(PyObject *self, PyObject *args)
6308{
6309 PyObject *return_value = NULL;
6310 PyObject *module_name;
6311 PyObject *global_name;
6312
6313 if (!PyArg_ParseTuple(args,
6314 "OO:find_class",
6315 &module_name, &global_name))
6316 goto exit;
6317 return_value = _pickle_Unpickler_find_class_impl((UnpicklerObject *)self, module_name, global_name);
6318
6319exit:
6320 return return_value;
6321}
6322
6323static PyObject *
6324_pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
6325/*[clinic checksum: b7d05d4dd8adc698e5780c1ac2be0f5062d33915]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006326{
6327 PyObject *global;
6328 PyObject *modules_dict;
6329 PyObject *module;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006330 _Py_IDENTIFIER(modules);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006331
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006332 /* Try to map the old names used in Python 2.x to the new ones used in
6333 Python 3.x. We do this only with old pickle protocols and when the
6334 user has not disabled the feature. */
6335 if (self->proto < 3 && self->fix_imports) {
6336 PyObject *key;
6337 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006338 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006339
6340 /* Check if the global (i.e., a function or a class) was renamed
6341 or moved to another module. */
6342 key = PyTuple_Pack(2, module_name, global_name);
6343 if (key == NULL)
6344 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006345 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006346 Py_DECREF(key);
6347 if (item) {
6348 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
6349 PyErr_Format(PyExc_RuntimeError,
6350 "_compat_pickle.NAME_MAPPING values should be "
6351 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
6352 return NULL;
6353 }
6354 module_name = PyTuple_GET_ITEM(item, 0);
6355 global_name = PyTuple_GET_ITEM(item, 1);
6356 if (!PyUnicode_Check(module_name) ||
6357 !PyUnicode_Check(global_name)) {
6358 PyErr_Format(PyExc_RuntimeError,
6359 "_compat_pickle.NAME_MAPPING values should be "
6360 "pairs of str, not (%.200s, %.200s)",
6361 Py_TYPE(module_name)->tp_name,
6362 Py_TYPE(global_name)->tp_name);
6363 return NULL;
6364 }
6365 }
6366 else if (PyErr_Occurred()) {
6367 return NULL;
6368 }
6369
6370 /* Check if the module was renamed. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006371 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006372 if (item) {
6373 if (!PyUnicode_Check(item)) {
6374 PyErr_Format(PyExc_RuntimeError,
6375 "_compat_pickle.IMPORT_MAPPING values should be "
6376 "strings, not %.200s", Py_TYPE(item)->tp_name);
6377 return NULL;
6378 }
6379 module_name = item;
6380 }
6381 else if (PyErr_Occurred()) {
6382 return NULL;
6383 }
6384 }
6385
Victor Stinnerbb520202013-11-06 22:40:41 +01006386 modules_dict = _PySys_GetObjectId(&PyId_modules);
Victor Stinner1e53bba2013-07-16 22:26:05 +02006387 if (modules_dict == NULL) {
6388 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006389 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02006390 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006391
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006392 module = PyDict_GetItemWithError(modules_dict, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006393 if (module == NULL) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006394 if (PyErr_Occurred())
6395 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006396 module = PyImport_Import(module_name);
6397 if (module == NULL)
6398 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006399 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006400 Py_DECREF(module);
6401 }
Victor Stinner121aab42011-09-29 23:40:53 +02006402 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006403 global = getattribute(module, global_name, self->proto >= 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006404 }
6405 return global;
6406}
6407
6408static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006409 _PICKLE_UNPICKLER_LOAD_METHODDEF
6410 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006411 {NULL, NULL} /* sentinel */
6412};
6413
6414static void
6415Unpickler_dealloc(UnpicklerObject *self)
6416{
6417 PyObject_GC_UnTrack((PyObject *)self);
6418 Py_XDECREF(self->readline);
6419 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006420 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006421 Py_XDECREF(self->stack);
6422 Py_XDECREF(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006423 if (self->buffer.buf != NULL) {
6424 PyBuffer_Release(&self->buffer);
6425 self->buffer.buf = NULL;
6426 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006427
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006428 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006429 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006430 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006431 PyMem_Free(self->encoding);
6432 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006433
6434 Py_TYPE(self)->tp_free((PyObject *)self);
6435}
6436
6437static int
6438Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
6439{
6440 Py_VISIT(self->readline);
6441 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006442 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006443 Py_VISIT(self->stack);
6444 Py_VISIT(self->pers_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006445 return 0;
6446}
6447
6448static int
6449Unpickler_clear(UnpicklerObject *self)
6450{
6451 Py_CLEAR(self->readline);
6452 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00006453 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006454 Py_CLEAR(self->stack);
6455 Py_CLEAR(self->pers_func);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006456 if (self->buffer.buf != NULL) {
6457 PyBuffer_Release(&self->buffer);
6458 self->buffer.buf = NULL;
6459 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006460
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006461 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006462 PyMem_Free(self->marks);
6463 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006464 PyMem_Free(self->input_line);
6465 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006466 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006467 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02006468 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006469 self->errors = NULL;
6470
6471 return 0;
6472}
6473
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006474/*[clinic]
6475
6476_pickle.Unpickler.__init__
6477
6478 self: UnpicklerObject
6479 file: object
6480 *
6481 fix_imports: bool = True
6482 encoding: str = 'ASCII'
6483 errors: str = 'strict'
6484
6485This takes a binary file for reading a pickle data stream.
6486
6487The protocol version of the pickle is detected automatically, so no
6488proto argument is needed.
6489
6490The file-like object must have two methods, a read() method
6491that takes an integer argument, and a readline() method that
6492requires no arguments. Both methods should return bytes.
6493Thus file-like object can be a binary file object opened for
6494reading, a BytesIO object, or any other custom object that
6495meets this interface.
6496
6497Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
6498which are used to control compatiblity support for pickle stream
6499generated by Python 2.x. If *fix_imports* is True, pickle will try to
6500map the old Python 2.x names to the new names used in Python 3.x. The
6501*encoding* and *errors* tell pickle how to decode 8-bit string
6502instances pickled by Python 2.x; these default to 'ASCII' and
6503'strict', respectively.
6504
6505[clinic]*/
6506
6507PyDoc_STRVAR(_pickle_Unpickler___init____doc__,
6508"__init__(file, *, fix_imports=True, encoding=\'ASCII\', errors=\'strict\')\n"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006509"This takes a binary file for reading a pickle data stream.\n"
6510"\n"
6511"The protocol version of the pickle is detected automatically, so no\n"
6512"proto argument is needed.\n"
6513"\n"
6514"The file-like object must have two methods, a read() method\n"
6515"that takes an integer argument, and a readline() method that\n"
6516"requires no arguments. Both methods should return bytes.\n"
6517"Thus file-like object can be a binary file object opened for\n"
6518"reading, a BytesIO object, or any other custom object that\n"
6519"meets this interface.\n"
6520"\n"
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006521"Optional keyword arguments are *fix_imports*, *encoding* and *errors*,\n"
6522"which are used to control compatiblity support for pickle stream\n"
6523"generated by Python 2.x. If *fix_imports* is True, pickle will try to\n"
6524"map the old Python 2.x names to the new names used in Python 3.x. The\n"
6525"*encoding* and *errors* tell pickle how to decode 8-bit string\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006526"instances pickled by Python 2.x; these default to \'ASCII\' and\n"
6527"\'strict\', respectively.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006528
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006529#define _PICKLE_UNPICKLER___INIT___METHODDEF \
6530 {"__init__", (PyCFunction)_pickle_Unpickler___init__, METH_VARARGS|METH_KEYWORDS, _pickle_Unpickler___init____doc__},
6531
6532static PyObject *
6533_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, const char *errors);
6534
6535static PyObject *
6536_pickle_Unpickler___init__(PyObject *self, PyObject *args, PyObject *kwargs)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006537{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006538 PyObject *return_value = NULL;
6539 static char *_keywords[] = {"file", "fix_imports", "encoding", "errors", NULL};
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006540 PyObject *file;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006541 int fix_imports = 1;
6542 const char *encoding = "ASCII";
6543 const char *errors = "strict";
6544
6545 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
6546 "O|$pss:__init__", _keywords,
6547 &file, &fix_imports, &encoding, &errors))
6548 goto exit;
6549 return_value = _pickle_Unpickler___init___impl((UnpicklerObject *)self, file, fix_imports, encoding, errors);
6550
6551exit:
6552 return return_value;
6553}
6554
6555static PyObject *
6556_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, int fix_imports, const char *encoding, const char *errors)
6557/*[clinic checksum: bed0d8bbe1c647960ccc6f997b33bf33935fa56f]*/
6558{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006559 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006560
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006561 /* In case of multiple __init__() calls, clear previous content. */
6562 if (self->read != NULL)
6563 (void)Unpickler_clear(self);
6564
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006565 if (_Unpickler_SetInputStream(self, file) < 0)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006566 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006567
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006568 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006569 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006570
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006571 self->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006572 if (self->fix_imports == -1)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006573 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006574
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02006575 if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006576 self->pers_func = _PyObject_GetAttrId((PyObject *)self,
6577 &PyId_persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006578 if (self->pers_func == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006579 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006580 }
6581 else {
6582 self->pers_func = NULL;
6583 }
6584
6585 self->stack = (Pdata *)Pdata_New();
6586 if (self->stack == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006587 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006588
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006589 self->memo_size = 32;
6590 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006591 if (self->memo == NULL)
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006592 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006593
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006594 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00006595
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006596 Py_RETURN_NONE;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006597}
6598
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006599/* Wrap the Clinic generated signature to slot it in tp_init. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006600static int
6601Unpickler_init(PyObject *self, PyObject *args, PyObject *kwargs)
6602{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006603 PyObject *result = _pickle_Unpickler___init__(self, args, kwargs);
6604 if (result == NULL) {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006605 return -1;
6606 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006607 Py_DECREF(result);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006608 return 0;
6609}
6610
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006611/* Define a proxy object for the Unpickler's internal memo object. This is to
6612 * avoid breaking code like:
6613 * unpickler.memo.clear()
6614 * and
6615 * unpickler.memo = saved_memo
6616 * Is this a good idea? Not really, but we don't want to break code that uses
6617 * it. Note that we don't implement the entire mapping API here. This is
6618 * intentional, as these should be treated as black-box implementation details.
6619 *
6620 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02006621 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006622 */
6623
6624typedef struct {
6625 PyObject_HEAD
6626 UnpicklerObject *unpickler;
6627} UnpicklerMemoProxyObject;
6628
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006629/*[clinic]
6630_pickle.UnpicklerMemoProxy.clear
6631
6632 self: UnpicklerMemoProxyObject
6633
6634Remove all items from memo.
6635[clinic]*/
6636
6637PyDoc_STRVAR(_pickle_UnpicklerMemoProxy_clear__doc__,
6638"clear()\n"
6639"Remove all items from memo.");
6640
6641#define _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF \
6642 {"clear", (PyCFunction)_pickle_UnpicklerMemoProxy_clear, METH_NOARGS, _pickle_UnpicklerMemoProxy_clear__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006643
6644static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006645_pickle_UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6646/*[clinic checksum: 46fecf4e33c0c873124f845edf6cc3a2e9864bd5]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006647{
6648 _Unpickler_MemoCleanup(self->unpickler);
6649 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
6650 if (self->unpickler->memo == NULL)
6651 return NULL;
6652 Py_RETURN_NONE;
6653}
6654
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006655/*[clinic]
6656_pickle.UnpicklerMemoProxy.copy
6657
6658 self: UnpicklerMemoProxyObject
6659
6660Copy the memo to a new object.
6661[clinic]*/
6662
6663PyDoc_STRVAR(_pickle_UnpicklerMemoProxy_copy__doc__,
6664"copy()\n"
6665"Copy the memo to a new object.");
6666
6667#define _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF \
6668 {"copy", (PyCFunction)_pickle_UnpicklerMemoProxy_copy, METH_NOARGS, _pickle_UnpicklerMemoProxy_copy__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006669
6670static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006671_pickle_UnpicklerMemoProxy_copy(UnpicklerMemoProxyObject *self)
6672/*[clinic checksum: f8856c4e8a33540886dfbb245f286af3008fa0ad]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006673{
6674 Py_ssize_t i;
6675 PyObject *new_memo = PyDict_New();
6676 if (new_memo == NULL)
6677 return NULL;
6678
6679 for (i = 0; i < self->unpickler->memo_size; i++) {
6680 int status;
6681 PyObject *key, *value;
6682
6683 value = self->unpickler->memo[i];
6684 if (value == NULL)
6685 continue;
6686
6687 key = PyLong_FromSsize_t(i);
6688 if (key == NULL)
6689 goto error;
6690 status = PyDict_SetItem(new_memo, key, value);
6691 Py_DECREF(key);
6692 if (status < 0)
6693 goto error;
6694 }
6695 return new_memo;
6696
6697error:
6698 Py_DECREF(new_memo);
6699 return NULL;
6700}
6701
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006702/*[clinic]
6703_pickle.UnpicklerMemoProxy.__reduce__
6704
6705 self: UnpicklerMemoProxyObject
6706
6707Implement pickling support.
6708[clinic]*/
6709
6710PyDoc_STRVAR(_pickle_UnpicklerMemoProxy___reduce____doc__,
6711"__reduce__()\n"
6712"Implement pickling support.");
6713
6714#define _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF \
6715 {"__reduce__", (PyCFunction)_pickle_UnpicklerMemoProxy___reduce__, METH_NOARGS, _pickle_UnpicklerMemoProxy___reduce____doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006716
6717static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006718_pickle_UnpicklerMemoProxy___reduce__(UnpicklerMemoProxyObject *self)
6719/*[clinic checksum: ab5516a77659144e1191c7dd70a0c6c7455660bc]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006720{
6721 PyObject *reduce_value;
6722 PyObject *constructor_args;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006723 PyObject *contents = _pickle_UnpicklerMemoProxy_copy(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006724 if (contents == NULL)
6725 return NULL;
6726
6727 reduce_value = PyTuple_New(2);
6728 if (reduce_value == NULL) {
6729 Py_DECREF(contents);
6730 return NULL;
6731 }
6732 constructor_args = PyTuple_New(1);
6733 if (constructor_args == NULL) {
6734 Py_DECREF(contents);
6735 Py_DECREF(reduce_value);
6736 return NULL;
6737 }
6738 PyTuple_SET_ITEM(constructor_args, 0, contents);
6739 Py_INCREF((PyObject *)&PyDict_Type);
6740 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
6741 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
6742 return reduce_value;
6743}
6744
6745static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006746 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
6747 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
6748 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006749 {NULL, NULL} /* sentinel */
6750};
6751
6752static void
6753UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
6754{
6755 PyObject_GC_UnTrack(self);
6756 Py_XDECREF(self->unpickler);
6757 PyObject_GC_Del((PyObject *)self);
6758}
6759
6760static int
6761UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
6762 visitproc visit, void *arg)
6763{
6764 Py_VISIT(self->unpickler);
6765 return 0;
6766}
6767
6768static int
6769UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
6770{
6771 Py_CLEAR(self->unpickler);
6772 return 0;
6773}
6774
6775static PyTypeObject UnpicklerMemoProxyType = {
6776 PyVarObject_HEAD_INIT(NULL, 0)
6777 "_pickle.UnpicklerMemoProxy", /*tp_name*/
6778 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
6779 0,
6780 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
6781 0, /* tp_print */
6782 0, /* tp_getattr */
6783 0, /* tp_setattr */
6784 0, /* tp_compare */
6785 0, /* tp_repr */
6786 0, /* tp_as_number */
6787 0, /* tp_as_sequence */
6788 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00006789 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006790 0, /* tp_call */
6791 0, /* tp_str */
6792 PyObject_GenericGetAttr, /* tp_getattro */
6793 PyObject_GenericSetAttr, /* tp_setattro */
6794 0, /* tp_as_buffer */
6795 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6796 0, /* tp_doc */
6797 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
6798 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
6799 0, /* tp_richcompare */
6800 0, /* tp_weaklistoffset */
6801 0, /* tp_iter */
6802 0, /* tp_iternext */
6803 unpicklerproxy_methods, /* tp_methods */
6804};
6805
6806static PyObject *
6807UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
6808{
6809 UnpicklerMemoProxyObject *self;
6810
6811 self = PyObject_GC_New(UnpicklerMemoProxyObject,
6812 &UnpicklerMemoProxyType);
6813 if (self == NULL)
6814 return NULL;
6815 Py_INCREF(unpickler);
6816 self->unpickler = unpickler;
6817 PyObject_GC_Track(self);
6818 return (PyObject *)self;
6819}
6820
6821/*****************************************************************************/
6822
6823
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006824static PyObject *
6825Unpickler_get_memo(UnpicklerObject *self)
6826{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006827 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006828}
6829
6830static int
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006831Unpickler_set_memo(UnpicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006832{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006833 PyObject **new_memo;
6834 Py_ssize_t new_memo_size = 0;
6835 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006836
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006837 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006838 PyErr_SetString(PyExc_TypeError,
6839 "attribute deletion is not supported");
6840 return -1;
6841 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006842
6843 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
6844 UnpicklerObject *unpickler =
6845 ((UnpicklerMemoProxyObject *)obj)->unpickler;
6846
6847 new_memo_size = unpickler->memo_size;
6848 new_memo = _Unpickler_NewMemo(new_memo_size);
6849 if (new_memo == NULL)
6850 return -1;
6851
6852 for (i = 0; i < new_memo_size; i++) {
6853 Py_XINCREF(unpickler->memo[i]);
6854 new_memo[i] = unpickler->memo[i];
6855 }
6856 }
6857 else if (PyDict_Check(obj)) {
6858 Py_ssize_t i = 0;
6859 PyObject *key, *value;
6860
6861 new_memo_size = PyDict_Size(obj);
6862 new_memo = _Unpickler_NewMemo(new_memo_size);
6863 if (new_memo == NULL)
6864 return -1;
6865
6866 while (PyDict_Next(obj, &i, &key, &value)) {
6867 Py_ssize_t idx;
6868 if (!PyLong_Check(key)) {
6869 PyErr_SetString(PyExc_TypeError,
6870 "memo key must be integers");
6871 goto error;
6872 }
6873 idx = PyLong_AsSsize_t(key);
6874 if (idx == -1 && PyErr_Occurred())
6875 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02006876 if (idx < 0) {
6877 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02006878 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02006879 goto error;
6880 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006881 if (_Unpickler_MemoPut(self, idx, value) < 0)
6882 goto error;
6883 }
6884 }
6885 else {
6886 PyErr_Format(PyExc_TypeError,
6887 "'memo' attribute must be an UnpicklerMemoProxy object"
6888 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006889 return -1;
6890 }
6891
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006892 _Unpickler_MemoCleanup(self);
6893 self->memo_size = new_memo_size;
6894 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006895
6896 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006897
6898 error:
6899 if (new_memo_size) {
6900 i = new_memo_size;
6901 while (--i >= 0) {
6902 Py_XDECREF(new_memo[i]);
6903 }
6904 PyMem_FREE(new_memo);
6905 }
6906 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006907}
6908
6909static PyObject *
6910Unpickler_get_persload(UnpicklerObject *self)
6911{
6912 if (self->pers_func == NULL)
6913 PyErr_SetString(PyExc_AttributeError, "persistent_load");
6914 else
6915 Py_INCREF(self->pers_func);
6916 return self->pers_func;
6917}
6918
6919static int
6920Unpickler_set_persload(UnpicklerObject *self, PyObject *value)
6921{
6922 PyObject *tmp;
6923
6924 if (value == NULL) {
6925 PyErr_SetString(PyExc_TypeError,
6926 "attribute deletion is not supported");
6927 return -1;
6928 }
6929 if (!PyCallable_Check(value)) {
6930 PyErr_SetString(PyExc_TypeError,
6931 "persistent_load must be a callable taking "
6932 "one argument");
6933 return -1;
6934 }
6935
6936 tmp = self->pers_func;
6937 Py_INCREF(value);
6938 self->pers_func = value;
6939 Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */
6940
6941 return 0;
6942}
6943
6944static PyGetSetDef Unpickler_getsets[] = {
6945 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
6946 {"persistent_load", (getter)Unpickler_get_persload,
6947 (setter)Unpickler_set_persload},
6948 {NULL}
6949};
6950
6951static PyTypeObject Unpickler_Type = {
6952 PyVarObject_HEAD_INIT(NULL, 0)
6953 "_pickle.Unpickler", /*tp_name*/
6954 sizeof(UnpicklerObject), /*tp_basicsize*/
6955 0, /*tp_itemsize*/
6956 (destructor)Unpickler_dealloc, /*tp_dealloc*/
6957 0, /*tp_print*/
6958 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006959 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00006960 0, /*tp_reserved*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006961 0, /*tp_repr*/
6962 0, /*tp_as_number*/
6963 0, /*tp_as_sequence*/
6964 0, /*tp_as_mapping*/
6965 0, /*tp_hash*/
6966 0, /*tp_call*/
6967 0, /*tp_str*/
6968 0, /*tp_getattro*/
6969 0, /*tp_setattro*/
6970 0, /*tp_as_buffer*/
6971 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006972 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006973 (traverseproc)Unpickler_traverse, /*tp_traverse*/
6974 (inquiry)Unpickler_clear, /*tp_clear*/
6975 0, /*tp_richcompare*/
6976 0, /*tp_weaklistoffset*/
6977 0, /*tp_iter*/
6978 0, /*tp_iternext*/
6979 Unpickler_methods, /*tp_methods*/
6980 0, /*tp_members*/
6981 Unpickler_getsets, /*tp_getset*/
6982 0, /*tp_base*/
6983 0, /*tp_dict*/
6984 0, /*tp_descr_get*/
6985 0, /*tp_descr_set*/
6986 0, /*tp_dictoffset*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006987 Unpickler_init, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006988 PyType_GenericAlloc, /*tp_alloc*/
6989 PyType_GenericNew, /*tp_new*/
6990 PyObject_GC_Del, /*tp_free*/
6991 0, /*tp_is_gc*/
6992};
6993
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006994/*[clinic]
6995
6996_pickle.dump
6997
6998 obj: object
6999 file: object
7000 protocol: object = NULL
7001 *
7002 fix_imports: bool = True
7003
7004Write a pickled representation of obj to the open file object file.
7005
7006This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may be more
7007efficient.
7008
7009The optional protocol argument tells the pickler to use the given protocol
7010supported protocols are 0, 1, 2, 3. The default protocol is 3; a
7011backward-incompatible protocol designed for Python 3.0.
7012
7013Specifying a negative protocol version selects the highest protocol version
7014supported. The higher the protocol used, the more recent the version of
7015Python needed to read the pickle produced.
7016
7017The file argument must have a write() method that accepts a single bytes
7018argument. It can thus be a file object opened for binary writing, a
7019io.BytesIO instance, or any other custom object that meets this interface.
7020
7021If fix_imports is True and protocol is less than 3, pickle will try to
7022map the new Python 3.x names to the old module names used in Python 2.x,
7023so that the pickle data stream is readable with Python 2.x.
7024[clinic]*/
7025
7026PyDoc_STRVAR(_pickle_dump__doc__,
7027"dump(obj, file, protocol=None, *, fix_imports=True)\n"
7028"Write a pickled representation of obj to the open file object file.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007029"\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007030"This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may be more\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007031"efficient.\n"
7032"\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007033"The optional protocol argument tells the pickler to use the given protocol\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007034"supported protocols are 0, 1, 2, 3. The default protocol is 3; a\n"
7035"backward-incompatible protocol designed for Python 3.0.\n"
7036"\n"
7037"Specifying a negative protocol version selects the highest protocol version\n"
7038"supported. The higher the protocol used, the more recent the version of\n"
7039"Python needed to read the pickle produced.\n"
7040"\n"
7041"The file argument must have a write() method that accepts a single bytes\n"
7042"argument. It can thus be a file object opened for binary writing, a\n"
7043"io.BytesIO instance, or any other custom object that meets this interface.\n"
7044"\n"
7045"If fix_imports is True and protocol is less than 3, pickle will try to\n"
7046"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 -08007047"so that the pickle data stream is readable with Python 2.x.");
7048
7049#define _PICKLE_DUMP_METHODDEF \
7050 {"dump", (PyCFunction)_pickle_dump, METH_VARARGS|METH_KEYWORDS, _pickle_dump__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007051
7052static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007053_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports);
7054
7055static PyObject *
7056_pickle_dump(PyModuleDef *module, PyObject *args, PyObject *kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007057{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007058 PyObject *return_value = NULL;
7059 static char *_keywords[] = {"obj", "file", "protocol", "fix_imports", NULL};
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007060 PyObject *obj;
7061 PyObject *file;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007062 PyObject *protocol = NULL;
7063 int fix_imports = 1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007064
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007065 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
7066 "OO|O$p:dump", _keywords,
7067 &obj, &file, &protocol, &fix_imports))
7068 goto exit;
7069 return_value = _pickle_dump_impl(module, obj, file, protocol, fix_imports);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007070
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007071exit:
7072 return return_value;
7073}
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007074
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007075static PyObject *
7076_pickle_dump_impl(PyModuleDef *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports)
7077/*[clinic checksum: e442721b16052d921b5e3fbd146d0a62e94a459e]*/
7078{
7079 PicklerObject *pickler = _Pickler_New();
7080
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007081 if (pickler == NULL)
7082 return NULL;
7083
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007084 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007085 goto error;
7086
7087 if (_Pickler_SetOutputStream(pickler, file) < 0)
7088 goto error;
7089
7090 if (dump(pickler, obj) < 0)
7091 goto error;
7092
7093 if (_Pickler_FlushToFile(pickler) < 0)
7094 goto error;
7095
7096 Py_DECREF(pickler);
7097 Py_RETURN_NONE;
7098
7099 error:
7100 Py_XDECREF(pickler);
7101 return NULL;
7102}
7103
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007104/*[clinic]
7105
7106_pickle.dumps
7107
7108 obj: object
7109 protocol: object = NULL
7110 *
7111 fix_imports: bool = True
7112
7113Return the pickled representation of the object as a bytes object.
7114
7115The optional protocol argument tells the pickler to use the given protocol;
7116supported protocols are 0, 1, 2, 3. The default protocol is 3; a
7117backward-incompatible protocol designed for Python 3.0.
7118
7119Specifying a negative protocol version selects the highest protocol version
7120supported. The higher the protocol used, the more recent the version of
7121Python needed to read the pickle produced.
7122
7123If fix_imports is True and *protocol* is less than 3, pickle will try to
7124map the new Python 3.x names to the old module names used in Python 2.x,
7125so that the pickle data stream is readable with Python 2.x.
7126[clinic]*/
7127
7128PyDoc_STRVAR(_pickle_dumps__doc__,
7129"dumps(obj, protocol=None, *, fix_imports=True)\n"
7130"Return the pickled representation of the object as a bytes object.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007131"\n"
7132"The optional protocol argument tells the pickler to use the given protocol;\n"
7133"supported protocols are 0, 1, 2, 3. The default protocol is 3; a\n"
7134"backward-incompatible protocol designed for Python 3.0.\n"
7135"\n"
7136"Specifying a negative protocol version selects the highest protocol version\n"
7137"supported. The higher the protocol used, the more recent the version of\n"
7138"Python needed to read the pickle produced.\n"
7139"\n"
7140"If fix_imports is True and *protocol* is less than 3, pickle will try to\n"
7141"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 -08007142"so that the pickle data stream is readable with Python 2.x.");
7143
7144#define _PICKLE_DUMPS_METHODDEF \
7145 {"dumps", (PyCFunction)_pickle_dumps, METH_VARARGS|METH_KEYWORDS, _pickle_dumps__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007146
7147static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007148_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol, int fix_imports);
7149
7150static PyObject *
7151_pickle_dumps(PyModuleDef *module, PyObject *args, PyObject *kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007152{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007153 PyObject *return_value = NULL;
7154 static char *_keywords[] = {"obj", "protocol", "fix_imports", NULL};
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007155 PyObject *obj;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007156 PyObject *protocol = NULL;
7157 int fix_imports = 1;
7158
7159 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
7160 "O|O$p:dumps", _keywords,
7161 &obj, &protocol, &fix_imports))
7162 goto exit;
7163 return_value = _pickle_dumps_impl(module, obj, protocol, fix_imports);
7164
7165exit:
7166 return return_value;
7167}
7168
7169static PyObject *
7170_pickle_dumps_impl(PyModuleDef *module, PyObject *obj, PyObject *protocol, int fix_imports)
7171/*[clinic checksum: df6262c4c487f537f47aec8a1709318204c1e174]*/
7172{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007173 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007174 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007175
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007176 if (pickler == NULL)
7177 return NULL;
7178
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007179 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007180 goto error;
7181
7182 if (dump(pickler, obj) < 0)
7183 goto error;
7184
7185 result = _Pickler_GetString(pickler);
7186 Py_DECREF(pickler);
7187 return result;
7188
7189 error:
7190 Py_XDECREF(pickler);
7191 return NULL;
7192}
7193
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007194/*[clinic]
7195
7196_pickle.load
7197
7198 file: object
7199 *
7200 fix_imports: bool = True
7201 encoding: str = 'ASCII'
7202 errors: str = 'strict'
7203
7204Return a reconstituted object from the pickle data stored in a file.
7205
7206This is equivalent to ``Unpickler(file).load()``, but may be more efficient.
7207
7208The protocol version of the pickle is detected automatically, so no protocol
7209argument is needed. Bytes past the pickled object's representation are
7210ignored.
7211
7212The argument file must have two methods, a read() method that takes an
7213integer argument, and a readline() method that requires no arguments. Both
7214methods should return bytes. Thus *file* can be a binary file object opened
7215for reading, a BytesIO object, or any other custom object that meets this
7216interface.
7217
7218Optional keyword arguments are fix_imports, encoding and errors,
7219which are used to control compatiblity support for pickle stream generated
7220by Python 2.x. If fix_imports is True, pickle will try to map the old
7221Python 2.x names to the new names used in Python 3.x. The encoding and
7222errors tell pickle how to decode 8-bit string instances pickled by Python
72232.x; these default to 'ASCII' and 'strict', respectively.
7224[clinic]*/
7225
7226PyDoc_STRVAR(_pickle_load__doc__,
7227"load(file, *, fix_imports=True, encoding=\'ASCII\', errors=\'strict\')\n"
7228"Return a reconstituted object from the pickle data stored in a file.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007229"\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007230"This is equivalent to ``Unpickler(file).load()``, but may be more efficient.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007231"\n"
7232"The protocol version of the pickle is detected automatically, so no protocol\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007233"argument is needed. Bytes past the pickled object\'s representation are\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007234"ignored.\n"
7235"\n"
7236"The argument file must have two methods, a read() method that takes an\n"
7237"integer argument, and a readline() method that requires no arguments. Both\n"
7238"methods should return bytes. Thus *file* can be a binary file object opened\n"
7239"for reading, a BytesIO object, or any other custom object that meets this\n"
7240"interface.\n"
7241"\n"
7242"Optional keyword arguments are fix_imports, encoding and errors,\n"
7243"which are used to control compatiblity support for pickle stream generated\n"
7244"by Python 2.x. If fix_imports is True, pickle will try to map the old\n"
7245"Python 2.x names to the new names used in Python 3.x. The encoding and\n"
7246"errors tell pickle how to decode 8-bit string instances pickled by Python\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007247"2.x; these default to \'ASCII\' and \'strict\', respectively.");
7248
7249#define _PICKLE_LOAD_METHODDEF \
7250 {"load", (PyCFunction)_pickle_load, METH_VARARGS|METH_KEYWORDS, _pickle_load__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007251
7252static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007253_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports, const char *encoding, const char *errors);
7254
7255static PyObject *
7256_pickle_load(PyModuleDef *module, PyObject *args, PyObject *kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007257{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007258 PyObject *return_value = NULL;
7259 static char *_keywords[] = {"file", "fix_imports", "encoding", "errors", NULL};
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007260 PyObject *file;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007261 int fix_imports = 1;
7262 const char *encoding = "ASCII";
7263 const char *errors = "strict";
7264
7265 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
7266 "O|$pss:load", _keywords,
7267 &file, &fix_imports, &encoding, &errors))
7268 goto exit;
7269 return_value = _pickle_load_impl(module, file, fix_imports, encoding, errors);
7270
7271exit:
7272 return return_value;
7273}
7274
7275static PyObject *
7276_pickle_load_impl(PyModuleDef *module, PyObject *file, int fix_imports, const char *encoding, const char *errors)
7277/*[clinic checksum: e10796f6765b22ce48dca6940f11b3933853ca35]*/
7278{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007279 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007280 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007281
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007282 if (unpickler == NULL)
7283 return NULL;
7284
7285 if (_Unpickler_SetInputStream(unpickler, file) < 0)
7286 goto error;
7287
7288 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7289 goto error;
7290
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007291 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007292
7293 result = load(unpickler);
7294 Py_DECREF(unpickler);
7295 return result;
7296
7297 error:
7298 Py_XDECREF(unpickler);
7299 return NULL;
7300}
7301
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007302/*[clinic]
7303
7304_pickle.loads
7305
7306 data: object
7307 *
7308 fix_imports: bool = True
7309 encoding: str = 'ASCII'
7310 errors: str = 'strict'
7311
7312Return a reconstituted object from the given pickle data.
7313
7314The protocol version of the pickle is detected automatically, so no protocol
7315argument is needed. Bytes past the pickled object's representation are
7316ignored.
7317
7318Optional keyword arguments are fix_imports, encoding and errors, which
7319are used to control compatiblity support for pickle stream generated
7320by Python 2.x. If fix_imports is True, pickle will try to map the old
7321Python 2.x names to the new names used in Python 3.x. The encoding and
7322errors tell pickle how to decode 8-bit string instances pickled by Python
73232.x; these default to 'ASCII' and 'strict', respectively.
7324[clinic]*/
7325
7326PyDoc_STRVAR(_pickle_loads__doc__,
7327"loads(data, *, fix_imports=True, encoding=\'ASCII\', errors=\'strict\')\n"
7328"Return a reconstituted object from the given pickle data.\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007329"\n"
7330"The protocol version of the pickle is detected automatically, so no protocol\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007331"argument is needed. Bytes past the pickled object\'s representation are\n"
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007332"ignored.\n"
7333"\n"
7334"Optional keyword arguments are fix_imports, encoding and errors, which\n"
7335"are used to control compatiblity support for pickle stream generated\n"
7336"by Python 2.x. If fix_imports is True, pickle will try to map the old\n"
7337"Python 2.x names to the new names used in Python 3.x. The encoding and\n"
7338"errors tell pickle how to decode 8-bit string instances pickled by Python\n"
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007339"2.x; these default to \'ASCII\' and \'strict\', respectively.");
7340
7341#define _PICKLE_LOADS_METHODDEF \
7342 {"loads", (PyCFunction)_pickle_loads, METH_VARARGS|METH_KEYWORDS, _pickle_loads__doc__},
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007343
7344static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007345_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports, const char *encoding, const char *errors);
7346
7347static PyObject *
7348_pickle_loads(PyModuleDef *module, PyObject *args, PyObject *kwargs)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007349{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007350 PyObject *return_value = NULL;
7351 static char *_keywords[] = {"data", "fix_imports", "encoding", "errors", NULL};
7352 PyObject *data;
7353 int fix_imports = 1;
7354 const char *encoding = "ASCII";
7355 const char *errors = "strict";
7356
7357 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
7358 "O|$pss:loads", _keywords,
7359 &data, &fix_imports, &encoding, &errors))
7360 goto exit;
7361 return_value = _pickle_loads_impl(module, data, fix_imports, encoding, errors);
7362
7363exit:
7364 return return_value;
7365}
7366
7367static PyObject *
7368_pickle_loads_impl(PyModuleDef *module, PyObject *data, int fix_imports, const char *encoding, const char *errors)
7369/*[clinic checksum: 29ee725efcbf51a3533c19cb8261a8e267b7080a]*/
7370{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007371 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007372 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007373
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007374 if (unpickler == NULL)
7375 return NULL;
7376
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007377 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007378 goto error;
7379
7380 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7381 goto error;
7382
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007383 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007384
7385 result = load(unpickler);
7386 Py_DECREF(unpickler);
7387 return result;
7388
7389 error:
7390 Py_XDECREF(unpickler);
7391 return NULL;
7392}
7393
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007394static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007395 _PICKLE_DUMP_METHODDEF
7396 _PICKLE_DUMPS_METHODDEF
7397 _PICKLE_LOAD_METHODDEF
7398 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007399 {NULL, NULL} /* sentinel */
7400};
7401
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007402static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007403pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007404{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007405 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007406 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007407}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007408
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007409static int
7410pickle_traverse(PyObject *m, visitproc visit, void *arg)
7411{
7412 PickleState *st = _Pickle_GetState(m);
7413 Py_VISIT(st->PickleError);
7414 Py_VISIT(st->PicklingError);
7415 Py_VISIT(st->UnpicklingError);
7416 Py_VISIT(st->dispatch_table);
7417 Py_VISIT(st->extension_registry);
7418 Py_VISIT(st->extension_cache);
7419 Py_VISIT(st->inverted_registry);
7420 Py_VISIT(st->name_mapping_2to3);
7421 Py_VISIT(st->import_mapping_2to3);
7422 Py_VISIT(st->name_mapping_3to2);
7423 Py_VISIT(st->import_mapping_3to2);
7424 Py_VISIT(st->codecs_encode);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007425 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007426}
7427
7428static struct PyModuleDef _picklemodule = {
7429 PyModuleDef_HEAD_INIT,
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007430 "_pickle", /* m_name */
7431 pickle_module_doc, /* m_doc */
7432 sizeof(PickleState), /* m_size */
7433 pickle_methods, /* m_methods */
7434 NULL, /* m_reload */
7435 pickle_traverse, /* m_traverse */
7436 pickle_clear, /* m_clear */
7437 NULL /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007438};
7439
7440PyMODINIT_FUNC
7441PyInit__pickle(void)
7442{
7443 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007444 PickleState *st;
7445
7446 m = PyState_FindModule(&_picklemodule);
7447 if (m) {
7448 Py_INCREF(m);
7449 return m;
7450 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007451
7452 if (PyType_Ready(&Unpickler_Type) < 0)
7453 return NULL;
7454 if (PyType_Ready(&Pickler_Type) < 0)
7455 return NULL;
7456 if (PyType_Ready(&Pdata_Type) < 0)
7457 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007458 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7459 return NULL;
7460 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7461 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007462
7463 /* Create the module and add the functions. */
7464 m = PyModule_Create(&_picklemodule);
7465 if (m == NULL)
7466 return NULL;
7467
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007468 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007469 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7470 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007471 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007472 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7473 return NULL;
7474
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007475 st = _Pickle_GetState(m);
7476
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007477 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007478 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7479 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007480 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007481 st->PicklingError = \
7482 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7483 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007484 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007485 st->UnpicklingError = \
7486 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
7487 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007488 return NULL;
7489
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007490 Py_INCREF(st->PickleError);
7491 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007492 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007493 Py_INCREF(st->PicklingError);
7494 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007495 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007496 Py_INCREF(st->UnpicklingError);
7497 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007498 return NULL;
7499
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007500 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007501 return NULL;
7502
7503 return m;
7504}