3 #include "structmember.h"
5 PyDoc_STRVAR(cPickle_module_documentation
,
6 "C implementation and optimization of the Python pickle module.");
10 #define Py_eval_input eval_input
11 #endif /* Py_eval_input */
13 #define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
15 #define WRITE_BUF_SIZE 256
17 /* Bump this when new opcodes are added to the pickle protocol. */
18 #define HIGHEST_PROTOCOL 2
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
42 #define SHORT_BINSTRING 'U'
44 #define BINUNICODE 'X'
49 #define EMPTY_DICT '}'
54 #define LONG_BINGET 'j'
56 #define EMPTY_LIST ']'
60 #define LONG_BINPUT 'r'
63 #define EMPTY_TUPLE ')'
67 #define PROTO '\x80' /* identify pickle protocol */
68 #define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69 #define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70 #define EXT2 '\x83' /* ditto, but 2-byte index */
71 #define EXT4 '\x84' /* ditto, but 4-byte index */
72 #define TUPLE1 '\x85' /* build 1-tuple from stack top */
73 #define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74 #define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75 #define NEWTRUE '\x88' /* push True */
76 #define NEWFALSE '\x89' /* push False */
77 #define LONG1 '\x8a' /* push long from < 256 bytes */
78 #define LONG4 '\x8b' /* push really big long */
80 /* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
90 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
91 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
92 * break if this gets out of synch with pickle.py, but it's unclear that
93 * would help anything either.
95 #define BATCHSIZE 1000
97 static char MARKv
= MARK
;
99 static PyObject
*PickleError
;
100 static PyObject
*PicklingError
;
101 static PyObject
*UnpickleableError
;
102 static PyObject
*UnpicklingError
;
103 static PyObject
*BadPickleGet
;
105 /* As the name says, an empty tuple. */
106 static PyObject
*empty_tuple
;
108 /* copy_reg.dispatch_table, {type_object: pickling_function} */
109 static PyObject
*dispatch_table
;
111 /* For EXT[124] opcodes. */
112 /* copy_reg._extension_registry, {(module_name, function_name): code} */
113 static PyObject
*extension_registry
;
114 /* copy_reg._inverted_registry, {code: (module_name, function_name)} */
115 static PyObject
*inverted_registry
;
116 /* copy_reg._extension_cache, {code: object} */
117 static PyObject
*extension_cache
;
119 /* For looking up name pairs in copy_reg._extension_registry. */
120 static PyObject
*two_tuple
;
122 static PyObject
*__class___str
, *__getinitargs___str
, *__dict___str
,
123 *__getstate___str
, *__setstate___str
, *__name___str
, *__reduce___str
,
125 *write_str
, *append_str
,
126 *read_str
, *readline_str
, *__main___str
,
127 *copy_reg_str
, *dispatch_table_str
;
129 /*************************************************************************
130 Internal Data type for pickle data. */
134 int length
; /* number of initial slots in data currently used */
135 int size
; /* number of slots in data allocated */
140 Pdata_dealloc(Pdata
*self
)
145 for (i
= self
->length
, p
= self
->data
; --i
>= 0; p
++) {
153 static PyTypeObject PdataType
= {
154 PyObject_HEAD_INIT(NULL
) 0, "cPickle.Pdata", sizeof(Pdata
), 0,
155 (destructor
)Pdata_dealloc
,
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
159 #define Pdata_Check(O) ((O)->ob_type == &PdataType)
166 if (!(self
= PyObject_New(Pdata
, &PdataType
)))
170 self
->data
= malloc(self
->size
* sizeof(PyObject
*));
172 return (PyObject
*)self
;
174 return PyErr_NoMemory();
180 PyErr_SetString(UnpicklingError
, "unpickling stack underflow");
184 /* Retain only the initial clearto items. If clearto >= the current
185 * number of items, this is a (non-erroneous) NOP.
188 Pdata_clear(Pdata
*self
, int clearto
)
193 if (clearto
< 0) return stackUnderflow();
194 if (clearto
>= self
->length
) return 0;
196 for (i
= self
->length
, p
= self
->data
+ clearto
;
201 self
->length
= clearto
;
207 Pdata_grow(Pdata
*self
)
213 bigger
= self
->size
<< 1;
214 if (bigger
<= 0) /* was 0, or new value overflows */
216 if ((int)(size_t)bigger
!= bigger
)
218 nbytes
= (size_t)bigger
* sizeof(PyObject
*);
219 if (nbytes
/ sizeof(PyObject
*) != (size_t)bigger
)
221 tmp
= realloc(self
->data
, nbytes
);
233 /* D is a Pdata*. Pop the topmost element and store it into V, which
234 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
235 * is raised and V is set to NULL. D and V may be evaluated several times.
237 #define PDATA_POP(D, V) { \
239 (V) = (D)->data[--((D)->length)]; \
241 PyErr_SetString(UnpicklingError, "bad pickle data"); \
246 /* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
247 * D. If the Pdata stack can't be grown to hold the new value, both
248 * raise MemoryError and execute "return ER". The difference is in ownership
249 * of O after: _PUSH transfers ownership of O from the caller to the stack
250 * (no incref of O is done, and in case of error O is decrefed), while
251 * _APPEND pushes a new reference.
254 /* Push O on stack D, giving ownership of O to the stack. */
255 #define PDATA_PUSH(D, O, ER) { \
256 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
257 Pdata_grow((Pdata*)(D)) < 0) { \
261 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
264 /* Push O on stack D, pushing a new reference. */
265 #define PDATA_APPEND(D, O, ER) { \
266 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
267 Pdata_grow((Pdata*)(D)) < 0) \
270 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
275 Pdata_popTuple(Pdata
*self
, int start
)
280 l
= self
->length
-start
;
284 for (i
= start
, j
= 0 ; j
< l
; i
++, j
++)
285 PyTuple_SET_ITEM(r
, j
, self
->data
[i
]);
287 self
->length
= start
;
292 Pdata_popList(Pdata
*self
, int start
)
297 l
=self
->length
-start
;
298 if (!( r
=PyList_New(l
))) return NULL
;
299 for (i
=start
, j
=0 ; j
< l
; i
++, j
++)
300 PyList_SET_ITEM(r
, j
, self
->data
[i
]);
306 /*************************************************************************/
308 #define ARG_TUP(self, o) { \
309 if (self->arg || (self->arg=PyTuple_New(1))) { \
310 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
311 PyTuple_SET_ITEM(self->arg,0,o); \
318 #define FREE_ARG_TUP(self) { \
319 if (self->arg->ob_refcnt > 1) { \
320 Py_DECREF(self->arg); \
325 typedef struct Picklerobject
{
333 PyObject
*inst_pers_func
;
335 /* pickle protocol number, >= 0 */
338 /* bool, true if proto > 0 */
341 int fast
; /* Fast mode doesn't save in memo, don't use if circ ref */
343 int (*write_func
)(struct Picklerobject
*, const char *, Py_ssize_t
);
346 PyObject
*dispatch_table
;
347 int fast_container
; /* count nested container dumps */
351 #ifndef PY_CPICKLE_FAST_LIMIT
352 #define PY_CPICKLE_FAST_LIMIT 50
355 static PyTypeObject Picklertype
;
357 typedef struct Unpicklerobject
{
368 PyObject
*last_string
;
372 Py_ssize_t (*read_func
)(struct Unpicklerobject
*, char **, Py_ssize_t
);
373 Py_ssize_t (*readline_func
)(struct Unpicklerobject
*, char **);
376 PyObject
*find_class
;
379 static PyTypeObject Unpicklertype
;
381 /* Forward decls that need the above structs */
382 static int save(Picklerobject
*, PyObject
*, int);
383 static int put2(Picklerobject
*, PyObject
*);
387 cPickle_ErrFormat(PyObject
*ErrType
, char *stringformat
, char *format
, ...)
390 PyObject
*args
=0, *retval
=0;
391 va_start(va
, format
);
393 if (format
) args
= Py_VaBuildValue(format
, va
);
395 if (format
&& ! args
) return NULL
;
396 if (stringformat
&& !(retval
=PyString_FromString(stringformat
)))
402 v
=PyString_Format(retval
, args
);
405 if (! v
) return NULL
;
410 if (args
) retval
=args
;
412 PyErr_SetObject(ErrType
,Py_None
);
415 PyErr_SetObject(ErrType
,retval
);
421 write_file(Picklerobject
*self
, const char *s
, Py_ssize_t n
)
423 size_t nbyteswritten
;
430 /* String too large */
434 Py_BEGIN_ALLOW_THREADS
435 nbyteswritten
= fwrite(s
, sizeof(char), n
, self
->fp
);
437 if (nbyteswritten
!= (size_t)n
) {
438 PyErr_SetFromErrno(PyExc_IOError
);
446 write_cStringIO(Picklerobject
*self
, const char *s
, Py_ssize_t n
)
452 if (PycStringIO
->cwrite((PyObject
*)self
->file
, s
, n
) != n
) {
460 write_none(Picklerobject
*self
, const char *s
, Py_ssize_t n
)
462 if (s
== NULL
) return 0;
463 if (n
> INT_MAX
) return -1;
468 write_other(Picklerobject
*self
, const char *s
, Py_ssize_t _n
)
470 PyObject
*py_str
= 0, *junk
= 0;
477 if (!( self
->buf_size
)) return 0;
478 py_str
= PyString_FromStringAndSize(self
->write_buf
,
484 if (self
->buf_size
&& (n
+ self
->buf_size
) > WRITE_BUF_SIZE
) {
485 if (write_other(self
, NULL
, 0) < 0)
489 if (n
> WRITE_BUF_SIZE
) {
491 PyString_FromStringAndSize(s
, n
)))
495 memcpy(self
->write_buf
+ self
->buf_size
, s
, n
);
502 /* object with write method */
503 ARG_TUP(self
, py_str
);
505 junk
= PyObject_Call(self
->write
, self
->arg
, NULL
);
508 if (junk
) Py_DECREF(junk
);
512 PDATA_PUSH(self
->file
, py_str
, -1);
520 read_file(Unpicklerobject
*self
, char **s
, Py_ssize_t n
)
524 if (self
->buf_size
== 0) {
527 size
= ((n
< 32) ? 32 : n
);
528 if (!( self
->buf
= (char *)malloc(size
))) {
533 self
->buf_size
= size
;
535 else if (n
> self
->buf_size
) {
536 self
->buf
= (char *)realloc(self
->buf
, n
);
544 Py_BEGIN_ALLOW_THREADS
545 nbytesread
= fread(self
->buf
, sizeof(char), n
, self
->fp
);
547 if (nbytesread
!= (size_t)n
) {
548 if (feof(self
->fp
)) {
549 PyErr_SetNone(PyExc_EOFError
);
553 PyErr_SetFromErrno(PyExc_IOError
);
564 readline_file(Unpicklerobject
*self
, char **s
)
568 if (self
->buf_size
== 0) {
569 if (!( self
->buf
= (char *)malloc(40))) {
579 for (; i
< (self
->buf_size
- 1); i
++) {
580 if (feof(self
->fp
) ||
581 (self
->buf
[i
] = getc(self
->fp
)) == '\n') {
582 self
->buf
[i
+ 1] = '\0';
587 bigger
= self
->buf_size
<< 1;
588 if (bigger
<= 0) { /* overflow */
592 self
->buf
= (char *)realloc(self
->buf
, bigger
);
597 self
->buf_size
= bigger
;
603 read_cStringIO(Unpicklerobject
*self
, char **s
, Py_ssize_t n
)
607 if (PycStringIO
->cread((PyObject
*)self
->file
, &ptr
, n
) != n
) {
608 PyErr_SetNone(PyExc_EOFError
);
619 readline_cStringIO(Unpicklerobject
*self
, char **s
)
624 if ((n
= PycStringIO
->creadline((PyObject
*)self
->file
, &ptr
)) < 0) {
635 read_other(Unpicklerobject
*self
, char **s
, Py_ssize_t n
)
637 PyObject
*bytes
, *str
=0;
639 if (!( bytes
= PyInt_FromSsize_t(n
))) return -1;
641 ARG_TUP(self
, bytes
);
643 str
= PyObject_Call(self
->read
, self
->arg
, NULL
);
646 if (! str
) return -1;
648 Py_XDECREF(self
->last_string
);
649 self
->last_string
= str
;
651 if (! (*s
= PyString_AsString(str
))) return -1;
657 readline_other(Unpicklerobject
*self
, char **s
)
662 if (!( str
= PyObject_CallObject(self
->readline
, empty_tuple
))) {
666 if ((str_size
= PyString_Size(str
)) < 0)
669 Py_XDECREF(self
->last_string
);
670 self
->last_string
= str
;
672 if (! (*s
= PyString_AsString(str
)))
678 /* Copy the first n bytes from s into newly malloc'ed memory, plus a
679 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
680 * The caller is responsible for free()'ing the return value.
683 pystrndup(const char *s
, int n
)
685 char *r
= (char *)malloc(n
+1);
687 return (char*)PyErr_NoMemory();
695 get(Picklerobject
*self
, PyObject
*id
)
697 PyObject
*value
, *mv
;
702 if (!( mv
= PyDict_GetItem(self
->memo
, id
))) {
703 PyErr_SetObject(PyExc_KeyError
, id
);
707 if (!( value
= PyTuple_GetItem(mv
, 0)))
710 if (!( PyInt_Check(value
))) {
711 PyErr_SetString(PicklingError
, "no int where int expected in memo");
714 c_value
= PyInt_AS_LONG((PyIntObject
*)value
);
718 PyOS_snprintf(s
+ 1, sizeof(s
) - 1, "%ld\n", c_value
);
721 else if (Pdata_Check(self
->file
)) {
722 if (write_other(self
, NULL
, 0) < 0) return -1;
723 PDATA_APPEND(self
->file
, mv
, -1);
729 s
[1] = (int)(c_value
& 0xff);
734 s
[1] = (int)(c_value
& 0xff);
735 s
[2] = (int)((c_value
>> 8) & 0xff);
736 s
[3] = (int)((c_value
>> 16) & 0xff);
737 s
[4] = (int)((c_value
>> 24) & 0xff);
742 if (self
->write_func(self
, s
, len
) < 0)
750 put(Picklerobject
*self
, PyObject
*ob
)
752 if (ob
->ob_refcnt
< 2 || self
->fast
)
755 return put2(self
, ob
);
760 put2(Picklerobject
*self
, PyObject
*ob
)
766 PyObject
*py_ob_id
= 0, *memo_len
= 0, *t
= 0;
771 if ((p
= PyDict_Size(self
->memo
)) < 0)
774 /* Make sure memo keys are positive! */
776 * XXX And does "positive" really mean non-negative?
777 * XXX pickle.py starts with PUT index 0, not 1. This makes for
778 * XXX gratuitous differences between the pickling modules.
782 if (!( py_ob_id
= PyLong_FromVoidPtr(ob
)))
785 if (!( memo_len
= PyInt_FromLong(p
)))
788 if (!( t
= PyTuple_New(2)))
791 PyTuple_SET_ITEM(t
, 0, memo_len
);
793 PyTuple_SET_ITEM(t
, 1, ob
);
796 if (PyDict_SetItem(self
->memo
, py_ob_id
, t
) < 0)
801 PyOS_snprintf(c_str
+ 1, sizeof(c_str
) - 1, "%d\n", p
);
804 else if (Pdata_Check(self
->file
)) {
805 if (write_other(self
, NULL
, 0) < 0) return -1;
806 PDATA_APPEND(self
->file
, memo_len
, -1);
807 res
=0; /* Job well done ;) */
812 c_str
[0] = LONG_BINPUT
;
813 c_str
[1] = (int)(p
& 0xff);
814 c_str
[2] = (int)((p
>> 8) & 0xff);
815 c_str
[3] = (int)((p
>> 16) & 0xff);
816 c_str
[4] = (int)((p
>> 24) & 0xff);
826 if (self
->write_func(self
, c_str
, len
) < 0)
832 Py_XDECREF(py_ob_id
);
833 Py_XDECREF(memo_len
);
840 whichmodule(PyObject
*global
, PyObject
*global_name
)
843 PyObject
*module
= 0, *modules_dict
= 0,
844 *global_name_attr
= 0, *name
= 0;
846 module
= PyObject_GetAttrString(global
, "__module__");
849 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
854 if (!( modules_dict
= PySys_GetObject("modules")))
858 while ((j
= PyDict_Next(modules_dict
, &i
, &name
, &module
))) {
860 if (PyObject_Compare(name
, __main___str
)==0) continue;
862 global_name_attr
= PyObject_GetAttr(module
, global_name
);
863 if (!global_name_attr
) {
864 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
871 if (global_name_attr
!= global
) {
872 Py_DECREF(global_name_attr
);
876 Py_DECREF(global_name_attr
);
881 /* The following implements the rule in pickle.py added in 1.5
882 that used __main__ if no module is found. I don't actually
896 fast_save_enter(Picklerobject
*self
, PyObject
*obj
)
898 /* if fast_container < 0, we're doing an error exit. */
899 if (++self
->fast_container
>= PY_CPICKLE_FAST_LIMIT
) {
900 PyObject
*key
= NULL
;
901 if (self
->fast_memo
== NULL
) {
902 self
->fast_memo
= PyDict_New();
903 if (self
->fast_memo
== NULL
) {
904 self
->fast_container
= -1;
908 key
= PyLong_FromVoidPtr(obj
);
911 if (PyDict_GetItem(self
->fast_memo
, key
)) {
913 PyErr_Format(PyExc_ValueError
,
914 "fast mode: can't pickle cyclic objects "
915 "including object type %s at %p",
916 obj
->ob_type
->tp_name
, obj
);
917 self
->fast_container
= -1;
920 if (PyDict_SetItem(self
->fast_memo
, key
, Py_None
) < 0) {
922 self
->fast_container
= -1;
931 fast_save_leave(Picklerobject
*self
, PyObject
*obj
)
933 if (self
->fast_container
-- >= PY_CPICKLE_FAST_LIMIT
) {
934 PyObject
*key
= PyLong_FromVoidPtr(obj
);
937 if (PyDict_DelItem(self
->fast_memo
, key
) < 0) {
947 save_none(Picklerobject
*self
, PyObject
*args
)
949 static char none
= NONE
;
950 if (self
->write_func(self
, &none
, 1) < 0)
957 save_bool(Picklerobject
*self
, PyObject
*args
)
959 static const char *buf
[2] = {FALSE
, TRUE
};
960 static char len
[2] = {sizeof(FALSE
)-1, sizeof(TRUE
)-1};
961 long l
= PyInt_AS_LONG((PyIntObject
*)args
);
963 if (self
->proto
>= 2) {
964 char opcode
= l
? NEWTRUE
: NEWFALSE
;
965 if (self
->write_func(self
, &opcode
, 1) < 0)
968 else if (self
->write_func(self
, buf
[l
], len
[l
]) < 0)
974 save_int(Picklerobject
*self
, PyObject
*args
)
977 long l
= PyInt_AS_LONG((PyIntObject
*)args
);
986 /* Text-mode pickle, or long too big to fit in the 4-byte
987 * signed BININT format: store as a string.
990 PyOS_snprintf(c_str
+ 1, sizeof(c_str
) - 1, "%ld\n", l
);
991 if (self
->write_func(self
, c_str
, strlen(c_str
)) < 0)
995 /* Binary pickle and l fits in a signed 4-byte int. */
996 c_str
[1] = (int)( l
& 0xff);
997 c_str
[2] = (int)((l
>> 8) & 0xff);
998 c_str
[3] = (int)((l
>> 16) & 0xff);
999 c_str
[4] = (int)((l
>> 24) & 0xff);
1001 if ((c_str
[4] == 0) && (c_str
[3] == 0)) {
1002 if (c_str
[2] == 0) {
1016 if (self
->write_func(self
, c_str
, len
) < 0)
1025 save_long(Picklerobject
*self
, PyObject
*args
)
1029 PyObject
*repr
= NULL
;
1031 static char l
= LONG
;
1033 if (self
->proto
>= 2) {
1034 /* Linear-time pickling. */
1037 unsigned char *pdata
;
1040 int sign
= _PyLong_Sign(args
);
1043 /* It's 0 -- an empty bytestring. */
1046 i
= self
->write_func(self
, c_str
, 2);
1047 if (i
< 0) goto finally
;
1051 nbits
= _PyLong_NumBits(args
);
1052 if (nbits
== (size_t)-1 && PyErr_Occurred())
1054 /* How many bytes do we need? There are nbits >> 3 full
1055 * bytes of data, and nbits & 7 leftover bits. If there
1056 * are any leftover bits, then we clearly need another
1057 * byte. Wnat's not so obvious is that we *probably*
1058 * need another byte even if there aren't any leftovers:
1059 * the most-significant bit of the most-significant byte
1060 * acts like a sign bit, and it's usually got a sense
1061 * opposite of the one we need. The exception is longs
1062 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1063 * its own 256's-complement, so has the right sign bit
1064 * even without the extra byte. That's a pain to check
1065 * for in advance, though, so we always grab an extra
1066 * byte at the start, and cut it back later if possible.
1068 nbytes
= (nbits
>> 3) + 1;
1069 if (nbytes
> INT_MAX
) {
1070 PyErr_SetString(PyExc_OverflowError
, "long too large "
1074 repr
= PyString_FromStringAndSize(NULL
, (int)nbytes
);
1075 if (repr
== NULL
) goto finally
;
1076 pdata
= (unsigned char *)PyString_AS_STRING(repr
);
1077 i
= _PyLong_AsByteArray((PyLongObject
*)args
,
1079 1 /* little endian */, 1 /* signed */);
1080 if (i
< 0) goto finally
;
1081 /* If the long is negative, this may be a byte more than
1082 * needed. This is so iff the MSB is all redundant sign
1085 if (sign
< 0 && nbytes
> 1 && pdata
[nbytes
- 1] == 0xff &&
1086 (pdata
[nbytes
- 2] & 0x80) != 0)
1091 c_str
[1] = (char)nbytes
;
1097 for (i
= 1; i
< 5; i
++) {
1098 c_str
[i
] = (char)(size
& 0xff);
1103 i
= self
->write_func(self
, c_str
, size
);
1104 if (i
< 0) goto finally
;
1105 i
= self
->write_func(self
, (char *)pdata
, (int)nbytes
);
1106 if (i
< 0) goto finally
;
1111 /* proto < 2: write the repr and newline. This is quadratic-time
1112 * (in the number of digits), in both directions.
1114 if (!( repr
= PyObject_Repr(args
)))
1117 if ((size
= PyString_Size(repr
)) < 0)
1120 if (self
->write_func(self
, &l
, 1) < 0)
1123 if (self
->write_func(self
,
1124 PyString_AS_STRING((PyStringObject
*)repr
),
1128 if (self
->write_func(self
, "\n", 1) < 0)
1140 save_float(Picklerobject
*self
, PyObject
*args
)
1142 double x
= PyFloat_AS_DOUBLE((PyFloatObject
*)args
);
1147 if (_PyFloat_Pack8(x
, (unsigned char *)&str
[1], 0) < 0)
1149 if (self
->write_func(self
, str
, 9) < 0)
1155 PyOS_ascii_formatd(c_str
+ 1, sizeof(c_str
) - 2, "%.17g", x
);
1156 /* Extend the formatted string with a newline character */
1157 strcat(c_str
, "\n");
1159 if (self
->write_func(self
, c_str
, strlen(c_str
)) < 0)
1168 save_string(Picklerobject
*self
, PyObject
*args
, int doput
)
1173 if ((size
= PyString_Size(args
)) < 0)
1179 static char string
= STRING
;
1181 if (!( repr
= PyObject_Repr(args
)))
1184 if ((len
= PyString_Size(repr
)) < 0)
1186 repr_str
= PyString_AS_STRING((PyStringObject
*)repr
);
1188 if (self
->write_func(self
, &string
, 1) < 0)
1191 if (self
->write_func(self
, repr_str
, len
) < 0)
1194 if (self
->write_func(self
, "\n", 1) < 0)
1203 if ((size
= PyString_Size(args
)) < 0)
1207 c_str
[0] = SHORT_BINSTRING
;
1211 else if (size
<= INT_MAX
) {
1212 c_str
[0] = BINSTRING
;
1213 for (i
= 1; i
< 5; i
++)
1214 c_str
[i
] = (int)(size
>> ((i
- 1) * 8));
1218 return -1; /* string too large */
1220 if (self
->write_func(self
, c_str
, len
) < 0)
1223 if (size
> 128 && Pdata_Check(self
->file
)) {
1224 if (write_other(self
, NULL
, 0) < 0) return -1;
1225 PDATA_APPEND(self
->file
, args
, -1);
1228 if (self
->write_func(self
,
1230 (PyStringObject
*)args
),
1237 if (put(self
, args
) < 0)
1248 #ifdef Py_USING_UNICODE
1249 /* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1250 backslash and newline characters to \uXXXX escapes. */
1252 modified_EncodeRawUnicodeEscape(const Py_UNICODE
*s
, int size
)
1258 static const char *hexdigit
= "0123456789ABCDEF";
1260 repr
= PyString_FromStringAndSize(NULL
, 6 * size
);
1266 p
= q
= PyString_AS_STRING(repr
);
1267 while (size
-- > 0) {
1268 Py_UNICODE ch
= *s
++;
1269 /* Map 16-bit characters to '\uxxxx' */
1270 if (ch
>= 256 || ch
== '\\' || ch
== '\n') {
1273 *p
++ = hexdigit
[(ch
>> 12) & 0xf];
1274 *p
++ = hexdigit
[(ch
>> 8) & 0xf];
1275 *p
++ = hexdigit
[(ch
>> 4) & 0xf];
1276 *p
++ = hexdigit
[ch
& 15];
1278 /* Copy everything else as-is */
1283 _PyString_Resize(&repr
, p
- q
);
1289 save_unicode(Picklerobject
*self
, PyObject
*args
, int doput
)
1291 Py_ssize_t size
, len
;
1294 if (!PyUnicode_Check(args
))
1299 static char string
= UNICODE
;
1301 repr
= modified_EncodeRawUnicodeEscape(
1302 PyUnicode_AS_UNICODE(args
), PyUnicode_GET_SIZE(args
));
1306 if ((len
= PyString_Size(repr
)) < 0)
1308 repr_str
= PyString_AS_STRING((PyStringObject
*)repr
);
1310 if (self
->write_func(self
, &string
, 1) < 0)
1313 if (self
->write_func(self
, repr_str
, len
) < 0)
1316 if (self
->write_func(self
, "\n", 1) < 0)
1325 if (!( repr
= PyUnicode_AsUTF8String(args
)))
1328 if ((size
= PyString_Size(repr
)) < 0)
1331 return -1; /* string too large */
1333 c_str
[0] = BINUNICODE
;
1334 for (i
= 1; i
< 5; i
++)
1335 c_str
[i
] = (int)(size
>> ((i
- 1) * 8));
1338 if (self
->write_func(self
, c_str
, len
) < 0)
1341 if (size
> 128 && Pdata_Check(self
->file
)) {
1342 if (write_other(self
, NULL
, 0) < 0)
1344 PDATA_APPEND(self
->file
, repr
, -1);
1347 if (self
->write_func(self
, PyString_AS_STRING(repr
),
1356 if (put(self
, args
) < 0)
1367 /* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1369 store_tuple_elements(Picklerobject
*self
, PyObject
*t
, int len
)
1372 int res
= -1; /* guilty until proved innocent */
1374 assert(PyTuple_Size(t
) == len
);
1376 for (i
= 0; i
< len
; i
++) {
1377 PyObject
*element
= PyTuple_GET_ITEM(t
, i
);
1379 if (element
== NULL
)
1381 if (save(self
, element
, 0) < 0)
1390 /* Tuples are ubiquitous in the pickle protocols, so many techniques are
1391 * used across protocols to minimize the space needed to pickle them.
1392 * Tuples are also the only builtin immutable type that can be recursive
1393 * (a tuple can be reached from itself), and that requires some subtle
1394 * magic so that it works in all cases. IOW, this is a long routine.
1397 save_tuple(Picklerobject
*self
, PyObject
*args
)
1399 PyObject
*py_tuple_id
= NULL
;
1403 static char tuple
= TUPLE
;
1404 static char pop
= POP
;
1405 static char pop_mark
= POP_MARK
;
1406 static char len2opcode
[] = {EMPTY_TUPLE
, TUPLE1
, TUPLE2
, TUPLE3
};
1408 if ((len
= PyTuple_Size(args
)) < 0)
1415 c_str
[0] = EMPTY_TUPLE
;
1423 if (self
->write_func(self
, c_str
, len
) >= 0)
1425 /* Don't memoize an empty tuple. */
1429 /* A non-empty tuple. */
1431 /* id(tuple) isn't in the memo now. If it shows up there after
1432 * saving the tuple elements, the tuple must be recursive, in
1433 * which case we'll pop everything we put on the stack, and fetch
1434 * its value from the memo.
1436 py_tuple_id
= PyLong_FromVoidPtr(args
);
1437 if (py_tuple_id
== NULL
)
1440 if (len
<= 3 && self
->proto
>= 2) {
1441 /* Use TUPLE{1,2,3} opcodes. */
1442 if (store_tuple_elements(self
, args
, len
) < 0)
1444 if (PyDict_GetItem(self
->memo
, py_tuple_id
)) {
1445 /* pop the len elements */
1446 for (i
= 0; i
< len
; ++i
)
1447 if (self
->write_func(self
, &pop
, 1) < 0)
1449 /* fetch from memo */
1450 if (get(self
, py_tuple_id
) < 0)
1455 /* Not recursive. */
1456 if (self
->write_func(self
, len2opcode
+ len
, 1) < 0)
1461 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1462 * Generate MARK elt1 elt2 ... TUPLE
1464 if (self
->write_func(self
, &MARKv
, 1) < 0)
1467 if (store_tuple_elements(self
, args
, len
) < 0)
1470 if (PyDict_GetItem(self
->memo
, py_tuple_id
)) {
1471 /* pop the stack stuff we pushed */
1473 if (self
->write_func(self
, &pop_mark
, 1) < 0)
1477 /* Note that we pop one more than len, to remove
1480 for (i
= 0; i
<= len
; i
++)
1481 if (self
->write_func(self
, &pop
, 1) < 0)
1484 /* fetch from memo */
1485 if (get(self
, py_tuple_id
) >= 0)
1490 /* Not recursive. */
1491 if (self
->write_func(self
, &tuple
, 1) < 0)
1495 if (put(self
, args
) >= 0)
1499 Py_XDECREF(py_tuple_id
);
1503 /* iter is an iterator giving items, and we batch up chunks of
1504 * MARK item item ... item APPENDS
1505 * opcode sequences. Calling code should have arranged to first create an
1506 * empty list, or list-like object, for the APPENDS to operate on.
1507 * Returns 0 on success, <0 on error.
1510 batch_list(Picklerobject
*self
, PyObject
*iter
)
1513 PyObject
*slice
[BATCHSIZE
];
1516 static char append
= APPEND
;
1517 static char appends
= APPENDS
;
1519 assert(iter
!= NULL
);
1521 if (self
->proto
== 0) {
1522 /* APPENDS isn't available; do one at a time. */
1524 obj
= PyIter_Next(iter
);
1526 if (PyErr_Occurred())
1530 i
= save(self
, obj
, 0);
1534 if (self
->write_func(self
, &append
, 1) < 0)
1540 /* proto > 0: write in batches of BATCHSIZE. */
1542 /* Get next group of (no more than) BATCHSIZE elements. */
1543 for (n
= 0; n
< BATCHSIZE
; ++n
) {
1544 obj
= PyIter_Next(iter
);
1546 if (PyErr_Occurred())
1554 /* Pump out MARK, slice[0:n], APPENDS. */
1555 if (self
->write_func(self
, &MARKv
, 1) < 0)
1557 for (i
= 0; i
< n
; ++i
) {
1558 if (save(self
, slice
[i
], 0) < 0)
1561 if (self
->write_func(self
, &appends
, 1) < 0)
1565 if (save(self
, slice
[0], 0) < 0)
1567 if (self
->write_func(self
, &append
, 1) < 0)
1571 for (i
= 0; i
< n
; ++i
) {
1572 Py_DECREF(slice
[i
]);
1574 } while (n
== BATCHSIZE
);
1579 Py_DECREF(slice
[n
]);
1585 save_list(Picklerobject
*self
, PyObject
*args
)
1592 if (self
->fast
&& !fast_save_enter(self
, args
))
1595 /* Create an empty list. */
1606 if (self
->write_func(self
, s
, len
) < 0)
1609 /* Get list length, and bow out early if empty. */
1610 if ((len
= PyList_Size(args
)) < 0)
1615 if (put(self
, args
) >= 0)
1619 if (put2(self
, args
) < 0)
1622 /* Materialize the list elements. */
1623 iter
= PyObject_GetIter(args
);
1626 res
= batch_list(self
, iter
);
1630 if (self
->fast
&& !fast_save_leave(self
, args
))
1637 /* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1638 * MARK key value ... key value SETITEMS
1639 * opcode sequences. Calling code should have arranged to first create an
1640 * empty dict, or dict-like object, for the SETITEMS to operate on.
1641 * Returns 0 on success, <0 on error.
1643 * This is very much like batch_list(). The difference between saving
1644 * elements directly, and picking apart two-tuples, is so long-winded at
1645 * the C level, though, that attempts to combine these routines were too
1649 batch_dict(Picklerobject
*self
, PyObject
*iter
)
1652 PyObject
*slice
[BATCHSIZE
];
1655 static char setitem
= SETITEM
;
1656 static char setitems
= SETITEMS
;
1658 assert(iter
!= NULL
);
1660 if (self
->proto
== 0) {
1661 /* SETITEMS isn't available; do one at a time. */
1663 p
= PyIter_Next(iter
);
1665 if (PyErr_Occurred())
1669 if (!PyTuple_Check(p
) || PyTuple_Size(p
) != 2) {
1670 PyErr_SetString(PyExc_TypeError
, "dict items "
1671 "iterator must return 2-tuples");
1674 i
= save(self
, PyTuple_GET_ITEM(p
, 0), 0);
1676 i
= save(self
, PyTuple_GET_ITEM(p
, 1), 0);
1680 if (self
->write_func(self
, &setitem
, 1) < 0)
1686 /* proto > 0: write in batches of BATCHSIZE. */
1688 /* Get next group of (no more than) BATCHSIZE elements. */
1689 for (n
= 0; n
< BATCHSIZE
; ++n
) {
1690 p
= PyIter_Next(iter
);
1692 if (PyErr_Occurred())
1696 if (!PyTuple_Check(p
) || PyTuple_Size(p
) != 2) {
1697 PyErr_SetString(PyExc_TypeError
, "dict items "
1698 "iterator must return 2-tuples");
1705 /* Pump out MARK, slice[0:n], SETITEMS. */
1706 if (self
->write_func(self
, &MARKv
, 1) < 0)
1708 for (i
= 0; i
< n
; ++i
) {
1710 if (save(self
, PyTuple_GET_ITEM(p
, 0), 0) < 0)
1712 if (save(self
, PyTuple_GET_ITEM(p
, 1), 0) < 0)
1715 if (self
->write_func(self
, &setitems
, 1) < 0)
1720 if (save(self
, PyTuple_GET_ITEM(p
, 0), 0) < 0)
1722 if (save(self
, PyTuple_GET_ITEM(p
, 1), 0) < 0)
1724 if (self
->write_func(self
, &setitem
, 1) < 0)
1728 for (i
= 0; i
< n
; ++i
) {
1729 Py_DECREF(slice
[i
]);
1731 } while (n
== BATCHSIZE
);
1736 Py_DECREF(slice
[n
]);
1742 save_dict(Picklerobject
*self
, PyObject
*args
)
1749 if (self
->fast
&& !fast_save_enter(self
, args
))
1752 /* Create an empty dict. */
1763 if (self
->write_func(self
, s
, len
) < 0)
1766 /* Get dict size, and bow out early if empty. */
1767 if ((len
= PyDict_Size(args
)) < 0)
1771 if (put(self
, args
) >= 0)
1775 if (put2(self
, args
) < 0)
1778 /* Materialize the dict items. */
1779 iter
= PyObject_CallMethod(args
, "iteritems", "()");
1782 res
= batch_dict(self
, iter
);
1786 if (self
->fast
&& !fast_save_leave(self
, args
))
1794 save_inst(Picklerobject
*self
, PyObject
*args
)
1796 PyObject
*class = 0, *module
= 0, *name
= 0, *state
= 0,
1797 *getinitargs_func
= 0, *getstate_func
= 0, *class_args
= 0;
1798 char *module_str
, *name_str
;
1799 int module_size
, name_size
, res
= -1;
1801 static char inst
= INST
, obj
= OBJ
, build
= BUILD
;
1803 if (self
->fast
&& !fast_save_enter(self
, args
))
1806 if (self
->write_func(self
, &MARKv
, 1) < 0)
1809 if (!( class = PyObject_GetAttr(args
, __class___str
)))
1813 if (save(self
, class, 0) < 0)
1817 if ((getinitargs_func
= PyObject_GetAttr(args
, __getinitargs___str
))) {
1818 PyObject
*element
= 0;
1822 PyObject_Call(getinitargs_func
, empty_tuple
, NULL
)))
1825 if ((len
= PyObject_Size(class_args
)) < 0)
1828 for (i
= 0; i
< len
; i
++) {
1829 if (!( element
= PySequence_GetItem(class_args
, i
)))
1832 if (save(self
, element
, 0) < 0) {
1841 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
1848 if (!( name
= ((PyClassObject
*)class)->cl_name
)) {
1849 PyErr_SetString(PicklingError
, "class has no name");
1853 if (!( module
= whichmodule(class, name
)))
1857 if ((module_size
= PyString_Size(module
)) < 0 ||
1858 (name_size
= PyString_Size(name
)) < 0)
1861 module_str
= PyString_AS_STRING((PyStringObject
*)module
);
1862 name_str
= PyString_AS_STRING((PyStringObject
*)name
);
1864 if (self
->write_func(self
, &inst
, 1) < 0)
1867 if (self
->write_func(self
, module_str
, module_size
) < 0)
1870 if (self
->write_func(self
, "\n", 1) < 0)
1873 if (self
->write_func(self
, name_str
, name_size
) < 0)
1876 if (self
->write_func(self
, "\n", 1) < 0)
1879 else if (self
->write_func(self
, &obj
, 1) < 0) {
1883 if ((getstate_func
= PyObject_GetAttr(args
, __getstate___str
))) {
1884 state
= PyObject_Call(getstate_func
, empty_tuple
, NULL
);
1889 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
1894 if (!( state
= PyObject_GetAttr(args
, __dict___str
))) {
1895 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
1904 if (!PyDict_Check(state
)) {
1905 if (put2(self
, args
) < 0)
1909 if (put(self
, args
) < 0)
1913 if (save(self
, state
, 0) < 0)
1916 if (self
->write_func(self
, &build
, 1) < 0)
1922 if (self
->fast
&& !fast_save_leave(self
, args
))
1928 Py_XDECREF(getinitargs_func
);
1929 Py_XDECREF(getstate_func
);
1930 Py_XDECREF(class_args
);
1937 save_global(Picklerobject
*self
, PyObject
*args
, PyObject
*name
)
1939 PyObject
*global_name
= 0, *module
= 0, *mod
= 0, *klass
= 0;
1940 char *name_str
, *module_str
;
1941 int module_size
, name_size
, res
= -1;
1943 static char global
= GLOBAL
;
1947 Py_INCREF(global_name
);
1950 if (!( global_name
= PyObject_GetAttr(args
, __name___str
)))
1954 if (!( module
= whichmodule(args
, global_name
)))
1957 if ((module_size
= PyString_Size(module
)) < 0 ||
1958 (name_size
= PyString_Size(global_name
)) < 0)
1961 module_str
= PyString_AS_STRING((PyStringObject
*)module
);
1962 name_str
= PyString_AS_STRING((PyStringObject
*)global_name
);
1964 /* XXX This can be doing a relative import. Clearly it shouldn't,
1965 but I don't know how to stop it. :-( */
1966 mod
= PyImport_ImportModule(module_str
);
1968 cPickle_ErrFormat(PicklingError
,
1969 "Can't pickle %s: import of module %s "
1971 "OS", args
, module
);
1974 klass
= PyObject_GetAttrString(mod
, name_str
);
1975 if (klass
== NULL
) {
1976 cPickle_ErrFormat(PicklingError
,
1977 "Can't pickle %s: attribute lookup %s.%s "
1979 "OSS", args
, module
, global_name
);
1982 if (klass
!= args
) {
1984 cPickle_ErrFormat(PicklingError
,
1985 "Can't pickle %s: it's not the same object "
1987 "OSS", args
, module
, global_name
);
1992 if (self
->proto
>= 2) {
1993 /* See whether this is in the extension registry, and if
1994 * so generate an EXT opcode.
1996 PyObject
*py_code
; /* extension code as Python object */
1997 long code
; /* extension code as C value */
2001 PyTuple_SET_ITEM(two_tuple
, 0, module
);
2002 PyTuple_SET_ITEM(two_tuple
, 1, global_name
);
2003 py_code
= PyDict_GetItem(extension_registry
, two_tuple
);
2004 if (py_code
== NULL
)
2005 goto gen_global
; /* not registered */
2007 /* Verify py_code has the right type and value. */
2008 if (!PyInt_Check(py_code
)) {
2009 cPickle_ErrFormat(PicklingError
, "Can't pickle %s: "
2010 "extension code %s isn't an integer",
2011 "OO", args
, py_code
);
2014 code
= PyInt_AS_LONG(py_code
);
2015 if (code
<= 0 || code
> 0x7fffffffL
) {
2016 cPickle_ErrFormat(PicklingError
, "Can't pickle %s: "
2017 "extension code %ld is out of range",
2022 /* Generate an EXT opcode. */
2025 c_str
[1] = (char)code
;
2028 else if (code
<= 0xffff) {
2030 c_str
[1] = (char)(code
& 0xff);
2031 c_str
[2] = (char)((code
>> 8) & 0xff);
2036 c_str
[1] = (char)(code
& 0xff);
2037 c_str
[2] = (char)((code
>> 8) & 0xff);
2038 c_str
[3] = (char)((code
>> 16) & 0xff);
2039 c_str
[4] = (char)((code
>> 24) & 0xff);
2043 if (self
->write_func(self
, c_str
, n
) >= 0)
2045 goto finally
; /* and don't memoize */
2049 if (self
->write_func(self
, &global
, 1) < 0)
2052 if (self
->write_func(self
, module_str
, module_size
) < 0)
2055 if (self
->write_func(self
, "\n", 1) < 0)
2058 if (self
->write_func(self
, name_str
, name_size
) < 0)
2061 if (self
->write_func(self
, "\n", 1) < 0)
2064 if (put(self
, args
) < 0)
2071 Py_XDECREF(global_name
);
2078 save_pers(Picklerobject
*self
, PyObject
*args
, PyObject
*f
)
2083 static char persid
= PERSID
, binpersid
= BINPERSID
;
2086 ARG_TUP(self
, args
);
2088 pid
= PyObject_Call(f
, self
->arg
, NULL
);
2091 if (! pid
) return -1;
2093 if (pid
!= Py_None
) {
2095 if (!PyString_Check(pid
)) {
2096 PyErr_SetString(PicklingError
,
2097 "persistent id must be string");
2101 if (self
->write_func(self
, &persid
, 1) < 0)
2104 if ((size
= PyString_Size(pid
)) < 0)
2107 if (self
->write_func(self
,
2109 (PyStringObject
*)pid
),
2113 if (self
->write_func(self
, "\n", 1) < 0)
2119 else if (save(self
, pid
, 1) >= 0) {
2120 if (self
->write_func(self
, &binpersid
, 1) < 0)
2137 /* We're saving ob, and args is the 2-thru-5 tuple returned by the
2138 * appropriate __reduce__ method for ob.
2141 save_reduce(Picklerobject
*self
, PyObject
*args
, PyObject
*ob
)
2145 PyObject
*state
= NULL
;
2146 PyObject
*listitems
= NULL
;
2147 PyObject
*dictitems
= NULL
;
2149 int use_newobj
= self
->proto
>= 2;
2151 static char reduce
= REDUCE
;
2152 static char build
= BUILD
;
2153 static char newobj
= NEWOBJ
;
2155 if (! PyArg_UnpackTuple(args
, "save_reduce", 2, 5,
2163 if (!PyTuple_Check(argtup
)) {
2164 PyErr_SetString(PicklingError
,
2165 "args from reduce() should be a tuple");
2169 if (state
== Py_None
)
2171 if (listitems
== Py_None
)
2173 if (dictitems
== Py_None
)
2176 /* Protocol 2 special case: if callable's name is __newobj__, use
2177 * NEWOBJ. This consumes a lot of code.
2180 PyObject
*temp
= PyObject_GetAttr(callable
, __name___str
);
2183 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
2190 use_newobj
= PyString_Check(temp
) &&
2191 strcmp(PyString_AS_STRING(temp
),
2198 PyObject
*newargtup
;
2201 /* Sanity checks. */
2202 n
= PyTuple_Size(argtup
);
2204 PyErr_SetString(PicklingError
, "__newobj__ arglist "
2209 cls
= PyTuple_GET_ITEM(argtup
, 0);
2210 if (! PyObject_HasAttrString(cls
, "__new__")) {
2211 PyErr_SetString(PicklingError
, "args[0] from "
2212 "__newobj__ args has no __new__");
2216 /* XXX How could ob be NULL? */
2218 PyObject
*ob_dot_class
;
2220 ob_dot_class
= PyObject_GetAttr(ob
, __class___str
);
2221 if (ob_dot_class
== NULL
) {
2222 if (PyErr_ExceptionMatches(
2223 PyExc_AttributeError
))
2228 i
= ob_dot_class
!= cls
; /* true iff a problem */
2229 Py_XDECREF(ob_dot_class
);
2231 PyErr_SetString(PicklingError
, "args[0] from "
2232 "__newobj__ args has the wrong class");
2237 /* Save the class and its __new__ arguments. */
2238 if (save(self
, cls
, 0) < 0)
2241 newargtup
= PyTuple_New(n
-1); /* argtup[1:] */
2242 if (newargtup
== NULL
)
2244 for (i
= 1; i
< n
; ++i
) {
2245 PyObject
*temp
= PyTuple_GET_ITEM(argtup
, i
);
2247 PyTuple_SET_ITEM(newargtup
, i
-1, temp
);
2249 i
= save(self
, newargtup
, 0) < 0;
2250 Py_DECREF(newargtup
);
2254 /* Add NEWOBJ opcode. */
2255 if (self
->write_func(self
, &newobj
, 1) < 0)
2259 /* Not using NEWOBJ. */
2260 if (save(self
, callable
, 0) < 0 ||
2261 save(self
, argtup
, 0) < 0 ||
2262 self
->write_func(self
, &reduce
, 1) < 0)
2267 /* XXX How can ob be NULL? */
2269 if (state
&& !PyDict_Check(state
)) {
2270 if (put2(self
, ob
) < 0)
2273 else if (put(self
, ob
) < 0)
2278 if (listitems
&& batch_list(self
, listitems
) < 0)
2281 if (dictitems
&& batch_dict(self
, dictitems
) < 0)
2285 if (save(self
, state
, 0) < 0 ||
2286 self
->write_func(self
, &build
, 1) < 0)
2294 save(Picklerobject
*self
, PyObject
*args
, int pers_save
)
2297 PyObject
*py_ob_id
= 0, *__reduce__
= 0, *t
= 0;
2302 if (self
->nesting
++ > Py_GetRecursionLimit()){
2303 PyErr_SetString(PyExc_RuntimeError
,
2304 "maximum recursion depth exceeded");
2308 if (!pers_save
&& self
->pers_func
) {
2309 if ((tmp
= save_pers(self
, args
, self
->pers_func
)) != 0) {
2315 if (args
== Py_None
) {
2316 res
= save_none(self
, args
);
2320 type
= args
->ob_type
;
2322 switch (type
->tp_name
[0]) {
2324 if (args
== Py_False
|| args
== Py_True
) {
2325 res
= save_bool(self
, args
);
2330 if (type
== &PyInt_Type
) {
2331 res
= save_int(self
, args
);
2337 if (type
== &PyLong_Type
) {
2338 res
= save_long(self
, args
);
2344 if (type
== &PyFloat_Type
) {
2345 res
= save_float(self
, args
);
2351 if (type
== &PyTuple_Type
&& PyTuple_Size(args
) == 0) {
2352 res
= save_tuple(self
, args
);
2358 if ((type
== &PyString_Type
) && (PyString_GET_SIZE(args
) < 2)) {
2359 res
= save_string(self
, args
, 0);
2363 #ifdef Py_USING_UNICODE
2365 if ((type
== &PyUnicode_Type
) && (PyString_GET_SIZE(args
) < 2)) {
2366 res
= save_unicode(self
, args
, 0);
2372 if (args
->ob_refcnt
> 1) {
2373 if (!( py_ob_id
= PyLong_FromVoidPtr(args
)))
2376 if (PyDict_GetItem(self
->memo
, py_ob_id
)) {
2377 if (get(self
, py_ob_id
) < 0)
2385 switch (type
->tp_name
[0]) {
2387 if (type
== &PyString_Type
) {
2388 res
= save_string(self
, args
, 1);
2393 #ifdef Py_USING_UNICODE
2395 if (type
== &PyUnicode_Type
) {
2396 res
= save_unicode(self
, args
, 1);
2403 if (type
== &PyTuple_Type
) {
2404 res
= save_tuple(self
, args
);
2407 if (type
== &PyType_Type
) {
2408 res
= save_global(self
, args
, NULL
);
2414 if (type
== &PyList_Type
) {
2415 res
= save_list(self
, args
);
2421 if (type
== &PyDict_Type
) {
2422 res
= save_dict(self
, args
);
2428 if (type
== &PyInstance_Type
) {
2429 res
= save_inst(self
, args
);
2435 if (type
== &PyClass_Type
) {
2436 res
= save_global(self
, args
, NULL
);
2442 if (type
== &PyFunction_Type
) {
2443 res
= save_global(self
, args
, NULL
);
2444 if (res
&& PyErr_ExceptionMatches(PickleError
)) {
2445 /* fall back to reduce */
2454 if (type
== &PyCFunction_Type
) {
2455 res
= save_global(self
, args
, NULL
);
2460 if (!pers_save
&& self
->inst_pers_func
) {
2461 if ((tmp
= save_pers(self
, args
, self
->inst_pers_func
)) != 0) {
2467 if (PyType_IsSubtype(type
, &PyType_Type
)) {
2468 res
= save_global(self
, args
, NULL
);
2472 /* Get a reduction callable, and call it. This may come from
2473 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2474 * or the object's __reduce__ method.
2476 __reduce__
= PyDict_GetItem(dispatch_table
, (PyObject
*)type
);
2477 if (__reduce__
!= NULL
) {
2478 Py_INCREF(__reduce__
);
2480 ARG_TUP(self
, args
);
2482 t
= PyObject_Call(__reduce__
, self
->arg
, NULL
);
2487 /* Check for a __reduce_ex__ method. */
2488 __reduce__
= PyObject_GetAttr(args
, __reduce_ex___str
);
2489 if (__reduce__
!= NULL
) {
2490 t
= PyInt_FromLong(self
->proto
);
2495 t
= PyObject_Call(__reduce__
,
2502 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
2506 /* Check for a __reduce__ method. */
2507 __reduce__
= PyObject_GetAttr(args
, __reduce___str
);
2508 if (__reduce__
!= NULL
) {
2509 t
= PyObject_Call(__reduce__
,
2513 PyErr_SetObject(UnpickleableError
, args
);
2522 if (PyString_Check(t
)) {
2523 res
= save_global(self
, args
, t
);
2527 if (! PyTuple_Check(t
)) {
2528 cPickle_ErrFormat(PicklingError
, "Value returned by "
2529 "%s must be string or tuple",
2534 size
= PyTuple_Size(t
);
2535 if (size
< 2 || size
> 5) {
2536 cPickle_ErrFormat(PicklingError
, "tuple returned by "
2537 "%s must contain 2 through 5 elements",
2542 arg_tup
= PyTuple_GET_ITEM(t
, 1);
2543 if (!(PyTuple_Check(arg_tup
) || arg_tup
== Py_None
)) {
2544 cPickle_ErrFormat(PicklingError
, "Second element of "
2545 "tuple returned by %s must be a tuple",
2550 res
= save_reduce(self
, t
, args
);
2554 Py_XDECREF(py_ob_id
);
2555 Py_XDECREF(__reduce__
);
2563 dump(Picklerobject
*self
, PyObject
*args
)
2565 static char stop
= STOP
;
2567 if (self
->proto
>= 2) {
2571 assert(self
->proto
>= 0 && self
->proto
< 256);
2572 bytes
[1] = (char)self
->proto
;
2573 if (self
->write_func(self
, bytes
, 2) < 0)
2577 if (save(self
, args
, 0) < 0)
2580 if (self
->write_func(self
, &stop
, 1) < 0)
2583 if (self
->write_func(self
, NULL
, 0) < 0)
2590 Pickle_clear_memo(Picklerobject
*self
, PyObject
*args
)
2593 PyDict_Clear(self
->memo
);
2599 Pickle_getvalue(Picklerobject
*self
, PyObject
*args
)
2601 int l
, i
, rsize
, ssize
, clear
=1, lm
;
2604 char *s
, *p
, *have_get
;
2607 /* Can be called by Python code or C code */
2608 if (args
&& !PyArg_ParseTuple(args
, "|i:getvalue", &clear
))
2611 /* Check to make sure we are based on a list */
2612 if (! Pdata_Check(self
->file
)) {
2613 PyErr_SetString(PicklingError
,
2614 "Attempt to getvalue() a non-list-based pickler");
2618 /* flush write buffer */
2619 if (write_other(self
, NULL
, 0) < 0) return NULL
;
2621 data
=(Pdata
*)self
->file
;
2624 /* set up an array to hold get/put status */
2625 lm
= PyDict_Size(self
->memo
);
2626 if (lm
< 0) return NULL
;
2628 have_get
= malloc(lm
);
2629 if (have_get
== NULL
) return PyErr_NoMemory();
2630 memset(have_get
, 0, lm
);
2632 /* Scan for gets. */
2633 for (rsize
= 0, i
= l
; --i
>= 0; ) {
2636 if (PyString_Check(k
))
2637 rsize
+= PyString_GET_SIZE(k
);
2639 else if (PyInt_Check(k
)) { /* put */
2640 ik
= PyInt_AS_LONG((PyIntObject
*)k
);
2641 if (ik
>= lm
|| ik
== 0) {
2642 PyErr_SetString(PicklingError
,
2643 "Invalid get data");
2646 if (have_get
[ik
]) /* with matching get */
2647 rsize
+= ik
< 256 ? 2 : 5;
2650 else if (! (PyTuple_Check(k
) &&
2651 PyTuple_GET_SIZE(k
) == 2 &&
2652 PyInt_Check((k
= PyTuple_GET_ITEM(k
, 0))))
2654 PyErr_SetString(PicklingError
,
2655 "Unexpected data in internal list");
2660 ik
= PyInt_AS_LONG((PyIntObject
*)k
);
2661 if (ik
>= lm
|| ik
== 0) {
2662 PyErr_SetString(PicklingError
,
2663 "Invalid get data");
2667 rsize
+= ik
< 256 ? 2 : 5;
2671 /* Now generate the result */
2672 r
= PyString_FromStringAndSize(NULL
, rsize
);
2673 if (r
== NULL
) goto err
;
2674 s
= PyString_AS_STRING((PyStringObject
*)r
);
2676 for (i
= 0; i
< l
; i
++) {
2679 if (PyString_Check(k
)) {
2680 ssize
= PyString_GET_SIZE(k
);
2682 p
=PyString_AS_STRING((PyStringObject
*)k
);
2683 while (--ssize
>= 0)
2688 else if (PyTuple_Check(k
)) { /* get */
2689 ik
= PyInt_AS_LONG((PyIntObject
*)
2690 PyTuple_GET_ITEM(k
, 0));
2693 *s
++ = (int)(ik
& 0xff);
2697 *s
++ = (int)(ik
& 0xff);
2698 *s
++ = (int)((ik
>> 8) & 0xff);
2699 *s
++ = (int)((ik
>> 16) & 0xff);
2700 *s
++ = (int)((ik
>> 24) & 0xff);
2705 ik
= PyInt_AS_LONG((PyIntObject
*)k
);
2707 if (have_get
[ik
]) { /* with matching get */
2710 *s
++ = (int)(ik
& 0xff);
2714 *s
++ = (int)(ik
& 0xff);
2715 *s
++ = (int)((ik
>> 8) & 0xff);
2716 *s
++ = (int)((ik
>> 16) & 0xff);
2717 *s
++ = (int)((ik
>> 24) & 0xff);
2724 PyDict_Clear(self
->memo
);
2725 Pdata_clear(data
, 0);
2736 Pickler_dump(Picklerobject
*self
, PyObject
*args
)
2741 if (!( PyArg_ParseTuple(args
, "O|i:dump", &ob
, &get
)))
2744 if (dump(self
, ob
) < 0)
2747 if (get
) return Pickle_getvalue(self
, NULL
);
2749 /* XXX Why does dump() return self? */
2751 return (PyObject
*)self
;
2755 static struct PyMethodDef Pickler_methods
[] =
2757 {"dump", (PyCFunction
)Pickler_dump
, METH_VARARGS
,
2758 PyDoc_STR("dump(object) -- "
2759 "Write an object in pickle format to the object's pickle stream")},
2760 {"clear_memo", (PyCFunction
)Pickle_clear_memo
, METH_NOARGS
,
2761 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
2762 {"getvalue", (PyCFunction
)Pickle_getvalue
, METH_VARARGS
,
2763 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
2764 {NULL
, NULL
} /* sentinel */
2768 static Picklerobject
*
2769 newPicklerobject(PyObject
*file
, int proto
)
2771 Picklerobject
*self
;
2774 proto
= HIGHEST_PROTOCOL
;
2775 if (proto
> HIGHEST_PROTOCOL
) {
2776 PyErr_Format(PyExc_ValueError
, "pickle protocol %d asked for; "
2777 "the highest available protocol is %d",
2778 proto
, HIGHEST_PROTOCOL
);
2782 self
= PyObject_GC_New(Picklerobject
, &Picklertype
);
2785 self
->proto
= proto
;
2786 self
->bin
= proto
> 0;
2791 self
->pers_func
= NULL
;
2792 self
->inst_pers_func
= NULL
;
2793 self
->write_buf
= NULL
;
2796 self
->fast_container
= 0;
2797 self
->fast_memo
= NULL
;
2799 self
->dispatch_table
= NULL
;
2811 if (!( self
->memo
= PyDict_New()))
2814 if (PyFile_Check(file
)) {
2815 self
->fp
= PyFile_AsFile(file
);
2816 if (self
->fp
== NULL
) {
2817 PyErr_SetString(PyExc_ValueError
,
2818 "I/O operation on closed file");
2821 self
->write_func
= write_file
;
2823 else if (PycStringIO_OutputCheck(file
)) {
2824 self
->write_func
= write_cStringIO
;
2826 else if (file
== Py_None
) {
2827 self
->write_func
= write_none
;
2830 self
->write_func
= write_other
;
2832 if (! Pdata_Check(file
)) {
2833 self
->write
= PyObject_GetAttr(file
, write_str
);
2836 PyErr_SetString(PyExc_TypeError
,
2837 "argument must have 'write' "
2843 self
->write_buf
= (char *)PyMem_Malloc(WRITE_BUF_SIZE
);
2844 if (self
->write_buf
== NULL
) {
2850 if (PyEval_GetRestricted()) {
2851 /* Restricted execution, get private tables */
2852 PyObject
*m
= PyImport_Import(copy_reg_str
);
2856 self
->dispatch_table
= PyObject_GetAttr(m
, dispatch_table_str
);
2858 if (self
->dispatch_table
== NULL
)
2862 self
->dispatch_table
= dispatch_table
;
2863 Py_INCREF(dispatch_table
);
2865 PyObject_GC_Track(self
);
2876 get_Pickler(PyObject
*self
, PyObject
*args
, PyObject
*kwds
)
2878 static char *kwlist
[] = {"file", "protocol", NULL
};
2879 PyObject
*file
= NULL
;
2883 * The documented signature is Pickler(file, protocol=0), but this
2884 * accepts Pickler() and Pickler(integer) too. The meaning then
2885 * is clear as mud, undocumented, and not supported by pickle.py.
2886 * I'm told Zope uses this, but I haven't traced into this code
2887 * far enough to figure out what it means.
2889 if (!PyArg_ParseTuple(args
, "|i:Pickler", &proto
)) {
2892 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "O|i:Pickler",
2893 kwlist
, &file
, &proto
))
2896 return (PyObject
*)newPicklerobject(file
, proto
);
2901 Pickler_dealloc(Picklerobject
*self
)
2903 PyObject_GC_UnTrack(self
);
2904 Py_XDECREF(self
->write
);
2905 Py_XDECREF(self
->memo
);
2906 Py_XDECREF(self
->fast_memo
);
2907 Py_XDECREF(self
->arg
);
2908 Py_XDECREF(self
->file
);
2909 Py_XDECREF(self
->pers_func
);
2910 Py_XDECREF(self
->inst_pers_func
);
2911 Py_XDECREF(self
->dispatch_table
);
2912 PyMem_Free(self
->write_buf
);
2913 self
->ob_type
->tp_free((PyObject
*)self
);
2917 Pickler_traverse(Picklerobject
*self
, visitproc visit
, void *arg
)
2919 Py_VISIT(self
->write
);
2920 Py_VISIT(self
->memo
);
2921 Py_VISIT(self
->fast_memo
);
2922 Py_VISIT(self
->arg
);
2923 Py_VISIT(self
->file
);
2924 Py_VISIT(self
->pers_func
);
2925 Py_VISIT(self
->inst_pers_func
);
2926 Py_VISIT(self
->dispatch_table
);
2931 Pickler_clear(Picklerobject
*self
)
2933 Py_CLEAR(self
->write
);
2934 Py_CLEAR(self
->memo
);
2935 Py_CLEAR(self
->fast_memo
);
2936 Py_CLEAR(self
->arg
);
2937 Py_CLEAR(self
->file
);
2938 Py_CLEAR(self
->pers_func
);
2939 Py_CLEAR(self
->inst_pers_func
);
2940 Py_CLEAR(self
->dispatch_table
);
2945 Pickler_get_pers_func(Picklerobject
*p
)
2947 if (p
->pers_func
== NULL
)
2948 PyErr_SetString(PyExc_AttributeError
, "persistent_id");
2950 Py_INCREF(p
->pers_func
);
2951 return p
->pers_func
;
2955 Pickler_set_pers_func(Picklerobject
*p
, PyObject
*v
)
2958 PyErr_SetString(PyExc_TypeError
,
2959 "attribute deletion is not supported");
2962 Py_XDECREF(p
->pers_func
);
2969 Pickler_set_inst_pers_func(Picklerobject
*p
, PyObject
*v
)
2972 PyErr_SetString(PyExc_TypeError
,
2973 "attribute deletion is not supported");
2976 Py_XDECREF(p
->inst_pers_func
);
2978 p
->inst_pers_func
= v
;
2983 Pickler_get_memo(Picklerobject
*p
)
2985 if (p
->memo
== NULL
)
2986 PyErr_SetString(PyExc_AttributeError
, "memo");
2993 Pickler_set_memo(Picklerobject
*p
, PyObject
*v
)
2996 PyErr_SetString(PyExc_TypeError
,
2997 "attribute deletion is not supported");
3000 if (!PyDict_Check(v
)) {
3001 PyErr_SetString(PyExc_TypeError
, "memo must be a dictionary");
3004 Py_XDECREF(p
->memo
);
3011 Pickler_get_error(Picklerobject
*p
)
3013 /* why is this an attribute on the Pickler? */
3014 Py_INCREF(PicklingError
);
3015 return PicklingError
;
3018 static PyMemberDef Pickler_members
[] = {
3019 {"binary", T_INT
, offsetof(Picklerobject
, bin
)},
3020 {"fast", T_INT
, offsetof(Picklerobject
, fast
)},
3024 static PyGetSetDef Pickler_getsets
[] = {
3025 {"persistent_id", (getter
)Pickler_get_pers_func
,
3026 (setter
)Pickler_set_pers_func
},
3027 {"inst_persistent_id", NULL
, (setter
)Pickler_set_inst_pers_func
},
3028 {"memo", (getter
)Pickler_get_memo
, (setter
)Pickler_set_memo
},
3029 {"PicklingError", (getter
)Pickler_get_error
, NULL
},
3033 PyDoc_STRVAR(Picklertype__doc__
,
3034 "Objects that know how to pickle objects\n");
3036 static PyTypeObject Picklertype
= {
3037 PyObject_HEAD_INIT(NULL
)
3039 "cPickle.Pickler", /*tp_name*/
3040 sizeof(Picklerobject
), /*tp_basicsize*/
3042 (destructor
)Pickler_dealloc
, /* tp_dealloc */
3048 0, /* tp_as_number */
3049 0, /* tp_as_sequence */
3050 0, /* tp_as_mapping */
3054 PyObject_GenericGetAttr
, /* tp_getattro */
3055 PyObject_GenericSetAttr
, /* tp_setattro */
3056 0, /* tp_as_buffer */
3057 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
| Py_TPFLAGS_HAVE_GC
,
3058 Picklertype__doc__
, /* tp_doc */
3059 (traverseproc
)Pickler_traverse
, /* tp_traverse */
3060 (inquiry
)Pickler_clear
, /* tp_clear */
3061 0, /* tp_richcompare */
3062 0, /* tp_weaklistoffset */
3064 0, /* tp_iternext */
3065 Pickler_methods
, /* tp_methods */
3066 Pickler_members
, /* tp_members */
3067 Pickler_getsets
, /* tp_getset */
3071 find_class(PyObject
*py_module_name
, PyObject
*py_global_name
, PyObject
*fc
)
3073 PyObject
*global
= 0, *module
;
3077 PyErr_SetString(UnpicklingError
, "Global and instance "
3078 "pickles are not supported.");
3081 return PyObject_CallFunctionObjArgs(fc
, py_module_name
,
3082 py_global_name
, NULL
);
3085 module
= PySys_GetObject("modules");
3089 module
= PyDict_GetItem(module
, py_module_name
);
3090 if (module
== NULL
) {
3091 module
= PyImport_Import(py_module_name
);
3094 global
= PyObject_GetAttr(module
, py_global_name
);
3098 global
= PyObject_GetAttr(module
, py_global_name
);
3103 marker(Unpicklerobject
*self
)
3105 if (self
->num_marks
< 1) {
3106 PyErr_SetString(UnpicklingError
, "could not find MARK");
3110 return self
->marks
[--self
->num_marks
];
3115 load_none(Unpicklerobject
*self
)
3117 PDATA_APPEND(self
->stack
, Py_None
, -1);
3124 PyErr_SetString(UnpicklingError
, "pickle data was truncated");
3129 load_int(Unpicklerobject
*self
)
3131 PyObject
*py_int
= 0;
3136 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3137 if (len
< 2) return bad_readline();
3138 if (!( s
=pystrndup(s
,len
))) return -1;
3141 l
= strtol(s
, &endptr
, 0);
3143 if (errno
|| (*endptr
!= '\n') || (endptr
[1] != '\0')) {
3144 /* Hm, maybe we've got something long. Let's try reading
3145 it as a Python long object. */
3147 py_int
= PyLong_FromString(s
, NULL
, 0);
3148 if (py_int
== NULL
) {
3149 PyErr_SetString(PyExc_ValueError
,
3150 "could not convert string to int");
3155 if (len
== 3 && (l
== 0 || l
== 1)) {
3156 if (!( py_int
= PyBool_FromLong(l
))) goto finally
;
3159 if (!( py_int
= PyInt_FromLong(l
))) goto finally
;
3164 PDATA_PUSH(self
->stack
, py_int
, -1);
3174 load_bool(Unpicklerobject
*self
, PyObject
*boolean
)
3176 assert(boolean
== Py_True
|| boolean
== Py_False
);
3177 PDATA_APPEND(self
->stack
, boolean
, -1);
3181 /* s contains x bytes of a little-endian integer. Return its value as a
3182 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3183 * int, but when x is 4 it's a signed one. This is an historical source
3184 * of x-platform bugs.
3187 calc_binint(char *s
, int x
)
3193 for (i
= 0, l
= 0L; i
< x
; i
++) {
3194 c
= (unsigned char)s
[i
];
3195 l
|= (long)c
<< (i
* 8);
3198 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3199 * is signed, so on a box with longs bigger than 4 bytes we need
3200 * to extend a BININT's sign bit to the full width.
3202 if (x
== 4 && l
& (1L << 31))
3210 load_binintx(Unpicklerobject
*self
, char *s
, int x
)
3212 PyObject
*py_int
= 0;
3215 l
= calc_binint(s
, x
);
3217 if (!( py_int
= PyInt_FromLong(l
)))
3220 PDATA_PUSH(self
->stack
, py_int
, -1);
3226 load_binint(Unpicklerobject
*self
)
3230 if (self
->read_func(self
, &s
, 4) < 0)
3233 return load_binintx(self
, s
, 4);
3238 load_binint1(Unpicklerobject
*self
)
3242 if (self
->read_func(self
, &s
, 1) < 0)
3245 return load_binintx(self
, s
, 1);
3250 load_binint2(Unpicklerobject
*self
)
3254 if (self
->read_func(self
, &s
, 2) < 0)
3257 return load_binintx(self
, s
, 2);
3261 load_long(Unpicklerobject
*self
)
3267 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3268 if (len
< 2) return bad_readline();
3269 if (!( s
=pystrndup(s
,len
))) return -1;
3271 if (!( l
= PyLong_FromString(s
, &end
, 0)))
3275 PDATA_PUSH(self
->stack
, l
, -1);
3284 /* 'size' bytes contain the # of bytes of little-endian 256's-complement
3288 load_counted_long(Unpicklerobject
*self
, int size
)
3292 unsigned char *pdata
;
3295 assert(size
== 1 || size
== 4);
3296 i
= self
->read_func(self
, &nbytes
, size
);
3297 if (i
< 0) return -1;
3299 size
= calc_binint(nbytes
, size
);
3301 /* Corrupt or hostile pickle -- we never write one like
3304 PyErr_SetString(UnpicklingError
, "LONG pickle has negative "
3310 along
= PyLong_FromLong(0L);
3312 /* Read the raw little-endian bytes & convert. */
3313 i
= self
->read_func(self
, (char **)&pdata
, size
);
3314 if (i
< 0) return -1;
3315 along
= _PyLong_FromByteArray(pdata
, (size_t)size
,
3316 1 /* little endian */, 1 /* signed */);
3320 PDATA_PUSH(self
->stack
, along
, -1);
3325 load_float(Unpicklerobject
*self
)
3327 PyObject
*py_float
= 0;
3332 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3333 if (len
< 2) return bad_readline();
3334 if (!( s
=pystrndup(s
,len
))) return -1;
3337 d
= PyOS_ascii_strtod(s
, &endptr
);
3339 if (errno
|| (endptr
[0] != '\n') || (endptr
[1] != '\0')) {
3340 PyErr_SetString(PyExc_ValueError
,
3341 "could not convert string to float");
3345 if (!( py_float
= PyFloat_FromDouble(d
)))
3349 PDATA_PUSH(self
->stack
, py_float
, -1);
3359 load_binfloat(Unpicklerobject
*self
)
3365 if (self
->read_func(self
, &p
, 8) < 0)
3368 x
= _PyFloat_Unpack8((unsigned char *)p
, 0);
3369 if (x
== -1.0 && PyErr_Occurred())
3372 py_float
= PyFloat_FromDouble(x
);
3373 if (py_float
== NULL
)
3376 PDATA_PUSH(self
->stack
, py_float
, -1);
3381 load_string(Unpicklerobject
*self
)
3387 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3388 if (len
< 2) return bad_readline();
3389 if (!( s
=pystrndup(s
,len
))) return -1;
3392 /* Strip outermost quotes */
3393 while (s
[len
-1] <= ' ')
3395 if(s
[0]=='"' && s
[len
-1]=='"'){
3399 } else if(s
[0]=='\'' && s
[len
-1]=='\''){
3405 /********************************************/
3407 str
= PyString_DecodeEscape(p
, len
, NULL
, 0, NULL
);
3410 PDATA_PUSH(self
->stack
, str
, -1);
3417 PyErr_SetString(PyExc_ValueError
,"insecure string pickle");
3423 load_binstring(Unpicklerobject
*self
)
3425 PyObject
*py_string
= 0;
3429 if (self
->read_func(self
, &s
, 4) < 0) return -1;
3431 l
= calc_binint(s
, 4);
3433 if (self
->read_func(self
, &s
, l
) < 0)
3436 if (!( py_string
= PyString_FromStringAndSize(s
, l
)))
3439 PDATA_PUSH(self
->stack
, py_string
, -1);
3445 load_short_binstring(Unpicklerobject
*self
)
3447 PyObject
*py_string
= 0;
3451 if (self
->read_func(self
, &s
, 1) < 0)
3454 l
= (unsigned char)s
[0];
3456 if (self
->read_func(self
, &s
, l
) < 0) return -1;
3458 if (!( py_string
= PyString_FromStringAndSize(s
, l
))) return -1;
3460 PDATA_PUSH(self
->stack
, py_string
, -1);
3465 #ifdef Py_USING_UNICODE
3467 load_unicode(Unpicklerobject
*self
)
3473 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3474 if (len
< 1) return bad_readline();
3476 if (!( str
= PyUnicode_DecodeRawUnicodeEscape(s
, len
- 1, NULL
)))
3479 PDATA_PUSH(self
->stack
, str
, -1);
3488 #ifdef Py_USING_UNICODE
3490 load_binunicode(Unpicklerobject
*self
)
3496 if (self
->read_func(self
, &s
, 4) < 0) return -1;
3498 l
= calc_binint(s
, 4);
3500 if (self
->read_func(self
, &s
, l
) < 0)
3503 if (!( unicode
= PyUnicode_DecodeUTF8(s
, l
, NULL
)))
3506 PDATA_PUSH(self
->stack
, unicode
, -1);
3513 load_tuple(Unpicklerobject
*self
)
3518 if ((i
= marker(self
)) < 0) return -1;
3519 if (!( tup
=Pdata_popTuple(self
->stack
, i
))) return -1;
3520 PDATA_PUSH(self
->stack
, tup
, -1);
3525 load_counted_tuple(Unpicklerobject
*self
, int len
)
3527 PyObject
*tup
= PyTuple_New(len
);
3532 while (--len
>= 0) {
3535 PDATA_POP(self
->stack
, element
);
3536 if (element
== NULL
)
3538 PyTuple_SET_ITEM(tup
, len
, element
);
3540 PDATA_PUSH(self
->stack
, tup
, -1);
3545 load_empty_list(Unpicklerobject
*self
)
3549 if (!( list
=PyList_New(0))) return -1;
3550 PDATA_PUSH(self
->stack
, list
, -1);
3555 load_empty_dict(Unpicklerobject
*self
)
3559 if (!( dict
=PyDict_New())) return -1;
3560 PDATA_PUSH(self
->stack
, dict
, -1);
3566 load_list(Unpicklerobject
*self
)
3571 if ((i
= marker(self
)) < 0) return -1;
3572 if (!( list
=Pdata_popList(self
->stack
, i
))) return -1;
3573 PDATA_PUSH(self
->stack
, list
, -1);
3578 load_dict(Unpicklerobject
*self
)
3580 PyObject
*dict
, *key
, *value
;
3583 if ((i
= marker(self
)) < 0) return -1;
3584 j
=self
->stack
->length
;
3586 if (!( dict
= PyDict_New())) return -1;
3588 for (k
= i
+1; k
< j
; k
+= 2) {
3589 key
=self
->stack
->data
[k
-1];
3590 value
=self
->stack
->data
[k
];
3591 if (PyDict_SetItem(dict
, key
, value
) < 0) {
3596 Pdata_clear(self
->stack
, i
);
3597 PDATA_PUSH(self
->stack
, dict
, -1);
3602 Instance_New(PyObject
*cls
, PyObject
*args
)
3606 if (PyClass_Check(cls
)) {
3609 if ((l
=PyObject_Size(args
)) < 0) goto err
;
3611 PyObject
*__getinitargs__
;
3613 __getinitargs__
= PyObject_GetAttr(cls
,
3614 __getinitargs___str
);
3615 if (!__getinitargs__
) {
3616 /* We have a class with no __getinitargs__,
3617 so bypass usual construction */
3621 if (!( inst
=PyInstance_NewRaw(cls
, NULL
)))
3625 Py_DECREF(__getinitargs__
);
3628 if ((r
=PyInstance_New(cls
, args
, NULL
))) return r
;
3632 if ((r
=PyObject_CallObject(cls
, args
))) return r
;
3636 PyObject
*tp
, *v
, *tb
, *tmp_value
;
3638 PyErr_Fetch(&tp
, &v
, &tb
);
3640 /* NULL occurs when there was a KeyboardInterrupt */
3641 if (tmp_value
== NULL
)
3642 tmp_value
= Py_None
;
3643 if ((r
= PyTuple_Pack(3, tmp_value
, cls
, args
))) {
3647 PyErr_Restore(tp
,v
,tb
);
3654 load_obj(Unpicklerobject
*self
)
3656 PyObject
*class, *tup
, *obj
=0;
3659 if ((i
= marker(self
)) < 0) return -1;
3660 if (!( tup
=Pdata_popTuple(self
->stack
, i
+1))) return -1;
3661 PDATA_POP(self
->stack
, class);
3663 obj
= Instance_New(class, tup
);
3668 if (! obj
) return -1;
3669 PDATA_PUSH(self
->stack
, obj
, -1);
3675 load_inst(Unpicklerobject
*self
)
3677 PyObject
*tup
, *class=0, *obj
=0, *module_name
, *class_name
;
3681 if ((i
= marker(self
)) < 0) return -1;
3683 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3684 if (len
< 2) return bad_readline();
3685 module_name
= PyString_FromStringAndSize(s
, len
- 1);
3686 if (!module_name
) return -1;
3688 if ((len
= self
->readline_func(self
, &s
)) >= 0) {
3689 if (len
< 2) return bad_readline();
3690 if ((class_name
= PyString_FromStringAndSize(s
, len
- 1))) {
3691 class = find_class(module_name
, class_name
,
3693 Py_DECREF(class_name
);
3696 Py_DECREF(module_name
);
3698 if (! class) return -1;
3700 if ((tup
=Pdata_popTuple(self
->stack
, i
))) {
3701 obj
= Instance_New(class, tup
);
3706 if (! obj
) return -1;
3708 PDATA_PUSH(self
->stack
, obj
, -1);
3713 load_newobj(Unpicklerobject
*self
)
3715 PyObject
*args
= NULL
;
3716 PyObject
*clsraw
= NULL
;
3717 PyTypeObject
*cls
; /* clsraw cast to its true type */
3720 /* Stack is ... cls argtuple, and we want to call
3721 * cls.__new__(cls, *argtuple).
3723 PDATA_POP(self
->stack
, args
);
3724 if (args
== NULL
) goto Fail
;
3725 if (! PyTuple_Check(args
)) {
3726 PyErr_SetString(UnpicklingError
, "NEWOBJ expected an arg "
3731 PDATA_POP(self
->stack
, clsraw
);
3732 cls
= (PyTypeObject
*)clsraw
;
3733 if (cls
== NULL
) goto Fail
;
3734 if (! PyType_Check(cls
)) {
3735 PyErr_SetString(UnpicklingError
, "NEWOBJ class argument "
3736 "isn't a type object");
3739 if (cls
->tp_new
== NULL
) {
3740 PyErr_SetString(UnpicklingError
, "NEWOBJ class argument "
3746 obj
= cls
->tp_new(cls
, args
, NULL
);
3747 if (obj
== NULL
) goto Fail
;
3751 PDATA_PUSH(self
->stack
, obj
, -1);
3761 load_global(Unpicklerobject
*self
)
3763 PyObject
*class = 0, *module_name
= 0, *class_name
= 0;
3767 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3768 if (len
< 2) return bad_readline();
3769 module_name
= PyString_FromStringAndSize(s
, len
- 1);
3770 if (!module_name
) return -1;
3772 if ((len
= self
->readline_func(self
, &s
)) >= 0) {
3774 Py_DECREF(module_name
);
3775 return bad_readline();
3777 if ((class_name
= PyString_FromStringAndSize(s
, len
- 1))) {
3778 class = find_class(module_name
, class_name
,
3780 Py_DECREF(class_name
);
3783 Py_DECREF(module_name
);
3785 if (! class) return -1;
3786 PDATA_PUSH(self
->stack
, class, -1);
3792 load_persid(Unpicklerobject
*self
)
3798 if (self
->pers_func
) {
3799 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3800 if (len
< 2) return bad_readline();
3802 pid
= PyString_FromStringAndSize(s
, len
- 1);
3803 if (!pid
) return -1;
3805 if (PyList_Check(self
->pers_func
)) {
3806 if (PyList_Append(self
->pers_func
, pid
) < 0) {
3814 pid
= PyObject_Call(self
->pers_func
, self
->arg
,
3820 if (! pid
) return -1;
3822 PDATA_PUSH(self
->stack
, pid
, -1);
3826 PyErr_SetString(UnpicklingError
,
3827 "A load persistent id instruction was encountered,\n"
3828 "but no persistent_load function was specified.");
3834 load_binpersid(Unpicklerobject
*self
)
3838 if (self
->pers_func
) {
3839 PDATA_POP(self
->stack
, pid
);
3840 if (! pid
) return -1;
3842 if (PyList_Check(self
->pers_func
)) {
3843 if (PyList_Append(self
->pers_func
, pid
) < 0) {
3851 pid
= PyObject_Call(self
->pers_func
, self
->arg
,
3855 if (! pid
) return -1;
3858 PDATA_PUSH(self
->stack
, pid
, -1);
3862 PyErr_SetString(UnpicklingError
,
3863 "A load persistent id instruction was encountered,\n"
3864 "but no persistent_load function was specified.");
3871 load_pop(Unpicklerobject
*self
)
3875 if (!( (len
=self
->stack
->length
) > 0 )) return stackUnderflow();
3877 /* Note that we split the (pickle.py) stack into two stacks,
3878 an object stack and a mark stack. We have to be clever and
3879 pop the right one. We do this by looking at the top of the
3883 if ((self
->num_marks
> 0) &&
3884 (self
->marks
[self
->num_marks
- 1] == len
))
3888 Py_DECREF(self
->stack
->data
[len
]);
3889 self
->stack
->length
=len
;
3897 load_pop_mark(Unpicklerobject
*self
)
3901 if ((i
= marker(self
)) < 0)
3904 Pdata_clear(self
->stack
, i
);
3911 load_dup(Unpicklerobject
*self
)
3916 if ((len
= self
->stack
->length
) <= 0) return stackUnderflow();
3917 last
=self
->stack
->data
[len
-1];
3919 PDATA_PUSH(self
->stack
, last
, -1);
3925 load_get(Unpicklerobject
*self
)
3927 PyObject
*py_str
= 0, *value
= 0;
3932 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3933 if (len
< 2) return bad_readline();
3935 if (!( py_str
= PyString_FromStringAndSize(s
, len
- 1))) return -1;
3937 value
= PyDict_GetItem(self
->memo
, py_str
);
3939 PyErr_SetObject(BadPickleGet
, py_str
);
3943 PDATA_APPEND(self
->stack
, value
, -1);
3953 load_binget(Unpicklerobject
*self
)
3955 PyObject
*py_key
= 0, *value
= 0;
3960 if (self
->read_func(self
, &s
, 1) < 0) return -1;
3962 key
= (unsigned char)s
[0];
3963 if (!( py_key
= PyInt_FromLong((long)key
))) return -1;
3965 value
= PyDict_GetItem(self
->memo
, py_key
);
3967 PyErr_SetObject(BadPickleGet
, py_key
);
3971 PDATA_APPEND(self
->stack
, value
, -1);
3981 load_long_binget(Unpicklerobject
*self
)
3983 PyObject
*py_key
= 0, *value
= 0;
3989 if (self
->read_func(self
, &s
, 4) < 0) return -1;
3991 c
= (unsigned char)s
[0];
3993 c
= (unsigned char)s
[1];
3994 key
|= (long)c
<< 8;
3995 c
= (unsigned char)s
[2];
3996 key
|= (long)c
<< 16;
3997 c
= (unsigned char)s
[3];
3998 key
|= (long)c
<< 24;
4000 if (!( py_key
= PyInt_FromLong((long)key
))) return -1;
4002 value
= PyDict_GetItem(self
->memo
, py_key
);
4004 PyErr_SetObject(BadPickleGet
, py_key
);
4008 PDATA_APPEND(self
->stack
, value
, -1);
4016 /* Push an object from the extension registry (EXT[124]). nbytes is
4017 * the number of bytes following the opcode, holding the index (code) value.
4020 load_extension(Unpicklerobject
*self
, int nbytes
)
4022 char *codebytes
; /* the nbytes bytes after the opcode */
4023 long code
; /* calc_binint returns long */
4024 PyObject
*py_code
; /* code as a Python int */
4025 PyObject
*obj
; /* the object to push */
4026 PyObject
*pair
; /* (module_name, class_name) */
4027 PyObject
*module_name
, *class_name
;
4029 assert(nbytes
== 1 || nbytes
== 2 || nbytes
== 4);
4030 if (self
->read_func(self
, &codebytes
, nbytes
) < 0) return -1;
4031 code
= calc_binint(codebytes
, nbytes
);
4032 if (code
<= 0) { /* note that 0 is forbidden */
4033 /* Corrupt or hostile pickle. */
4034 PyErr_SetString(UnpicklingError
, "EXT specifies code <= 0");
4038 /* Look for the code in the cache. */
4039 py_code
= PyInt_FromLong(code
);
4040 if (py_code
== NULL
) return -1;
4041 obj
= PyDict_GetItem(extension_cache
, py_code
);
4045 PDATA_APPEND(self
->stack
, obj
, -1);
4049 /* Look up the (module_name, class_name) pair. */
4050 pair
= PyDict_GetItem(inverted_registry
, py_code
);
4053 PyErr_Format(PyExc_ValueError
, "unregistered extension "
4057 /* Since the extension registry is manipulable via Python code,
4058 * confirm that pair is really a 2-tuple of strings.
4060 if (!PyTuple_Check(pair
) || PyTuple_Size(pair
) != 2 ||
4061 !PyString_Check(module_name
= PyTuple_GET_ITEM(pair
, 0)) ||
4062 !PyString_Check(class_name
= PyTuple_GET_ITEM(pair
, 1))) {
4064 PyErr_Format(PyExc_ValueError
, "_inverted_registry[%ld] "
4065 "isn't a 2-tuple of strings", code
);
4068 /* Load the object. */
4069 obj
= find_class(module_name
, class_name
, self
->find_class
);
4074 /* Cache code -> obj. */
4075 code
= PyDict_SetItem(extension_cache
, py_code
, obj
);
4081 PDATA_PUSH(self
->stack
, obj
, -1);
4086 load_put(Unpicklerobject
*self
)
4088 PyObject
*py_str
= 0, *value
= 0;
4092 if ((l
= self
->readline_func(self
, &s
)) < 0) return -1;
4093 if (l
< 2) return bad_readline();
4094 if (!( len
=self
->stack
->length
)) return stackUnderflow();
4095 if (!( py_str
= PyString_FromStringAndSize(s
, l
- 1))) return -1;
4096 value
=self
->stack
->data
[len
-1];
4097 l
=PyDict_SetItem(self
->memo
, py_str
, value
);
4104 load_binput(Unpicklerobject
*self
)
4106 PyObject
*py_key
= 0, *value
= 0;
4111 if (self
->read_func(self
, &s
, 1) < 0) return -1;
4112 if (!( (len
=self
->stack
->length
) > 0 )) return stackUnderflow();
4114 key
= (unsigned char)s
[0];
4116 if (!( py_key
= PyInt_FromLong((long)key
))) return -1;
4117 value
=self
->stack
->data
[len
-1];
4118 len
=PyDict_SetItem(self
->memo
, py_key
, value
);
4125 load_long_binput(Unpicklerobject
*self
)
4127 PyObject
*py_key
= 0, *value
= 0;
4133 if (self
->read_func(self
, &s
, 4) < 0) return -1;
4134 if (!( len
=self
->stack
->length
)) return stackUnderflow();
4136 c
= (unsigned char)s
[0];
4138 c
= (unsigned char)s
[1];
4139 key
|= (long)c
<< 8;
4140 c
= (unsigned char)s
[2];
4141 key
|= (long)c
<< 16;
4142 c
= (unsigned char)s
[3];
4143 key
|= (long)c
<< 24;
4145 if (!( py_key
= PyInt_FromLong(key
))) return -1;
4146 value
=self
->stack
->data
[len
-1];
4147 len
=PyDict_SetItem(self
->memo
, py_key
, value
);
4154 do_append(Unpicklerobject
*self
, int x
)
4156 PyObject
*value
= 0, *list
= 0, *append_method
= 0;
4159 len
=self
->stack
->length
;
4160 if (!( len
>= x
&& x
> 0 )) return stackUnderflow();
4162 if (len
==x
) return 0;
4164 list
=self
->stack
->data
[x
-1];
4166 if (PyList_Check(list
)) {
4170 slice
=Pdata_popList(self
->stack
, x
);
4171 if (! slice
) return -1;
4172 list_len
= PyList_GET_SIZE(list
);
4173 i
=PyList_SetSlice(list
, list_len
, list_len
, slice
);
4179 if (!( append_method
= PyObject_GetAttr(list
, append_str
)))
4182 for (i
= x
; i
< len
; i
++) {
4185 value
=self
->stack
->data
[i
];
4187 ARG_TUP(self
, value
);
4189 junk
= PyObject_Call(append_method
, self
->arg
,
4194 Pdata_clear(self
->stack
, i
+1);
4195 self
->stack
->length
=x
;
4196 Py_DECREF(append_method
);
4201 self
->stack
->length
=x
;
4202 Py_DECREF(append_method
);
4210 load_append(Unpicklerobject
*self
)
4212 return do_append(self
, self
->stack
->length
- 1);
4217 load_appends(Unpicklerobject
*self
)
4219 return do_append(self
, marker(self
));
4224 do_setitems(Unpicklerobject
*self
, int x
)
4226 PyObject
*value
= 0, *key
= 0, *dict
= 0;
4229 if (!( (len
=self
->stack
->length
) >= x
4230 && x
> 0 )) return stackUnderflow();
4232 dict
=self
->stack
->data
[x
-1];
4234 for (i
= x
+1; i
< len
; i
+= 2) {
4235 key
=self
->stack
->data
[i
-1];
4236 value
=self
->stack
->data
[i
];
4237 if (PyObject_SetItem(dict
, key
, value
) < 0) {
4243 Pdata_clear(self
->stack
, x
);
4250 load_setitem(Unpicklerobject
*self
)
4252 return do_setitems(self
, self
->stack
->length
- 2);
4256 load_setitems(Unpicklerobject
*self
)
4258 return do_setitems(self
, marker(self
));
4263 load_build(Unpicklerobject
*self
)
4265 PyObject
*state
, *inst
, *slotstate
;
4266 PyObject
*__setstate__
;
4267 PyObject
*d_key
, *d_value
;
4271 /* Stack is ... instance, state. We want to leave instance at
4272 * the stack top, possibly mutated via instance.__setstate__(state).
4274 if (self
->stack
->length
< 2)
4275 return stackUnderflow();
4276 PDATA_POP(self
->stack
, state
);
4279 inst
= self
->stack
->data
[self
->stack
->length
- 1];
4281 __setstate__
= PyObject_GetAttr(inst
, __setstate___str
);
4282 if (__setstate__
!= NULL
) {
4283 PyObject
*junk
= NULL
;
4285 /* The explicit __setstate__ is responsible for everything. */
4286 ARG_TUP(self
, state
);
4288 junk
= PyObject_Call(__setstate__
, self
->arg
, NULL
);
4291 Py_DECREF(__setstate__
);
4297 if (!PyErr_ExceptionMatches(PyExc_AttributeError
))
4301 /* A default __setstate__. First see whether state embeds a
4302 * slot state dict too (a proto 2 addition).
4304 if (PyTuple_Check(state
) && PyTuple_Size(state
) == 2) {
4305 PyObject
*temp
= state
;
4306 state
= PyTuple_GET_ITEM(temp
, 0);
4307 slotstate
= PyTuple_GET_ITEM(temp
, 1);
4309 Py_INCREF(slotstate
);
4315 /* Set inst.__dict__ from the state dict (if any). */
4316 if (state
!= Py_None
) {
4318 if (! PyDict_Check(state
)) {
4319 PyErr_SetString(UnpicklingError
, "state is not a "
4323 dict
= PyObject_GetAttr(inst
, __dict___str
);
4328 while (PyDict_Next(state
, &i
, &d_key
, &d_value
)) {
4329 if (PyObject_SetItem(dict
, d_key
, d_value
) < 0)
4335 /* Also set instance attributes from the slotstate dict (if any). */
4336 if (slotstate
!= NULL
) {
4337 if (! PyDict_Check(slotstate
)) {
4338 PyErr_SetString(UnpicklingError
, "slot state is not "
4343 while (PyDict_Next(slotstate
, &i
, &d_key
, &d_value
)) {
4344 if (PyObject_SetAttr(inst
, d_key
, d_value
) < 0)
4352 Py_XDECREF(slotstate
);
4358 load_mark(Unpicklerobject
*self
)
4362 /* Note that we split the (pickle.py) stack into two stacks, an
4363 object stack and a mark stack. Here we push a mark onto the
4367 if ((self
->num_marks
+ 1) >= self
->marks_size
) {
4368 s
=self
->marks_size
+20;
4369 if (s
<= self
->num_marks
) s
=self
->num_marks
+ 1;
4370 if (self
->marks
== NULL
)
4371 self
->marks
=(int *)malloc(s
* sizeof(int));
4373 self
->marks
=(int *)realloc(self
->marks
,
4375 if (! self
->marks
) {
4379 self
->marks_size
= s
;
4382 self
->marks
[self
->num_marks
++] = self
->stack
->length
;
4388 load_reduce(Unpicklerobject
*self
)
4390 PyObject
*callable
= 0, *arg_tup
= 0, *ob
= 0;
4392 PDATA_POP(self
->stack
, arg_tup
);
4393 if (! arg_tup
) return -1;
4394 PDATA_POP(self
->stack
, callable
);
4396 ob
= Instance_New(callable
, arg_tup
);
4397 Py_DECREF(callable
);
4401 if (! ob
) return -1;
4403 PDATA_PUSH(self
->stack
, ob
, -1);
4407 /* Just raises an error if we don't know the protocol specified. PROTO
4408 * is the first opcode for protocols >= 2.
4411 load_proto(Unpicklerobject
*self
)
4416 i
= self
->read_func(self
, &protobyte
, 1);
4420 i
= calc_binint(protobyte
, 1);
4421 /* No point checking for < 0, since calc_binint returns an unsigned
4422 * int when chewing on 1 byte.
4425 if (i
<= HIGHEST_PROTOCOL
)
4428 PyErr_Format(PyExc_ValueError
, "unsupported pickle protocol: %d", i
);
4433 load(Unpicklerobject
*self
)
4435 PyObject
*err
= 0, *val
= 0;
4438 self
->num_marks
= 0;
4439 if (self
->stack
->length
) Pdata_clear(self
->stack
, 0);
4442 if (self
->read_func(self
, &s
, 1) < 0)
4447 if (load_none(self
) < 0)
4452 if (load_binint(self
) < 0)
4457 if (load_binint1(self
) < 0)
4462 if (load_binint2(self
) < 0)
4467 if (load_int(self
) < 0)
4472 if (load_long(self
) < 0)
4477 if (load_counted_long(self
, 1) < 0)
4482 if (load_counted_long(self
, 4) < 0)
4487 if (load_float(self
) < 0)
4492 if (load_binfloat(self
) < 0)
4497 if (load_binstring(self
) < 0)
4501 case SHORT_BINSTRING
:
4502 if (load_short_binstring(self
) < 0)
4507 if (load_string(self
) < 0)
4511 #ifdef Py_USING_UNICODE
4513 if (load_unicode(self
) < 0)
4518 if (load_binunicode(self
) < 0)
4524 if (load_counted_tuple(self
, 0) < 0)
4529 if (load_counted_tuple(self
, 1) < 0)
4534 if (load_counted_tuple(self
, 2) < 0)
4539 if (load_counted_tuple(self
, 3) < 0)
4544 if (load_tuple(self
) < 0)
4549 if (load_empty_list(self
) < 0)
4554 if (load_list(self
) < 0)
4559 if (load_empty_dict(self
) < 0)
4564 if (load_dict(self
) < 0)
4569 if (load_obj(self
) < 0)
4574 if (load_inst(self
) < 0)
4579 if (load_newobj(self
) < 0)
4584 if (load_global(self
) < 0)
4589 if (load_append(self
) < 0)
4594 if (load_appends(self
) < 0)
4599 if (load_build(self
) < 0)
4604 if (load_dup(self
) < 0)
4609 if (load_binget(self
) < 0)
4614 if (load_long_binget(self
) < 0)
4619 if (load_get(self
) < 0)
4624 if (load_extension(self
, 1) < 0)
4629 if (load_extension(self
, 2) < 0)
4634 if (load_extension(self
, 4) < 0)
4638 if (load_mark(self
) < 0)
4643 if (load_binput(self
) < 0)
4648 if (load_long_binput(self
) < 0)
4653 if (load_put(self
) < 0)
4658 if (load_pop(self
) < 0)
4663 if (load_pop_mark(self
) < 0)
4668 if (load_setitem(self
) < 0)
4673 if (load_setitems(self
) < 0)
4681 if (load_persid(self
) < 0)
4686 if (load_binpersid(self
) < 0)
4691 if (load_reduce(self
) < 0)
4696 if (load_proto(self
) < 0)
4701 if (load_bool(self
, Py_True
) < 0)
4706 if (load_bool(self
, Py_False
) < 0)
4712 PyErr_SetNone(PyExc_EOFError
);
4716 cPickle_ErrFormat(UnpicklingError
,
4717 "invalid load key, '%s'.",
4725 if ((err
= PyErr_Occurred())) {
4726 if (err
== PyExc_EOFError
) {
4727 PyErr_SetNone(PyExc_EOFError
);
4732 PDATA_POP(self
->stack
, val
);
4737 /* No-load functions to support noload, which is used to
4738 find persistent references. */
4741 noload_obj(Unpicklerobject
*self
)
4745 if ((i
= marker(self
)) < 0) return -1;
4746 return Pdata_clear(self
->stack
, i
+1);
4751 noload_inst(Unpicklerobject
*self
)
4756 if ((i
= marker(self
)) < 0) return -1;
4757 Pdata_clear(self
->stack
, i
);
4758 if (self
->readline_func(self
, &s
) < 0) return -1;
4759 if (self
->readline_func(self
, &s
) < 0) return -1;
4760 PDATA_APPEND(self
->stack
, Py_None
, -1);
4765 noload_newobj(Unpicklerobject
*self
)
4769 PDATA_POP(self
->stack
, obj
); /* pop argtuple */
4770 if (obj
== NULL
) return -1;
4773 PDATA_POP(self
->stack
, obj
); /* pop cls */
4774 if (obj
== NULL
) return -1;
4777 PDATA_APPEND(self
->stack
, Py_None
, -1);
4782 noload_global(Unpicklerobject
*self
)
4786 if (self
->readline_func(self
, &s
) < 0) return -1;
4787 if (self
->readline_func(self
, &s
) < 0) return -1;
4788 PDATA_APPEND(self
->stack
, Py_None
,-1);
4793 noload_reduce(Unpicklerobject
*self
)
4796 if (self
->stack
->length
< 2) return stackUnderflow();
4797 Pdata_clear(self
->stack
, self
->stack
->length
-2);
4798 PDATA_APPEND(self
->stack
, Py_None
,-1);
4803 noload_build(Unpicklerobject
*self
) {
4805 if (self
->stack
->length
< 1) return stackUnderflow();
4806 Pdata_clear(self
->stack
, self
->stack
->length
-1);
4811 noload_extension(Unpicklerobject
*self
, int nbytes
)
4815 assert(nbytes
== 1 || nbytes
== 2 || nbytes
== 4);
4816 if (self
->read_func(self
, &codebytes
, nbytes
) < 0) return -1;
4817 PDATA_APPEND(self
->stack
, Py_None
, -1);
4823 noload(Unpicklerobject
*self
)
4825 PyObject
*err
= 0, *val
= 0;
4828 self
->num_marks
= 0;
4829 Pdata_clear(self
->stack
, 0);
4832 if (self
->read_func(self
, &s
, 1) < 0)
4837 if (load_none(self
) < 0)
4842 if (load_binint(self
) < 0)
4847 if (load_binint1(self
) < 0)
4852 if (load_binint2(self
) < 0)
4857 if (load_int(self
) < 0)
4862 if (load_long(self
) < 0)
4867 if (load_counted_long(self
, 1) < 0)
4872 if (load_counted_long(self
, 4) < 0)
4877 if (load_float(self
) < 0)
4882 if (load_binfloat(self
) < 0)
4887 if (load_binstring(self
) < 0)
4891 case SHORT_BINSTRING
:
4892 if (load_short_binstring(self
) < 0)
4897 if (load_string(self
) < 0)
4901 #ifdef Py_USING_UNICODE
4903 if (load_unicode(self
) < 0)
4908 if (load_binunicode(self
) < 0)
4914 if (load_counted_tuple(self
, 0) < 0)
4919 if (load_counted_tuple(self
, 1) < 0)
4924 if (load_counted_tuple(self
, 2) < 0)
4929 if (load_counted_tuple(self
, 3) < 0)
4934 if (load_tuple(self
) < 0)
4939 if (load_empty_list(self
) < 0)
4944 if (load_list(self
) < 0)
4949 if (load_empty_dict(self
) < 0)
4954 if (load_dict(self
) < 0)
4959 if (noload_obj(self
) < 0)
4964 if (noload_inst(self
) < 0)
4969 if (noload_newobj(self
) < 0)
4974 if (noload_global(self
) < 0)
4979 if (load_append(self
) < 0)
4984 if (load_appends(self
) < 0)
4989 if (noload_build(self
) < 0)
4994 if (load_dup(self
) < 0)
4999 if (load_binget(self
) < 0)
5004 if (load_long_binget(self
) < 0)
5009 if (load_get(self
) < 0)
5014 if (noload_extension(self
, 1) < 0)
5019 if (noload_extension(self
, 2) < 0)
5024 if (noload_extension(self
, 4) < 0)
5029 if (load_mark(self
) < 0)
5034 if (load_binput(self
) < 0)
5039 if (load_long_binput(self
) < 0)
5044 if (load_put(self
) < 0)
5049 if (load_pop(self
) < 0)
5054 if (load_pop_mark(self
) < 0)
5059 if (load_setitem(self
) < 0)
5064 if (load_setitems(self
) < 0)
5072 if (load_persid(self
) < 0)
5077 if (load_binpersid(self
) < 0)
5082 if (noload_reduce(self
) < 0)
5087 if (load_proto(self
) < 0)
5092 if (load_bool(self
, Py_True
) < 0)
5097 if (load_bool(self
, Py_False
) < 0)
5101 cPickle_ErrFormat(UnpicklingError
,
5102 "invalid load key, '%s'.",
5110 if ((err
= PyErr_Occurred())) {
5111 if (err
== PyExc_EOFError
) {
5112 PyErr_SetNone(PyExc_EOFError
);
5117 PDATA_POP(self
->stack
, val
);
5123 Unpickler_load(Unpicklerobject
*self
, PyObject
*unused
)
5129 Unpickler_noload(Unpicklerobject
*self
, PyObject
*unused
)
5131 return noload(self
);
5135 static struct PyMethodDef Unpickler_methods
[] = {
5136 {"load", (PyCFunction
)Unpickler_load
, METH_NOARGS
,
5137 PyDoc_STR("load() -- Load a pickle")
5139 {"noload", (PyCFunction
)Unpickler_noload
, METH_NOARGS
,
5141 "noload() -- not load a pickle, but go through most of the motions\n"
5143 "This function can be used to read past a pickle without instantiating\n"
5144 "any objects or importing any modules. It can also be used to find all\n"
5145 "persistent references without instantiating any objects or importing\n"
5148 {NULL
, NULL
} /* sentinel */
5152 static Unpicklerobject
*
5153 newUnpicklerobject(PyObject
*f
)
5155 Unpicklerobject
*self
;
5157 if (!( self
= PyObject_GC_New(Unpicklerobject
, &Unpicklertype
)))
5162 self
->stack
= (Pdata
*)Pdata_New();
5163 self
->pers_func
= NULL
;
5164 self
->last_string
= NULL
;
5166 self
->num_marks
= 0;
5167 self
->marks_size
= 0;
5170 self
->readline
= NULL
;
5171 self
->find_class
= NULL
;
5173 if (!( self
->memo
= PyDict_New()))
5182 /* Set read, readline based on type of f */
5183 if (PyFile_Check(f
)) {
5184 self
->fp
= PyFile_AsFile(f
);
5185 if (self
->fp
== NULL
) {
5186 PyErr_SetString(PyExc_ValueError
,
5187 "I/O operation on closed file");
5190 self
->read_func
= read_file
;
5191 self
->readline_func
= readline_file
;
5193 else if (PycStringIO_InputCheck(f
)) {
5195 self
->read_func
= read_cStringIO
;
5196 self
->readline_func
= readline_cStringIO
;
5201 self
->read_func
= read_other
;
5202 self
->readline_func
= readline_other
;
5204 if (!( (self
->readline
= PyObject_GetAttr(f
, readline_str
)) &&
5205 (self
->read
= PyObject_GetAttr(f
, read_str
)))) {
5207 PyErr_SetString( PyExc_TypeError
,
5208 "argument must have 'read' and "
5209 "'readline' attributes" );
5213 PyObject_GC_Track(self
);
5218 Py_DECREF((PyObject
*)self
);
5224 get_Unpickler(PyObject
*self
, PyObject
*file
)
5226 return (PyObject
*)newUnpicklerobject(file
);
5231 Unpickler_dealloc(Unpicklerobject
*self
)
5233 PyObject_GC_UnTrack((PyObject
*)self
);
5234 Py_XDECREF(self
->readline
);
5235 Py_XDECREF(self
->read
);
5236 Py_XDECREF(self
->file
);
5237 Py_XDECREF(self
->memo
);
5238 Py_XDECREF(self
->stack
);
5239 Py_XDECREF(self
->pers_func
);
5240 Py_XDECREF(self
->arg
);
5241 Py_XDECREF(self
->last_string
);
5242 Py_XDECREF(self
->find_class
);
5248 if (self
->buf_size
) {
5252 self
->ob_type
->tp_free((PyObject
*)self
);
5256 Unpickler_traverse(Unpicklerobject
*self
, visitproc visit
, void *arg
)
5258 Py_VISIT(self
->readline
);
5259 Py_VISIT(self
->read
);
5260 Py_VISIT(self
->file
);
5261 Py_VISIT(self
->memo
);
5262 Py_VISIT(self
->stack
);
5263 Py_VISIT(self
->pers_func
);
5264 Py_VISIT(self
->arg
);
5265 Py_VISIT(self
->last_string
);
5266 Py_VISIT(self
->find_class
);
5271 Unpickler_clear(Unpicklerobject
*self
)
5273 Py_CLEAR(self
->readline
);
5274 Py_CLEAR(self
->read
);
5275 Py_CLEAR(self
->file
);
5276 Py_CLEAR(self
->memo
);
5277 Py_CLEAR(self
->stack
);
5278 Py_CLEAR(self
->pers_func
);
5279 Py_CLEAR(self
->arg
);
5280 Py_CLEAR(self
->last_string
);
5281 Py_CLEAR(self
->find_class
);
5286 Unpickler_getattr(Unpicklerobject
*self
, char *name
)
5288 if (!strcmp(name
, "persistent_load")) {
5289 if (!self
->pers_func
) {
5290 PyErr_SetString(PyExc_AttributeError
, name
);
5294 Py_INCREF(self
->pers_func
);
5295 return self
->pers_func
;
5298 if (!strcmp(name
, "find_global")) {
5299 if (!self
->find_class
) {
5300 PyErr_SetString(PyExc_AttributeError
, name
);
5304 Py_INCREF(self
->find_class
);
5305 return self
->find_class
;
5308 if (!strcmp(name
, "memo")) {
5310 PyErr_SetString(PyExc_AttributeError
, name
);
5314 Py_INCREF(self
->memo
);
5318 if (!strcmp(name
, "UnpicklingError")) {
5319 Py_INCREF(UnpicklingError
);
5320 return UnpicklingError
;
5323 return Py_FindMethod(Unpickler_methods
, (PyObject
*)self
, name
);
5328 Unpickler_setattr(Unpicklerobject
*self
, char *name
, PyObject
*value
)
5331 if (!strcmp(name
, "persistent_load")) {
5332 Py_XDECREF(self
->pers_func
);
5333 self
->pers_func
= value
;
5338 if (!strcmp(name
, "find_global")) {
5339 Py_XDECREF(self
->find_class
);
5340 self
->find_class
= value
;
5346 PyErr_SetString(PyExc_TypeError
,
5347 "attribute deletion is not supported");
5351 if (strcmp(name
, "memo") == 0) {
5352 if (!PyDict_Check(value
)) {
5353 PyErr_SetString(PyExc_TypeError
,
5354 "memo must be a dictionary");
5357 Py_XDECREF(self
->memo
);
5363 PyErr_SetString(PyExc_AttributeError
, name
);
5367 /* ---------------------------------------------------------------------------
5368 * Module-level functions.
5371 /* dump(obj, file, protocol=0). */
5373 cpm_dump(PyObject
*self
, PyObject
*args
, PyObject
*kwds
)
5375 static char *kwlist
[] = {"obj", "file", "protocol", NULL
};
5376 PyObject
*ob
, *file
, *res
= NULL
;
5377 Picklerobject
*pickler
= 0;
5380 if (!( PyArg_ParseTupleAndKeywords(args
, kwds
, "OO|i", kwlist
,
5381 &ob
, &file
, &proto
)))
5384 if (!( pickler
= newPicklerobject(file
, proto
)))
5387 if (dump(pickler
, ob
) < 0)
5394 Py_XDECREF(pickler
);
5400 /* dumps(obj, protocol=0). */
5402 cpm_dumps(PyObject
*self
, PyObject
*args
, PyObject
*kwds
)
5404 static char *kwlist
[] = {"obj", "protocol", NULL
};
5405 PyObject
*ob
, *file
= 0, *res
= NULL
;
5406 Picklerobject
*pickler
= 0;
5409 if (!( PyArg_ParseTupleAndKeywords(args
, kwds
, "O|i:dumps", kwlist
,
5413 if (!( file
= PycStringIO
->NewOutput(128)))
5416 if (!( pickler
= newPicklerobject(file
, proto
)))
5419 if (dump(pickler
, ob
) < 0)
5422 res
= PycStringIO
->cgetvalue(file
);
5425 Py_XDECREF(pickler
);
5432 /* load(fileobj). */
5434 cpm_load(PyObject
*self
, PyObject
*ob
)
5436 Unpicklerobject
*unpickler
= 0;
5437 PyObject
*res
= NULL
;
5439 if (!( unpickler
= newUnpicklerobject(ob
)))
5442 res
= load(unpickler
);
5445 Py_XDECREF(unpickler
);
5453 cpm_loads(PyObject
*self
, PyObject
*args
)
5455 PyObject
*ob
, *file
= 0, *res
= NULL
;
5456 Unpicklerobject
*unpickler
= 0;
5458 if (!( PyArg_ParseTuple(args
, "S:loads", &ob
)))
5461 if (!( file
= PycStringIO
->NewInput(ob
)))
5464 if (!( unpickler
= newUnpicklerobject(file
)))
5467 res
= load(unpickler
);
5471 Py_XDECREF(unpickler
);
5477 PyDoc_STRVAR(Unpicklertype__doc__
,
5478 "Objects that know how to unpickle");
5480 static PyTypeObject Unpicklertype
= {
5481 PyObject_HEAD_INIT(NULL
)
5483 "cPickle.Unpickler", /*tp_name*/
5484 sizeof(Unpicklerobject
), /*tp_basicsize*/
5486 (destructor
)Unpickler_dealloc
, /* tp_dealloc */
5488 (getattrfunc
)Unpickler_getattr
, /* tp_getattr */
5489 (setattrfunc
)Unpickler_setattr
, /* tp_setattr */
5492 0, /* tp_as_number */
5493 0, /* tp_as_sequence */
5494 0, /* tp_as_mapping */
5498 0, /* tp_getattro */
5499 0, /* tp_setattro */
5500 0, /* tp_as_buffer */
5501 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
| Py_TPFLAGS_HAVE_GC
,
5502 Unpicklertype__doc__
, /* tp_doc */
5503 (traverseproc
)Unpickler_traverse
, /* tp_traverse */
5504 (inquiry
)Unpickler_clear
, /* tp_clear */
5507 static struct PyMethodDef cPickle_methods
[] = {
5508 {"dump", (PyCFunction
)cpm_dump
, METH_VARARGS
| METH_KEYWORDS
,
5509 PyDoc_STR("dump(obj, file, protocol=0) -- "
5510 "Write an object in pickle format to the given file.\n"
5512 "See the Pickler docstring for the meaning of optional argument proto.")
5515 {"dumps", (PyCFunction
)cpm_dumps
, METH_VARARGS
| METH_KEYWORDS
,
5516 PyDoc_STR("dumps(obj, protocol=0) -- "
5517 "Return a string containing an object in pickle format.\n"
5519 "See the Pickler docstring for the meaning of optional argument proto.")
5522 {"load", (PyCFunction
)cpm_load
, METH_O
,
5523 PyDoc_STR("load(file) -- Load a pickle from the given file")},
5525 {"loads", (PyCFunction
)cpm_loads
, METH_VARARGS
,
5526 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
5528 {"Pickler", (PyCFunction
)get_Pickler
, METH_VARARGS
| METH_KEYWORDS
,
5529 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
5531 "This takes a file-like object for writing a pickle data stream.\n"
5532 "The optional proto argument tells the pickler to use the given\n"
5533 "protocol; supported protocols are 0, 1, 2. The default\n"
5534 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5535 "only protocol that can be written to a file opened in text\n"
5536 "mode and read back successfully. When using a protocol higher\n"
5537 "than 0, make sure the file is opened in binary mode, both when\n"
5538 "pickling and unpickling.)\n"
5540 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5541 "more efficient than protocol 1.\n"
5543 "Specifying a negative protocol version selects the highest\n"
5544 "protocol version supported. The higher the protocol used, the\n"
5545 "more recent the version of Python needed to read the pickle\n"
5548 "The file parameter must have a write() method that accepts a single\n"
5549 "string argument. It can thus be an open file object, a StringIO\n"
5550 "object, or any other custom object that meets this interface.\n")
5553 {"Unpickler", (PyCFunction
)get_Unpickler
, METH_O
,
5554 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5560 init_stuff(PyObject
*module_dict
)
5562 PyObject
*copy_reg
, *t
, *r
;
5564 #define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
5566 if (PyType_Ready(&Unpicklertype
) < 0)
5568 if (PyType_Ready(&Picklertype
) < 0)
5571 INIT_STR(__class__
);
5572 INIT_STR(__getinitargs__
);
5574 INIT_STR(__getstate__
);
5575 INIT_STR(__setstate__
);
5578 INIT_STR(__reduce__
);
5579 INIT_STR(__reduce_ex__
);
5585 INIT_STR(dispatch_table
);
5587 if (!( copy_reg
= PyImport_ImportModule("copy_reg")))
5590 /* This is special because we want to use a different
5591 one in restricted mode. */
5592 dispatch_table
= PyObject_GetAttr(copy_reg
, dispatch_table_str
);
5593 if (!dispatch_table
) return -1;
5595 extension_registry
= PyObject_GetAttrString(copy_reg
,
5596 "_extension_registry");
5597 if (!extension_registry
) return -1;
5599 inverted_registry
= PyObject_GetAttrString(copy_reg
,
5600 "_inverted_registry");
5601 if (!inverted_registry
) return -1;
5603 extension_cache
= PyObject_GetAttrString(copy_reg
,
5604 "_extension_cache");
5605 if (!extension_cache
) return -1;
5607 Py_DECREF(copy_reg
);
5609 if (!(empty_tuple
= PyTuple_New(0)))
5612 two_tuple
= PyTuple_New(2);
5613 if (two_tuple
== NULL
)
5615 /* We use this temp container with no regard to refcounts, or to
5616 * keeping containees alive. Exempt from GC, because we don't
5617 * want anything looking at two_tuple() by magic.
5619 PyObject_GC_UnTrack(two_tuple
);
5622 if (!( t
=PyImport_ImportModule("__builtin__"))) return -1;
5623 if (PyDict_SetItemString(module_dict
, "__builtins__", t
) < 0)
5626 if (!( t
=PyDict_New())) return -1;
5627 if (!( r
=PyRun_String(
5628 "def __str__(self):\n"
5629 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5631 module_dict
, t
) )) return -1;
5634 PickleError
= PyErr_NewException("cPickle.PickleError", NULL
, t
);
5640 PicklingError
= PyErr_NewException("cPickle.PicklingError",
5645 if (!( t
=PyDict_New())) return -1;
5646 if (!( r
=PyRun_String(
5647 "def __str__(self):\n"
5649 " a=a and type(a[0]) or '(what)'\n"
5650 " return 'Cannot pickle %s objects' % a\n"
5652 module_dict
, t
) )) return -1;
5655 if (!( UnpickleableError
= PyErr_NewException(
5656 "cPickle.UnpickleableError", PicklingError
, t
)))
5661 if (!( UnpicklingError
= PyErr_NewException("cPickle.UnpicklingError",
5662 PickleError
, NULL
)))
5665 if (!( BadPickleGet
= PyErr_NewException("cPickle.BadPickleGet",
5666 UnpicklingError
, NULL
)))
5669 if (PyDict_SetItemString(module_dict
, "PickleError",
5673 if (PyDict_SetItemString(module_dict
, "PicklingError",
5677 if (PyDict_SetItemString(module_dict
, "UnpicklingError",
5678 UnpicklingError
) < 0)
5681 if (PyDict_SetItemString(module_dict
, "UnpickleableError",
5682 UnpickleableError
) < 0)
5685 if (PyDict_SetItemString(module_dict
, "BadPickleGet",
5694 #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5695 #define PyMODINIT_FUNC void
5700 PyObject
*m
, *d
, *di
, *v
, *k
;
5702 char *rev
= "1.71"; /* XXX when does this change? */
5703 PyObject
*format_version
;
5704 PyObject
*compatible_formats
;
5706 Picklertype
.ob_type
= &PyType_Type
;
5707 Unpicklertype
.ob_type
= &PyType_Type
;
5708 PdataType
.ob_type
= &PyType_Type
;
5710 /* Initialize some pieces. We need to do this before module creation,
5711 * so we're forced to use a temporary dictionary. :(
5715 if (init_stuff(di
) < 0) return;
5717 /* Create the module and add the functions */
5718 m
= Py_InitModule4("cPickle", cPickle_methods
,
5719 cPickle_module_documentation
,
5720 (PyObject
*)NULL
,PYTHON_API_VERSION
);
5724 /* Add some symbolic constants to the module */
5725 d
= PyModule_GetDict(m
);
5726 v
= PyString_FromString(rev
);
5727 PyDict_SetItemString(d
, "__version__", v
);
5730 /* Copy data from di. Waaa. */
5731 for (i
=0; PyDict_Next(di
, &i
, &k
, &v
); ) {
5732 if (PyObject_SetItem(d
, k
, v
) < 0) {
5739 i
= PyModule_AddIntConstant(m
, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL
);
5743 /* These are purely informational; no code uses them. */
5744 /* File format version we write. */
5745 format_version
= PyString_FromString("2.0");
5746 /* Format versions we can read. */
5747 compatible_formats
= Py_BuildValue("[sssss]",
5748 "1.0", /* Original protocol 0 */
5749 "1.1", /* Protocol 0 + INST */
5750 "1.2", /* Original protocol 1 */
5751 "1.3", /* Protocol 1 + BINFLOAT */
5752 "2.0"); /* Original protocol 2 */
5753 PyDict_SetItemString(d
, "format_version", format_version
);
5754 PyDict_SetItemString(d
, "compatible_formats", compatible_formats
);
5755 Py_XDECREF(format_version
);
5756 Py_XDECREF(compatible_formats
);