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 * Note: The UNICODE macro controls the TCHAR meaning of the win32 API. Since
22 * all headers have already been included here, we can safely redefine it.
29 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
30 * docs are in pickletools.py.
50 #define SHORT_BINSTRING 'U'
52 #define BINUNICODE 'X'
57 #define EMPTY_DICT '}'
62 #define LONG_BINGET 'j'
64 #define EMPTY_LIST ']'
68 #define LONG_BINPUT 'r'
71 #define EMPTY_TUPLE ')'
75 #define PROTO '\x80' /* identify pickle protocol */
76 #define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
77 #define EXT1 '\x82' /* push object from extension registry; 1-byte index */
78 #define EXT2 '\x83' /* ditto, but 2-byte index */
79 #define EXT4 '\x84' /* ditto, but 4-byte index */
80 #define TUPLE1 '\x85' /* build 1-tuple from stack top */
81 #define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
82 #define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
83 #define NEWTRUE '\x88' /* push True */
84 #define NEWFALSE '\x89' /* push False */
85 #define LONG1 '\x8a' /* push long from < 256 bytes */
86 #define LONG4 '\x8b' /* push really big long */
88 /* There aren't opcodes -- they're ways to pickle bools before protocol 2,
89 * so that unpicklers written before bools were introduced unpickle them
90 * as ints, but unpicklers after can recognize that bools were intended.
91 * Note that protocol 2 added direct ways to pickle bools.
98 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
99 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
100 * break if this gets out of synch with pickle.py, but it's unclear that
101 * would help anything either.
103 #define BATCHSIZE 1000
105 static char MARKv
= MARK
;
107 static PyObject
*PickleError
;
108 static PyObject
*PicklingError
;
109 static PyObject
*UnpickleableError
;
110 static PyObject
*UnpicklingError
;
111 static PyObject
*BadPickleGet
;
113 /* As the name says, an empty tuple. */
114 static PyObject
*empty_tuple
;
116 /* copy_reg.dispatch_table, {type_object: pickling_function} */
117 static PyObject
*dispatch_table
;
119 /* For EXT[124] opcodes. */
120 /* copy_reg._extension_registry, {(module_name, function_name): code} */
121 static PyObject
*extension_registry
;
122 /* copy_reg._inverted_registry, {code: (module_name, function_name)} */
123 static PyObject
*inverted_registry
;
124 /* copy_reg._extension_cache, {code: object} */
125 static PyObject
*extension_cache
;
127 /* For looking up name pairs in copy_reg._extension_registry. */
128 static PyObject
*two_tuple
;
130 static PyObject
*__class___str
, *__getinitargs___str
, *__dict___str
,
131 *__getstate___str
, *__setstate___str
, *__name___str
, *__reduce___str
,
133 *write_str
, *append_str
,
134 *read_str
, *readline_str
, *__main___str
,
135 *copyreg_str
, *dispatch_table_str
;
137 /*************************************************************************
138 Internal Data type for pickle data. */
142 int length
; /* number of initial slots in data currently used */
143 int size
; /* number of slots in data allocated */
148 Pdata_dealloc(Pdata
*self
)
153 for (i
= self
->length
, p
= self
->data
; --i
>= 0; p
++) {
161 static PyTypeObject PdataType
= {
162 PyVarObject_HEAD_INIT(NULL
, 0) "cPickle.Pdata", sizeof(Pdata
), 0,
163 (destructor
)Pdata_dealloc
,
164 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
167 #define Pdata_Check(O) (Py_TYPE(O) == &PdataType)
174 if (!(self
= PyObject_New(Pdata
, &PdataType
)))
178 self
->data
= malloc(self
->size
* sizeof(PyObject
*));
180 return (PyObject
*)self
;
182 return PyErr_NoMemory();
188 PyErr_SetString(UnpicklingError
, "unpickling stack underflow");
192 /* Retain only the initial clearto items. If clearto >= the current
193 * number of items, this is a (non-erroneous) NOP.
196 Pdata_clear(Pdata
*self
, int clearto
)
201 if (clearto
< 0) return stackUnderflow();
202 if (clearto
>= self
->length
) return 0;
204 for (i
= self
->length
, p
= self
->data
+ clearto
;
209 self
->length
= clearto
;
215 Pdata_grow(Pdata
*self
)
221 bigger
= self
->size
<< 1;
222 if (bigger
<= 0) /* was 0, or new value overflows */
224 if ((int)(size_t)bigger
!= bigger
)
226 nbytes
= (size_t)bigger
* sizeof(PyObject
*);
227 if (nbytes
/ sizeof(PyObject
*) != (size_t)bigger
)
229 tmp
= realloc(self
->data
, nbytes
);
241 /* D is a Pdata*. Pop the topmost element and store it into V, which
242 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
243 * is raised and V is set to NULL. D and V may be evaluated several times.
245 #define PDATA_POP(D, V) { \
247 (V) = (D)->data[--((D)->length)]; \
249 PyErr_SetString(UnpicklingError, "bad pickle data"); \
254 /* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
255 * D. If the Pdata stack can't be grown to hold the new value, both
256 * raise MemoryError and execute "return ER". The difference is in ownership
257 * of O after: _PUSH transfers ownership of O from the caller to the stack
258 * (no incref of O is done, and in case of error O is decrefed), while
259 * _APPEND pushes a new reference.
262 /* Push O on stack D, giving ownership of O to the stack. */
263 #define PDATA_PUSH(D, O, ER) { \
264 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
265 Pdata_grow((Pdata*)(D)) < 0) { \
269 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
272 /* Push O on stack D, pushing a new reference. */
273 #define PDATA_APPEND(D, O, ER) { \
274 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
275 Pdata_grow((Pdata*)(D)) < 0) \
278 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
283 Pdata_popTuple(Pdata
*self
, int start
)
288 l
= self
->length
-start
;
292 for (i
= start
, j
= 0 ; j
< l
; i
++, j
++)
293 PyTuple_SET_ITEM(r
, j
, self
->data
[i
]);
295 self
->length
= start
;
300 Pdata_popList(Pdata
*self
, int start
)
305 l
=self
->length
-start
;
306 if (!( r
=PyList_New(l
))) return NULL
;
307 for (i
=start
, j
=0 ; j
< l
; i
++, j
++)
308 PyList_SET_ITEM(r
, j
, self
->data
[i
]);
314 /*************************************************************************/
316 #define ARG_TUP(self, o) { \
317 if (self->arg || (self->arg=PyTuple_New(1))) { \
318 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
319 PyTuple_SET_ITEM(self->arg,0,o); \
326 #define FREE_ARG_TUP(self) { \
327 if (Py_REFCNT(self->arg) > 1) { \
328 Py_DECREF(self->arg); \
333 typedef struct Picklerobject
{
341 PyObject
*inst_pers_func
;
343 /* pickle protocol number, >= 0 */
346 /* bool, true if proto > 0 */
349 int fast
; /* Fast mode doesn't save in memo, don't use if circ ref */
350 int (*write_func
)(struct Picklerobject
*, const char *, Py_ssize_t
);
353 PyObject
*dispatch_table
;
354 int fast_container
; /* count nested container dumps */
358 #ifndef PY_CPICKLE_FAST_LIMIT
359 #define PY_CPICKLE_FAST_LIMIT 50
362 static PyTypeObject Picklertype
;
364 typedef struct Unpicklerobject
{
375 PyObject
*last_string
;
379 Py_ssize_t (*read_func
)(struct Unpicklerobject
*, char **, Py_ssize_t
);
380 Py_ssize_t (*readline_func
)(struct Unpicklerobject
*, char **);
383 PyObject
*find_class
;
386 static PyTypeObject Unpicklertype
;
388 /* Forward decls that need the above structs */
389 static int save(Picklerobject
*, PyObject
*, int);
390 static int put2(Picklerobject
*, PyObject
*);
394 cPickle_ErrFormat(PyObject
*ErrType
, char *stringformat
, char *format
, ...)
397 PyObject
*args
=0, *retval
=0;
398 va_start(va
, format
);
400 if (format
) args
= Py_VaBuildValue(format
, va
);
402 if (format
&& ! args
) return NULL
;
403 if (stringformat
&& !(retval
=PyString_FromString(stringformat
)))
409 v
=PyString_Format(retval
, args
);
412 if (! v
) return NULL
;
417 if (args
) retval
=args
;
419 PyErr_SetObject(ErrType
,Py_None
);
422 PyErr_SetObject(ErrType
,retval
);
428 write_file(Picklerobject
*self
, const char *s
, Py_ssize_t n
)
430 size_t nbyteswritten
;
437 /* String too large */
441 PyFile_IncUseCount((PyFileObject
*)self
->file
);
442 Py_BEGIN_ALLOW_THREADS
443 nbyteswritten
= fwrite(s
, sizeof(char), n
, self
->fp
);
445 PyFile_DecUseCount((PyFileObject
*)self
->file
);
446 if (nbyteswritten
!= (size_t)n
) {
447 PyErr_SetFromErrno(PyExc_IOError
);
455 write_cStringIO(Picklerobject
*self
, const char *s
, Py_ssize_t n
)
461 if (PycStringIO
->cwrite((PyObject
*)self
->file
, s
, n
) != n
) {
469 write_none(Picklerobject
*self
, const char *s
, Py_ssize_t n
)
471 if (s
== NULL
) return 0;
472 if (n
> INT_MAX
) return -1;
477 write_other(Picklerobject
*self
, const char *s
, Py_ssize_t _n
)
479 PyObject
*py_str
= 0, *junk
= 0;
486 if (!( self
->buf_size
)) return 0;
487 py_str
= PyString_FromStringAndSize(self
->write_buf
,
493 if (self
->buf_size
&& (n
+ self
->buf_size
) > WRITE_BUF_SIZE
) {
494 if (write_other(self
, NULL
, 0) < 0)
498 if (n
> WRITE_BUF_SIZE
) {
500 PyString_FromStringAndSize(s
, n
)))
504 memcpy(self
->write_buf
+ self
->buf_size
, s
, n
);
511 /* object with write method */
512 ARG_TUP(self
, py_str
);
514 junk
= PyObject_Call(self
->write
, self
->arg
, NULL
);
517 if (junk
) Py_DECREF(junk
);
521 PDATA_PUSH(self
->file
, py_str
, -1);
529 read_file(Unpicklerobject
*self
, char **s
, Py_ssize_t n
)
533 if (self
->buf_size
== 0) {
536 size
= ((n
< 32) ? 32 : n
);
537 if (!( self
->buf
= (char *)malloc(size
))) {
542 self
->buf_size
= size
;
544 else if (n
> self
->buf_size
) {
545 char *newbuf
= (char *)realloc(self
->buf
, n
);
554 PyFile_IncUseCount((PyFileObject
*)self
->file
);
555 Py_BEGIN_ALLOW_THREADS
556 nbytesread
= fread(self
->buf
, sizeof(char), n
, self
->fp
);
558 PyFile_DecUseCount((PyFileObject
*)self
->file
);
559 if (nbytesread
!= (size_t)n
) {
560 if (feof(self
->fp
)) {
561 PyErr_SetNone(PyExc_EOFError
);
565 PyErr_SetFromErrno(PyExc_IOError
);
576 readline_file(Unpicklerobject
*self
, char **s
)
580 if (self
->buf_size
== 0) {
581 if (!( self
->buf
= (char *)malloc(40))) {
592 for (; i
< (self
->buf_size
- 1); i
++) {
593 if (feof(self
->fp
) ||
594 (self
->buf
[i
] = getc(self
->fp
)) == '\n') {
595 self
->buf
[i
+ 1] = '\0';
600 bigger
= self
->buf_size
<< 1;
601 if (bigger
<= 0) { /* overflow */
605 newbuf
= (char *)realloc(self
->buf
, bigger
);
611 self
->buf_size
= bigger
;
617 read_cStringIO(Unpicklerobject
*self
, char **s
, Py_ssize_t n
)
621 if (PycStringIO
->cread((PyObject
*)self
->file
, &ptr
, n
) != n
) {
622 PyErr_SetNone(PyExc_EOFError
);
633 readline_cStringIO(Unpicklerobject
*self
, char **s
)
638 if ((n
= PycStringIO
->creadline((PyObject
*)self
->file
, &ptr
)) < 0) {
649 read_other(Unpicklerobject
*self
, char **s
, Py_ssize_t n
)
651 PyObject
*bytes
, *str
=0;
653 if (!( bytes
= PyInt_FromSsize_t(n
))) return -1;
655 ARG_TUP(self
, bytes
);
657 str
= PyObject_Call(self
->read
, self
->arg
, NULL
);
660 if (! str
) return -1;
662 Py_XDECREF(self
->last_string
);
663 self
->last_string
= str
;
665 if (! (*s
= PyString_AsString(str
))) return -1;
671 readline_other(Unpicklerobject
*self
, char **s
)
676 if (!( str
= PyObject_CallObject(self
->readline
, empty_tuple
))) {
680 if ((str_size
= PyString_Size(str
)) < 0)
683 Py_XDECREF(self
->last_string
);
684 self
->last_string
= str
;
686 if (! (*s
= PyString_AsString(str
)))
692 /* Copy the first n bytes from s into newly malloc'ed memory, plus a
693 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
694 * The caller is responsible for free()'ing the return value.
697 pystrndup(const char *s
, int n
)
699 char *r
= (char *)malloc(n
+1);
701 return (char*)PyErr_NoMemory();
709 get(Picklerobject
*self
, PyObject
*id
)
711 PyObject
*value
, *mv
;
716 if (!( mv
= PyDict_GetItem(self
->memo
, id
))) {
717 PyErr_SetObject(PyExc_KeyError
, id
);
721 if (!( value
= PyTuple_GetItem(mv
, 0)))
724 if (!( PyInt_Check(value
))) {
725 PyErr_SetString(PicklingError
, "no int where int expected in memo");
728 c_value
= PyInt_AS_LONG((PyIntObject
*)value
);
732 PyOS_snprintf(s
+ 1, sizeof(s
) - 1, "%ld\n", c_value
);
735 else if (Pdata_Check(self
->file
)) {
736 if (write_other(self
, NULL
, 0) < 0) return -1;
737 PDATA_APPEND(self
->file
, mv
, -1);
743 s
[1] = (int)(c_value
& 0xff);
748 s
[1] = (int)(c_value
& 0xff);
749 s
[2] = (int)((c_value
>> 8) & 0xff);
750 s
[3] = (int)((c_value
>> 16) & 0xff);
751 s
[4] = (int)((c_value
>> 24) & 0xff);
756 if (self
->write_func(self
, s
, len
) < 0)
764 put(Picklerobject
*self
, PyObject
*ob
)
766 if (Py_REFCNT(ob
) < 2 || self
->fast
)
769 return put2(self
, ob
);
774 put2(Picklerobject
*self
, PyObject
*ob
)
780 PyObject
*py_ob_id
= 0, *memo_len
= 0, *t
= 0;
785 if ((p
= PyDict_Size(self
->memo
)) < 0)
788 /* Make sure memo keys are positive! */
790 * XXX And does "positive" really mean non-negative?
791 * XXX pickle.py starts with PUT index 0, not 1. This makes for
792 * XXX gratuitous differences between the pickling modules.
796 if (!( py_ob_id
= PyLong_FromVoidPtr(ob
)))
799 if (!( memo_len
= PyInt_FromLong(p
)))
802 if (!( t
= PyTuple_New(2)))
805 PyTuple_SET_ITEM(t
, 0, memo_len
);
807 PyTuple_SET_ITEM(t
, 1, ob
);
810 if (PyDict_SetItem(self
->memo
, py_ob_id
, t
) < 0)
815 PyOS_snprintf(c_str
+ 1, sizeof(c_str
) - 1, "%d\n", p
);
818 else if (Pdata_Check(self
->file
)) {
819 if (write_other(self
, NULL
, 0) < 0) return -1;
820 PDATA_APPEND(self
->file
, memo_len
, -1);
821 res
=0; /* Job well done ;) */
826 c_str
[0] = LONG_BINPUT
;
827 c_str
[1] = (int)(p
& 0xff);
828 c_str
[2] = (int)((p
>> 8) & 0xff);
829 c_str
[3] = (int)((p
>> 16) & 0xff);
830 c_str
[4] = (int)((p
>> 24) & 0xff);
840 if (self
->write_func(self
, c_str
, len
) < 0)
846 Py_XDECREF(py_ob_id
);
847 Py_XDECREF(memo_len
);
854 whichmodule(PyObject
*global
, PyObject
*global_name
)
857 PyObject
*module
= 0, *modules_dict
= 0,
858 *global_name_attr
= 0, *name
= 0;
860 module
= PyObject_GetAttrString(global
, "__module__");
863 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
868 if (!( modules_dict
= PySys_GetObject("modules")))
872 while ((j
= PyDict_Next(modules_dict
, &i
, &name
, &module
))) {
874 if (PyObject_Compare(name
, __main___str
)==0) continue;
876 global_name_attr
= PyObject_GetAttr(module
, global_name
);
877 if (!global_name_attr
) {
878 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
885 if (global_name_attr
!= global
) {
886 Py_DECREF(global_name_attr
);
890 Py_DECREF(global_name_attr
);
895 /* The following implements the rule in pickle.py added in 1.5
896 that used __main__ if no module is found. I don't actually
910 fast_save_enter(Picklerobject
*self
, PyObject
*obj
)
912 /* if fast_container < 0, we're doing an error exit. */
913 if (++self
->fast_container
>= PY_CPICKLE_FAST_LIMIT
) {
914 PyObject
*key
= NULL
;
915 if (self
->fast_memo
== NULL
) {
916 self
->fast_memo
= PyDict_New();
917 if (self
->fast_memo
== NULL
) {
918 self
->fast_container
= -1;
922 key
= PyLong_FromVoidPtr(obj
);
925 if (PyDict_GetItem(self
->fast_memo
, key
)) {
927 PyErr_Format(PyExc_ValueError
,
928 "fast mode: can't pickle cyclic objects "
929 "including object type %s at %p",
930 Py_TYPE(obj
)->tp_name
, obj
);
931 self
->fast_container
= -1;
934 if (PyDict_SetItem(self
->fast_memo
, key
, Py_None
) < 0) {
936 self
->fast_container
= -1;
945 fast_save_leave(Picklerobject
*self
, PyObject
*obj
)
947 if (self
->fast_container
-- >= PY_CPICKLE_FAST_LIMIT
) {
948 PyObject
*key
= PyLong_FromVoidPtr(obj
);
951 if (PyDict_DelItem(self
->fast_memo
, key
) < 0) {
961 save_none(Picklerobject
*self
, PyObject
*args
)
963 static char none
= NONE
;
964 if (self
->write_func(self
, &none
, 1) < 0)
971 save_bool(Picklerobject
*self
, PyObject
*args
)
973 static const char *buf
[2] = {FALSE
, TRUE
};
974 static char len
[2] = {sizeof(FALSE
)-1, sizeof(TRUE
)-1};
975 long l
= PyInt_AS_LONG((PyIntObject
*)args
);
977 if (self
->proto
>= 2) {
978 char opcode
= l
? NEWTRUE
: NEWFALSE
;
979 if (self
->write_func(self
, &opcode
, 1) < 0)
982 else if (self
->write_func(self
, buf
[l
], len
[l
]) < 0)
988 save_int(Picklerobject
*self
, PyObject
*args
)
991 long l
= PyInt_AS_LONG((PyIntObject
*)args
);
1000 /* Text-mode pickle, or long too big to fit in the 4-byte
1001 * signed BININT format: store as a string.
1004 PyOS_snprintf(c_str
+ 1, sizeof(c_str
) - 1, "%ld\n", l
);
1005 if (self
->write_func(self
, c_str
, strlen(c_str
)) < 0)
1009 /* Binary pickle and l fits in a signed 4-byte int. */
1010 c_str
[1] = (int)( l
& 0xff);
1011 c_str
[2] = (int)((l
>> 8) & 0xff);
1012 c_str
[3] = (int)((l
>> 16) & 0xff);
1013 c_str
[4] = (int)((l
>> 24) & 0xff);
1015 if ((c_str
[4] == 0) && (c_str
[3] == 0)) {
1016 if (c_str
[2] == 0) {
1030 if (self
->write_func(self
, c_str
, len
) < 0)
1039 save_long(Picklerobject
*self
, PyObject
*args
)
1043 PyObject
*repr
= NULL
;
1045 static char l
= LONG
;
1047 if (self
->proto
>= 2) {
1048 /* Linear-time pickling. */
1051 unsigned char *pdata
;
1054 int sign
= _PyLong_Sign(args
);
1057 /* It's 0 -- an empty bytestring. */
1060 i
= self
->write_func(self
, c_str
, 2);
1061 if (i
< 0) goto finally
;
1065 nbits
= _PyLong_NumBits(args
);
1066 if (nbits
== (size_t)-1 && PyErr_Occurred())
1068 /* How many bytes do we need? There are nbits >> 3 full
1069 * bytes of data, and nbits & 7 leftover bits. If there
1070 * are any leftover bits, then we clearly need another
1071 * byte. Wnat's not so obvious is that we *probably*
1072 * need another byte even if there aren't any leftovers:
1073 * the most-significant bit of the most-significant byte
1074 * acts like a sign bit, and it's usually got a sense
1075 * opposite of the one we need. The exception is longs
1076 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1077 * its own 256's-complement, so has the right sign bit
1078 * even without the extra byte. That's a pain to check
1079 * for in advance, though, so we always grab an extra
1080 * byte at the start, and cut it back later if possible.
1082 nbytes
= (nbits
>> 3) + 1;
1083 if (nbytes
> INT_MAX
) {
1084 PyErr_SetString(PyExc_OverflowError
, "long too large "
1088 repr
= PyString_FromStringAndSize(NULL
, (int)nbytes
);
1089 if (repr
== NULL
) goto finally
;
1090 pdata
= (unsigned char *)PyString_AS_STRING(repr
);
1091 i
= _PyLong_AsByteArray((PyLongObject
*)args
,
1093 1 /* little endian */, 1 /* signed */);
1094 if (i
< 0) goto finally
;
1095 /* If the long is negative, this may be a byte more than
1096 * needed. This is so iff the MSB is all redundant sign
1099 if (sign
< 0 && nbytes
> 1 && pdata
[nbytes
- 1] == 0xff &&
1100 (pdata
[nbytes
- 2] & 0x80) != 0)
1105 c_str
[1] = (char)nbytes
;
1111 for (i
= 1; i
< 5; i
++) {
1112 c_str
[i
] = (char)(size
& 0xff);
1117 i
= self
->write_func(self
, c_str
, size
);
1118 if (i
< 0) goto finally
;
1119 i
= self
->write_func(self
, (char *)pdata
, (int)nbytes
);
1120 if (i
< 0) goto finally
;
1125 /* proto < 2: write the repr and newline. This is quadratic-time
1126 * (in the number of digits), in both directions.
1128 if (!( repr
= PyObject_Repr(args
)))
1131 if ((size
= PyString_Size(repr
)) < 0)
1134 if (self
->write_func(self
, &l
, 1) < 0)
1137 if (self
->write_func(self
,
1138 PyString_AS_STRING((PyStringObject
*)repr
),
1142 if (self
->write_func(self
, "\n", 1) < 0)
1154 save_float(Picklerobject
*self
, PyObject
*args
)
1156 double x
= PyFloat_AS_DOUBLE((PyFloatObject
*)args
);
1161 if (_PyFloat_Pack8(x
, (unsigned char *)&str
[1], 0) < 0)
1163 if (self
->write_func(self
, str
, 9) < 0)
1169 PyOS_ascii_formatd(c_str
+ 1, sizeof(c_str
) - 2, "%.17g", x
);
1170 /* Extend the formatted string with a newline character */
1171 strcat(c_str
, "\n");
1173 if (self
->write_func(self
, c_str
, strlen(c_str
)) < 0)
1182 save_string(Picklerobject
*self
, PyObject
*args
, int doput
)
1187 if ((size
= PyString_Size(args
)) < 0)
1193 static char string
= STRING
;
1195 if (!( repr
= PyObject_Repr(args
)))
1198 if ((len
= PyString_Size(repr
)) < 0)
1200 repr_str
= PyString_AS_STRING((PyStringObject
*)repr
);
1202 if (self
->write_func(self
, &string
, 1) < 0)
1205 if (self
->write_func(self
, repr_str
, len
) < 0)
1208 if (self
->write_func(self
, "\n", 1) < 0)
1217 if ((size
= PyString_Size(args
)) < 0)
1221 c_str
[0] = SHORT_BINSTRING
;
1225 else if (size
<= INT_MAX
) {
1226 c_str
[0] = BINSTRING
;
1227 for (i
= 1; i
< 5; i
++)
1228 c_str
[i
] = (int)(size
>> ((i
- 1) * 8));
1232 return -1; /* string too large */
1234 if (self
->write_func(self
, c_str
, len
) < 0)
1237 if (size
> 128 && Pdata_Check(self
->file
)) {
1238 if (write_other(self
, NULL
, 0) < 0) return -1;
1239 PDATA_APPEND(self
->file
, args
, -1);
1242 if (self
->write_func(self
,
1244 (PyStringObject
*)args
),
1251 if (put(self
, args
) < 0)
1262 #ifdef Py_USING_UNICODE
1263 /* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1264 backslash and newline characters to \uXXXX escapes. */
1266 modified_EncodeRawUnicodeEscape(const Py_UNICODE
*s
, Py_ssize_t size
)
1272 static const char *hexdigit
= "0123456789abcdef";
1273 #ifdef Py_UNICODE_WIDE
1274 const Py_ssize_t expandsize
= 10;
1276 const Py_ssize_t expandsize
= 6;
1279 if (size
> PY_SSIZE_T_MAX
/ expandsize
)
1280 return PyErr_NoMemory();
1282 repr
= PyString_FromStringAndSize(NULL
, expandsize
* size
);
1288 p
= q
= PyString_AS_STRING(repr
);
1289 while (size
-- > 0) {
1290 Py_UNICODE ch
= *s
++;
1291 #ifdef Py_UNICODE_WIDE
1292 /* Map 32-bit characters to '\Uxxxxxxxx' */
1293 if (ch
>= 0x10000) {
1296 *p
++ = hexdigit
[(ch
>> 28) & 0xf];
1297 *p
++ = hexdigit
[(ch
>> 24) & 0xf];
1298 *p
++ = hexdigit
[(ch
>> 20) & 0xf];
1299 *p
++ = hexdigit
[(ch
>> 16) & 0xf];
1300 *p
++ = hexdigit
[(ch
>> 12) & 0xf];
1301 *p
++ = hexdigit
[(ch
>> 8) & 0xf];
1302 *p
++ = hexdigit
[(ch
>> 4) & 0xf];
1303 *p
++ = hexdigit
[ch
& 15];
1307 /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */
1308 if (ch
>= 0xD800 && ch
< 0xDC00) {
1314 if (ch2
>= 0xDC00 && ch2
<= 0xDFFF) {
1315 ucs
= (((ch
& 0x03FF) << 10) | (ch2
& 0x03FF)) + 0x00010000;
1318 *p
++ = hexdigit
[(ucs
>> 28) & 0xf];
1319 *p
++ = hexdigit
[(ucs
>> 24) & 0xf];
1320 *p
++ = hexdigit
[(ucs
>> 20) & 0xf];
1321 *p
++ = hexdigit
[(ucs
>> 16) & 0xf];
1322 *p
++ = hexdigit
[(ucs
>> 12) & 0xf];
1323 *p
++ = hexdigit
[(ucs
>> 8) & 0xf];
1324 *p
++ = hexdigit
[(ucs
>> 4) & 0xf];
1325 *p
++ = hexdigit
[ucs
& 0xf];
1328 /* Fall through: isolated surrogates are copied as-is */
1333 /* Map 16-bit characters to '\uxxxx' */
1334 if (ch
>= 256 || ch
== '\\' || ch
== '\n') {
1337 *p
++ = hexdigit
[(ch
>> 12) & 0xf];
1338 *p
++ = hexdigit
[(ch
>> 8) & 0xf];
1339 *p
++ = hexdigit
[(ch
>> 4) & 0xf];
1340 *p
++ = hexdigit
[ch
& 15];
1342 /* Copy everything else as-is */
1347 _PyString_Resize(&repr
, p
- q
);
1352 save_unicode(Picklerobject
*self
, PyObject
*args
, int doput
)
1354 Py_ssize_t size
, len
;
1357 if (!PyUnicode_Check(args
))
1362 static char string
= UNICODE
;
1364 repr
= modified_EncodeRawUnicodeEscape(
1365 PyUnicode_AS_UNICODE(args
), PyUnicode_GET_SIZE(args
));
1369 if ((len
= PyString_Size(repr
)) < 0)
1371 repr_str
= PyString_AS_STRING((PyStringObject
*)repr
);
1373 if (self
->write_func(self
, &string
, 1) < 0)
1376 if (self
->write_func(self
, repr_str
, len
) < 0)
1379 if (self
->write_func(self
, "\n", 1) < 0)
1388 if (!( repr
= PyUnicode_AsUTF8String(args
)))
1391 if ((size
= PyString_Size(repr
)) < 0)
1394 return -1; /* string too large */
1396 c_str
[0] = BINUNICODE
;
1397 for (i
= 1; i
< 5; i
++)
1398 c_str
[i
] = (int)(size
>> ((i
- 1) * 8));
1401 if (self
->write_func(self
, c_str
, len
) < 0)
1404 if (size
> 128 && Pdata_Check(self
->file
)) {
1405 if (write_other(self
, NULL
, 0) < 0)
1407 PDATA_APPEND(self
->file
, repr
, -1);
1410 if (self
->write_func(self
, PyString_AS_STRING(repr
),
1419 if (put(self
, args
) < 0)
1430 /* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1432 store_tuple_elements(Picklerobject
*self
, PyObject
*t
, int len
)
1435 int res
= -1; /* guilty until proved innocent */
1437 assert(PyTuple_Size(t
) == len
);
1439 for (i
= 0; i
< len
; i
++) {
1440 PyObject
*element
= PyTuple_GET_ITEM(t
, i
);
1442 if (element
== NULL
)
1444 if (save(self
, element
, 0) < 0)
1453 /* Tuples are ubiquitous in the pickle protocols, so many techniques are
1454 * used across protocols to minimize the space needed to pickle them.
1455 * Tuples are also the only builtin immutable type that can be recursive
1456 * (a tuple can be reached from itself), and that requires some subtle
1457 * magic so that it works in all cases. IOW, this is a long routine.
1460 save_tuple(Picklerobject
*self
, PyObject
*args
)
1462 PyObject
*py_tuple_id
= NULL
;
1466 static char tuple
= TUPLE
;
1467 static char pop
= POP
;
1468 static char pop_mark
= POP_MARK
;
1469 static char len2opcode
[] = {EMPTY_TUPLE
, TUPLE1
, TUPLE2
, TUPLE3
};
1471 if ((len
= PyTuple_Size(args
)) < 0)
1478 c_str
[0] = EMPTY_TUPLE
;
1486 if (self
->write_func(self
, c_str
, len
) >= 0)
1488 /* Don't memoize an empty tuple. */
1492 /* A non-empty tuple. */
1494 /* id(tuple) isn't in the memo now. If it shows up there after
1495 * saving the tuple elements, the tuple must be recursive, in
1496 * which case we'll pop everything we put on the stack, and fetch
1497 * its value from the memo.
1499 py_tuple_id
= PyLong_FromVoidPtr(args
);
1500 if (py_tuple_id
== NULL
)
1503 if (len
<= 3 && self
->proto
>= 2) {
1504 /* Use TUPLE{1,2,3} opcodes. */
1505 if (store_tuple_elements(self
, args
, len
) < 0)
1507 if (PyDict_GetItem(self
->memo
, py_tuple_id
)) {
1508 /* pop the len elements */
1509 for (i
= 0; i
< len
; ++i
)
1510 if (self
->write_func(self
, &pop
, 1) < 0)
1512 /* fetch from memo */
1513 if (get(self
, py_tuple_id
) < 0)
1518 /* Not recursive. */
1519 if (self
->write_func(self
, len2opcode
+ len
, 1) < 0)
1524 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1525 * Generate MARK elt1 elt2 ... TUPLE
1527 if (self
->write_func(self
, &MARKv
, 1) < 0)
1530 if (store_tuple_elements(self
, args
, len
) < 0)
1533 if (PyDict_GetItem(self
->memo
, py_tuple_id
)) {
1534 /* pop the stack stuff we pushed */
1536 if (self
->write_func(self
, &pop_mark
, 1) < 0)
1540 /* Note that we pop one more than len, to remove
1543 for (i
= 0; i
<= len
; i
++)
1544 if (self
->write_func(self
, &pop
, 1) < 0)
1547 /* fetch from memo */
1548 if (get(self
, py_tuple_id
) >= 0)
1553 /* Not recursive. */
1554 if (self
->write_func(self
, &tuple
, 1) < 0)
1558 if (put(self
, args
) >= 0)
1562 Py_XDECREF(py_tuple_id
);
1566 /* iter is an iterator giving items, and we batch up chunks of
1567 * MARK item item ... item APPENDS
1568 * opcode sequences. Calling code should have arranged to first create an
1569 * empty list, or list-like object, for the APPENDS to operate on.
1570 * Returns 0 on success, <0 on error.
1573 batch_list(Picklerobject
*self
, PyObject
*iter
)
1575 PyObject
*obj
= NULL
;
1576 PyObject
*firstitem
= NULL
;
1579 static char append
= APPEND
;
1580 static char appends
= APPENDS
;
1582 assert(iter
!= NULL
);
1584 if (self
->proto
== 0) {
1585 /* APPENDS isn't available; do one at a time. */
1587 obj
= PyIter_Next(iter
);
1589 if (PyErr_Occurred())
1593 i
= save(self
, obj
, 0);
1597 if (self
->write_func(self
, &append
, 1) < 0)
1603 /* proto > 0: write in batches of BATCHSIZE. */
1605 /* Get first item */
1606 firstitem
= PyIter_Next(iter
);
1607 if (firstitem
== NULL
) {
1608 if (PyErr_Occurred())
1611 /* nothing more to add */
1615 /* Try to get a second item */
1616 obj
= PyIter_Next(iter
);
1618 if (PyErr_Occurred())
1621 /* Only one item to write */
1622 if (save(self
, firstitem
, 0) < 0)
1624 if (self
->write_func(self
, &append
, 1) < 0)
1626 Py_CLEAR(firstitem
);
1630 /* More than one item to write */
1632 /* Pump out MARK, items, APPENDS. */
1633 if (self
->write_func(self
, &MARKv
, 1) < 0)
1636 if (save(self
, firstitem
, 0) < 0)
1638 Py_CLEAR(firstitem
);
1641 /* Fetch and save up to BATCHSIZE items */
1643 if (save(self
, obj
, 0) < 0)
1651 obj
= PyIter_Next(iter
);
1653 if (PyErr_Occurred())
1659 if (self
->write_func(self
, &appends
, 1) < 0)
1662 } while (n
== BATCHSIZE
);
1666 Py_XDECREF(firstitem
);
1672 save_list(Picklerobject
*self
, PyObject
*args
)
1679 if (self
->fast
&& !fast_save_enter(self
, args
))
1682 /* Create an empty list. */
1693 if (self
->write_func(self
, s
, len
) < 0)
1696 /* Get list length, and bow out early if empty. */
1697 if ((len
= PyList_Size(args
)) < 0)
1702 if (put(self
, args
) >= 0)
1706 if (put2(self
, args
) < 0)
1709 /* Materialize the list elements. */
1710 iter
= PyObject_GetIter(args
);
1714 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1716 res
= batch_list(self
, iter
);
1717 Py_LeaveRecursiveCall();
1722 if (self
->fast
&& !fast_save_leave(self
, args
))
1729 /* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1730 * MARK key value ... key value SETITEMS
1731 * opcode sequences. Calling code should have arranged to first create an
1732 * empty dict, or dict-like object, for the SETITEMS to operate on.
1733 * Returns 0 on success, <0 on error.
1735 * This is very much like batch_list(). The difference between saving
1736 * elements directly, and picking apart two-tuples, is so long-winded at
1737 * the C level, though, that attempts to combine these routines were too
1741 batch_dict(Picklerobject
*self
, PyObject
*iter
)
1744 PyObject
*firstitem
= NULL
;
1747 static char setitem
= SETITEM
;
1748 static char setitems
= SETITEMS
;
1750 assert(iter
!= NULL
);
1752 if (self
->proto
== 0) {
1753 /* SETITEMS isn't available; do one at a time. */
1755 p
= PyIter_Next(iter
);
1757 if (PyErr_Occurred())
1761 if (!PyTuple_Check(p
) || PyTuple_Size(p
) != 2) {
1762 PyErr_SetString(PyExc_TypeError
, "dict items "
1763 "iterator must return 2-tuples");
1766 i
= save(self
, PyTuple_GET_ITEM(p
, 0), 0);
1768 i
= save(self
, PyTuple_GET_ITEM(p
, 1), 0);
1772 if (self
->write_func(self
, &setitem
, 1) < 0)
1778 /* proto > 0: write in batches of BATCHSIZE. */
1780 /* Get first item */
1781 firstitem
= PyIter_Next(iter
);
1782 if (firstitem
== NULL
) {
1783 if (PyErr_Occurred())
1786 /* nothing more to add */
1789 if (!PyTuple_Check(firstitem
) || PyTuple_Size(firstitem
) != 2) {
1790 PyErr_SetString(PyExc_TypeError
, "dict items "
1791 "iterator must return 2-tuples");
1795 /* Try to get a second item */
1796 p
= PyIter_Next(iter
);
1798 if (PyErr_Occurred())
1801 /* Only one item to write */
1802 if (save(self
, PyTuple_GET_ITEM(firstitem
, 0), 0) < 0)
1804 if (save(self
, PyTuple_GET_ITEM(firstitem
, 1), 0) < 0)
1806 if (self
->write_func(self
, &setitem
, 1) < 0)
1808 Py_CLEAR(firstitem
);
1812 /* More than one item to write */
1814 /* Pump out MARK, items, SETITEMS. */
1815 if (self
->write_func(self
, &MARKv
, 1) < 0)
1818 if (save(self
, PyTuple_GET_ITEM(firstitem
, 0), 0) < 0)
1820 if (save(self
, PyTuple_GET_ITEM(firstitem
, 1), 0) < 0)
1822 Py_CLEAR(firstitem
);
1825 /* Fetch and save up to BATCHSIZE items */
1827 if (!PyTuple_Check(p
) || PyTuple_Size(p
) != 2) {
1828 PyErr_SetString(PyExc_TypeError
, "dict items "
1829 "iterator must return 2-tuples");
1832 if (save(self
, PyTuple_GET_ITEM(p
, 0), 0) < 0)
1834 if (save(self
, PyTuple_GET_ITEM(p
, 1), 0) < 0)
1842 p
= PyIter_Next(iter
);
1844 if (PyErr_Occurred())
1850 if (self
->write_func(self
, &setitems
, 1) < 0)
1853 } while (n
== BATCHSIZE
);
1857 Py_XDECREF(firstitem
);
1863 save_dict(Picklerobject
*self
, PyObject
*args
)
1870 if (self
->fast
&& !fast_save_enter(self
, args
))
1873 /* Create an empty dict. */
1884 if (self
->write_func(self
, s
, len
) < 0)
1887 /* Get dict size, and bow out early if empty. */
1888 if ((len
= PyDict_Size(args
)) < 0)
1892 if (put(self
, args
) >= 0)
1896 if (put2(self
, args
) < 0)
1899 /* Materialize the dict items. */
1900 iter
= PyObject_CallMethod(args
, "iteritems", "()");
1903 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1905 res
= batch_dict(self
, iter
);
1906 Py_LeaveRecursiveCall();
1911 if (self
->fast
&& !fast_save_leave(self
, args
))
1919 save_inst(Picklerobject
*self
, PyObject
*args
)
1921 PyObject
*class = 0, *module
= 0, *name
= 0, *state
= 0,
1922 *getinitargs_func
= 0, *getstate_func
= 0, *class_args
= 0;
1923 char *module_str
, *name_str
;
1924 int module_size
, name_size
, res
= -1;
1926 static char inst
= INST
, obj
= OBJ
, build
= BUILD
;
1928 if (self
->fast
&& !fast_save_enter(self
, args
))
1931 if (self
->write_func(self
, &MARKv
, 1) < 0)
1934 if (!( class = PyObject_GetAttr(args
, __class___str
)))
1938 if (save(self
, class, 0) < 0)
1942 if ((getinitargs_func
= PyObject_GetAttr(args
, __getinitargs___str
))) {
1943 PyObject
*element
= 0;
1947 PyObject_Call(getinitargs_func
, empty_tuple
, NULL
)))
1950 if ((len
= PyObject_Size(class_args
)) < 0)
1953 for (i
= 0; i
< len
; i
++) {
1954 if (!( element
= PySequence_GetItem(class_args
, i
)))
1957 if (save(self
, element
, 0) < 0) {
1966 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
1973 if (!( name
= ((PyClassObject
*)class)->cl_name
)) {
1974 PyErr_SetString(PicklingError
, "class has no name");
1978 if (!( module
= whichmodule(class, name
)))
1982 if ((module_size
= PyString_Size(module
)) < 0 ||
1983 (name_size
= PyString_Size(name
)) < 0)
1986 module_str
= PyString_AS_STRING((PyStringObject
*)module
);
1987 name_str
= PyString_AS_STRING((PyStringObject
*)name
);
1989 if (self
->write_func(self
, &inst
, 1) < 0)
1992 if (self
->write_func(self
, module_str
, module_size
) < 0)
1995 if (self
->write_func(self
, "\n", 1) < 0)
1998 if (self
->write_func(self
, name_str
, name_size
) < 0)
2001 if (self
->write_func(self
, "\n", 1) < 0)
2004 else if (self
->write_func(self
, &obj
, 1) < 0) {
2008 if ((getstate_func
= PyObject_GetAttr(args
, __getstate___str
))) {
2009 state
= PyObject_Call(getstate_func
, empty_tuple
, NULL
);
2014 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
2019 if (!( state
= PyObject_GetAttr(args
, __dict___str
))) {
2020 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
2029 if (!PyDict_Check(state
)) {
2030 if (put2(self
, args
) < 0)
2034 if (put(self
, args
) < 0)
2038 if (save(self
, state
, 0) < 0)
2041 if (self
->write_func(self
, &build
, 1) < 0)
2047 if (self
->fast
&& !fast_save_leave(self
, args
))
2053 Py_XDECREF(getinitargs_func
);
2054 Py_XDECREF(getstate_func
);
2055 Py_XDECREF(class_args
);
2062 save_global(Picklerobject
*self
, PyObject
*args
, PyObject
*name
)
2064 PyObject
*global_name
= 0, *module
= 0, *mod
= 0, *klass
= 0;
2065 char *name_str
, *module_str
;
2066 int module_size
, name_size
, res
= -1;
2068 static char global
= GLOBAL
;
2072 Py_INCREF(global_name
);
2075 if (!( global_name
= PyObject_GetAttr(args
, __name___str
)))
2079 if (!( module
= whichmodule(args
, global_name
)))
2082 if ((module_size
= PyString_Size(module
)) < 0 ||
2083 (name_size
= PyString_Size(global_name
)) < 0)
2086 module_str
= PyString_AS_STRING((PyStringObject
*)module
);
2087 name_str
= PyString_AS_STRING((PyStringObject
*)global_name
);
2089 /* XXX This can be doing a relative import. Clearly it shouldn't,
2090 but I don't know how to stop it. :-( */
2091 mod
= PyImport_ImportModule(module_str
);
2093 cPickle_ErrFormat(PicklingError
,
2094 "Can't pickle %s: import of module %s "
2096 "OS", args
, module
);
2099 klass
= PyObject_GetAttrString(mod
, name_str
);
2100 if (klass
== NULL
) {
2101 cPickle_ErrFormat(PicklingError
,
2102 "Can't pickle %s: attribute lookup %s.%s "
2104 "OSS", args
, module
, global_name
);
2107 if (klass
!= args
) {
2109 cPickle_ErrFormat(PicklingError
,
2110 "Can't pickle %s: it's not the same object "
2112 "OSS", args
, module
, global_name
);
2117 if (self
->proto
>= 2) {
2118 /* See whether this is in the extension registry, and if
2119 * so generate an EXT opcode.
2121 PyObject
*py_code
; /* extension code as Python object */
2122 long code
; /* extension code as C value */
2126 PyTuple_SET_ITEM(two_tuple
, 0, module
);
2127 PyTuple_SET_ITEM(two_tuple
, 1, global_name
);
2128 py_code
= PyDict_GetItem(extension_registry
, two_tuple
);
2129 if (py_code
== NULL
)
2130 goto gen_global
; /* not registered */
2132 /* Verify py_code has the right type and value. */
2133 if (!PyInt_Check(py_code
)) {
2134 cPickle_ErrFormat(PicklingError
, "Can't pickle %s: "
2135 "extension code %s isn't an integer",
2136 "OO", args
, py_code
);
2139 code
= PyInt_AS_LONG(py_code
);
2140 if (code
<= 0 || code
> 0x7fffffffL
) {
2141 cPickle_ErrFormat(PicklingError
, "Can't pickle %s: "
2142 "extension code %ld is out of range",
2147 /* Generate an EXT opcode. */
2150 c_str
[1] = (char)code
;
2153 else if (code
<= 0xffff) {
2155 c_str
[1] = (char)(code
& 0xff);
2156 c_str
[2] = (char)((code
>> 8) & 0xff);
2161 c_str
[1] = (char)(code
& 0xff);
2162 c_str
[2] = (char)((code
>> 8) & 0xff);
2163 c_str
[3] = (char)((code
>> 16) & 0xff);
2164 c_str
[4] = (char)((code
>> 24) & 0xff);
2168 if (self
->write_func(self
, c_str
, n
) >= 0)
2170 goto finally
; /* and don't memoize */
2174 if (self
->write_func(self
, &global
, 1) < 0)
2177 if (self
->write_func(self
, module_str
, module_size
) < 0)
2180 if (self
->write_func(self
, "\n", 1) < 0)
2183 if (self
->write_func(self
, name_str
, name_size
) < 0)
2186 if (self
->write_func(self
, "\n", 1) < 0)
2189 if (put(self
, args
) < 0)
2196 Py_XDECREF(global_name
);
2203 save_pers(Picklerobject
*self
, PyObject
*args
, PyObject
*f
)
2208 static char persid
= PERSID
, binpersid
= BINPERSID
;
2211 ARG_TUP(self
, args
);
2213 pid
= PyObject_Call(f
, self
->arg
, NULL
);
2216 if (! pid
) return -1;
2218 if (pid
!= Py_None
) {
2220 if (!PyString_Check(pid
)) {
2221 PyErr_SetString(PicklingError
,
2222 "persistent id must be string");
2226 if (self
->write_func(self
, &persid
, 1) < 0)
2229 if ((size
= PyString_Size(pid
)) < 0)
2232 if (self
->write_func(self
,
2234 (PyStringObject
*)pid
),
2238 if (self
->write_func(self
, "\n", 1) < 0)
2244 else if (save(self
, pid
, 1) >= 0) {
2245 if (self
->write_func(self
, &binpersid
, 1) < 0)
2262 /* We're saving ob, and args is the 2-thru-5 tuple returned by the
2263 * appropriate __reduce__ method for ob.
2266 save_reduce(Picklerobject
*self
, PyObject
*args
, PyObject
*fn
, PyObject
*ob
)
2270 PyObject
*state
= NULL
;
2271 PyObject
*listitems
= Py_None
;
2272 PyObject
*dictitems
= Py_None
;
2275 int use_newobj
= self
->proto
>= 2;
2277 static char reduce
= REDUCE
;
2278 static char build
= BUILD
;
2279 static char newobj
= NEWOBJ
;
2281 size
= PyTuple_Size(args
);
2282 if (size
< 2 || size
> 5) {
2283 cPickle_ErrFormat(PicklingError
, "tuple returned by "
2284 "%s must contain 2 through 5 elements",
2289 if (! PyArg_UnpackTuple(args
, "save_reduce", 2, 5,
2297 if (!PyTuple_Check(argtup
)) {
2298 cPickle_ErrFormat(PicklingError
, "Second element of "
2299 "tuple returned by %s must be a tuple",
2304 if (state
== Py_None
)
2307 if (listitems
== Py_None
)
2309 else if (!PyIter_Check(listitems
)) {
2310 cPickle_ErrFormat(PicklingError
, "Fourth element of "
2311 "tuple returned by %s must be an iterator, not %s",
2312 "Os", fn
, Py_TYPE(listitems
)->tp_name
);
2316 if (dictitems
== Py_None
)
2318 else if (!PyIter_Check(dictitems
)) {
2319 cPickle_ErrFormat(PicklingError
, "Fifth element of "
2320 "tuple returned by %s must be an iterator, not %s",
2321 "Os", fn
, Py_TYPE(dictitems
)->tp_name
);
2325 /* Protocol 2 special case: if callable's name is __newobj__, use
2326 * NEWOBJ. This consumes a lot of code.
2329 PyObject
*temp
= PyObject_GetAttr(callable
, __name___str
);
2332 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
2339 use_newobj
= PyString_Check(temp
) &&
2340 strcmp(PyString_AS_STRING(temp
),
2347 PyObject
*newargtup
;
2350 /* Sanity checks. */
2351 n
= PyTuple_Size(argtup
);
2353 PyErr_SetString(PicklingError
, "__newobj__ arglist "
2358 cls
= PyTuple_GET_ITEM(argtup
, 0);
2359 if (! PyObject_HasAttrString(cls
, "__new__")) {
2360 PyErr_SetString(PicklingError
, "args[0] from "
2361 "__newobj__ args has no __new__");
2365 /* XXX How could ob be NULL? */
2367 PyObject
*ob_dot_class
;
2369 ob_dot_class
= PyObject_GetAttr(ob
, __class___str
);
2370 if (ob_dot_class
== NULL
) {
2371 if (PyErr_ExceptionMatches(
2372 PyExc_AttributeError
))
2377 i
= ob_dot_class
!= cls
; /* true iff a problem */
2378 Py_XDECREF(ob_dot_class
);
2380 PyErr_SetString(PicklingError
, "args[0] from "
2381 "__newobj__ args has the wrong class");
2386 /* Save the class and its __new__ arguments. */
2387 if (save(self
, cls
, 0) < 0)
2390 newargtup
= PyTuple_New(n
-1); /* argtup[1:] */
2391 if (newargtup
== NULL
)
2393 for (i
= 1; i
< n
; ++i
) {
2394 PyObject
*temp
= PyTuple_GET_ITEM(argtup
, i
);
2396 PyTuple_SET_ITEM(newargtup
, i
-1, temp
);
2398 i
= save(self
, newargtup
, 0);
2399 Py_DECREF(newargtup
);
2403 /* Add NEWOBJ opcode. */
2404 if (self
->write_func(self
, &newobj
, 1) < 0)
2408 /* Not using NEWOBJ. */
2409 if (save(self
, callable
, 0) < 0 ||
2410 save(self
, argtup
, 0) < 0 ||
2411 self
->write_func(self
, &reduce
, 1) < 0)
2416 /* XXX How can ob be NULL? */
2418 if (state
&& !PyDict_Check(state
)) {
2419 if (put2(self
, ob
) < 0)
2422 else if (put(self
, ob
) < 0)
2427 if (listitems
&& batch_list(self
, listitems
) < 0)
2430 if (dictitems
&& batch_dict(self
, dictitems
) < 0)
2434 if (save(self
, state
, 0) < 0 ||
2435 self
->write_func(self
, &build
, 1) < 0)
2443 save(Picklerobject
*self
, PyObject
*args
, int pers_save
)
2446 PyObject
*py_ob_id
= 0, *__reduce__
= 0, *t
= 0;
2450 if (Py_EnterRecursiveCall(" while pickling an object"))
2453 if (!pers_save
&& self
->pers_func
) {
2454 if ((tmp
= save_pers(self
, args
, self
->pers_func
)) != 0) {
2460 if (args
== Py_None
) {
2461 res
= save_none(self
, args
);
2465 type
= Py_TYPE(args
);
2467 switch (type
->tp_name
[0]) {
2469 if (args
== Py_False
|| args
== Py_True
) {
2470 res
= save_bool(self
, args
);
2475 if (type
== &PyInt_Type
) {
2476 res
= save_int(self
, args
);
2482 if (type
== &PyLong_Type
) {
2483 res
= save_long(self
, args
);
2489 if (type
== &PyFloat_Type
) {
2490 res
= save_float(self
, args
);
2496 if (type
== &PyTuple_Type
&& PyTuple_Size(args
) == 0) {
2497 res
= save_tuple(self
, args
);
2503 if ((type
== &PyString_Type
) && (PyString_GET_SIZE(args
) < 2)) {
2504 res
= save_string(self
, args
, 0);
2509 #ifdef Py_USING_UNICODE
2511 if ((type
== &PyUnicode_Type
) && (PyString_GET_SIZE(args
) < 2)) {
2512 res
= save_unicode(self
, args
, 0);
2519 if (Py_REFCNT(args
) > 1) {
2520 if (!( py_ob_id
= PyLong_FromVoidPtr(args
)))
2523 if (PyDict_GetItem(self
->memo
, py_ob_id
)) {
2524 if (get(self
, py_ob_id
) < 0)
2532 switch (type
->tp_name
[0]) {
2534 if (type
== &PyString_Type
) {
2535 res
= save_string(self
, args
, 1);
2540 #ifdef Py_USING_UNICODE
2542 if (type
== &PyUnicode_Type
) {
2543 res
= save_unicode(self
, args
, 1);
2550 if (type
== &PyTuple_Type
) {
2551 res
= save_tuple(self
, args
);
2554 if (type
== &PyType_Type
) {
2555 res
= save_global(self
, args
, NULL
);
2561 if (type
== &PyList_Type
) {
2562 res
= save_list(self
, args
);
2568 if (type
== &PyDict_Type
) {
2569 res
= save_dict(self
, args
);
2575 if (type
== &PyInstance_Type
) {
2576 res
= save_inst(self
, args
);
2582 if (type
== &PyClass_Type
) {
2583 res
= save_global(self
, args
, NULL
);
2589 if (type
== &PyFunction_Type
) {
2590 res
= save_global(self
, args
, NULL
);
2591 if (res
&& PyErr_ExceptionMatches(PickleError
)) {
2592 /* fall back to reduce */
2601 if (type
== &PyCFunction_Type
) {
2602 res
= save_global(self
, args
, NULL
);
2607 if (!pers_save
&& self
->inst_pers_func
) {
2608 if ((tmp
= save_pers(self
, args
, self
->inst_pers_func
)) != 0) {
2614 if (PyType_IsSubtype(type
, &PyType_Type
)) {
2615 res
= save_global(self
, args
, NULL
);
2619 /* Get a reduction callable, and call it. This may come from
2620 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2621 * or the object's __reduce__ method.
2623 __reduce__
= PyDict_GetItem(dispatch_table
, (PyObject
*)type
);
2624 if (__reduce__
!= NULL
) {
2625 Py_INCREF(__reduce__
);
2627 ARG_TUP(self
, args
);
2629 t
= PyObject_Call(__reduce__
, self
->arg
, NULL
);
2634 /* Check for a __reduce_ex__ method. */
2635 __reduce__
= PyObject_GetAttr(args
, __reduce_ex___str
);
2636 if (__reduce__
!= NULL
) {
2637 t
= PyInt_FromLong(self
->proto
);
2642 t
= PyObject_Call(__reduce__
,
2649 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
2653 /* Check for a __reduce__ method. */
2654 __reduce__
= PyObject_GetAttr(args
, __reduce___str
);
2655 if (__reduce__
!= NULL
) {
2656 t
= PyObject_Call(__reduce__
,
2660 PyErr_SetObject(UnpickleableError
, args
);
2669 if (PyString_Check(t
)) {
2670 res
= save_global(self
, args
, t
);
2674 if (!PyTuple_Check(t
)) {
2675 cPickle_ErrFormat(PicklingError
, "Value returned by "
2676 "%s must be string or tuple",
2681 res
= save_reduce(self
, t
, __reduce__
, args
);
2684 Py_LeaveRecursiveCall();
2685 Py_XDECREF(py_ob_id
);
2686 Py_XDECREF(__reduce__
);
2694 dump(Picklerobject
*self
, PyObject
*args
)
2696 static char stop
= STOP
;
2698 if (self
->proto
>= 2) {
2702 assert(self
->proto
>= 0 && self
->proto
< 256);
2703 bytes
[1] = (char)self
->proto
;
2704 if (self
->write_func(self
, bytes
, 2) < 0)
2708 if (save(self
, args
, 0) < 0)
2711 if (self
->write_func(self
, &stop
, 1) < 0)
2714 if (self
->write_func(self
, NULL
, 0) < 0)
2721 Pickle_clear_memo(Picklerobject
*self
, PyObject
*args
)
2724 PyDict_Clear(self
->memo
);
2730 Pickle_getvalue(Picklerobject
*self
, PyObject
*args
)
2732 int l
, i
, rsize
, ssize
, clear
=1, lm
;
2735 char *s
, *p
, *have_get
;
2738 /* Can be called by Python code or C code */
2739 if (args
&& !PyArg_ParseTuple(args
, "|i:getvalue", &clear
))
2742 /* Check to make sure we are based on a list */
2743 if (! Pdata_Check(self
->file
)) {
2744 PyErr_SetString(PicklingError
,
2745 "Attempt to getvalue() a non-list-based pickler");
2749 /* flush write buffer */
2750 if (write_other(self
, NULL
, 0) < 0) return NULL
;
2752 data
=(Pdata
*)self
->file
;
2755 /* set up an array to hold get/put status */
2756 lm
= PyDict_Size(self
->memo
);
2757 if (lm
< 0) return NULL
;
2759 have_get
= malloc(lm
);
2760 if (have_get
== NULL
) return PyErr_NoMemory();
2761 memset(have_get
, 0, lm
);
2763 /* Scan for gets. */
2764 for (rsize
= 0, i
= l
; --i
>= 0; ) {
2767 if (PyString_Check(k
))
2768 rsize
+= PyString_GET_SIZE(k
);
2770 else if (PyInt_Check(k
)) { /* put */
2771 ik
= PyInt_AS_LONG((PyIntObject
*)k
);
2772 if (ik
>= lm
|| ik
== 0) {
2773 PyErr_SetString(PicklingError
,
2774 "Invalid get data");
2777 if (have_get
[ik
]) /* with matching get */
2778 rsize
+= ik
< 256 ? 2 : 5;
2781 else if (! (PyTuple_Check(k
) &&
2782 PyTuple_GET_SIZE(k
) == 2 &&
2783 PyInt_Check((k
= PyTuple_GET_ITEM(k
, 0))))
2785 PyErr_SetString(PicklingError
,
2786 "Unexpected data in internal list");
2791 ik
= PyInt_AS_LONG((PyIntObject
*)k
);
2792 if (ik
>= lm
|| ik
== 0) {
2793 PyErr_SetString(PicklingError
,
2794 "Invalid get data");
2798 rsize
+= ik
< 256 ? 2 : 5;
2802 /* Now generate the result */
2803 r
= PyString_FromStringAndSize(NULL
, rsize
);
2804 if (r
== NULL
) goto err
;
2805 s
= PyString_AS_STRING((PyStringObject
*)r
);
2807 for (i
= 0; i
< l
; i
++) {
2810 if (PyString_Check(k
)) {
2811 ssize
= PyString_GET_SIZE(k
);
2813 p
=PyString_AS_STRING((PyStringObject
*)k
);
2814 while (--ssize
>= 0)
2819 else if (PyTuple_Check(k
)) { /* get */
2820 ik
= PyInt_AS_LONG((PyIntObject
*)
2821 PyTuple_GET_ITEM(k
, 0));
2824 *s
++ = (int)(ik
& 0xff);
2828 *s
++ = (int)(ik
& 0xff);
2829 *s
++ = (int)((ik
>> 8) & 0xff);
2830 *s
++ = (int)((ik
>> 16) & 0xff);
2831 *s
++ = (int)((ik
>> 24) & 0xff);
2836 ik
= PyInt_AS_LONG((PyIntObject
*)k
);
2838 if (have_get
[ik
]) { /* with matching get */
2841 *s
++ = (int)(ik
& 0xff);
2845 *s
++ = (int)(ik
& 0xff);
2846 *s
++ = (int)((ik
>> 8) & 0xff);
2847 *s
++ = (int)((ik
>> 16) & 0xff);
2848 *s
++ = (int)((ik
>> 24) & 0xff);
2855 PyDict_Clear(self
->memo
);
2856 Pdata_clear(data
, 0);
2867 Pickler_dump(Picklerobject
*self
, PyObject
*args
)
2872 if (!( PyArg_ParseTuple(args
, "O|i:dump", &ob
, &get
)))
2875 if (dump(self
, ob
) < 0)
2878 if (get
) return Pickle_getvalue(self
, NULL
);
2880 /* XXX Why does dump() return self? */
2882 return (PyObject
*)self
;
2886 static struct PyMethodDef Pickler_methods
[] =
2888 {"dump", (PyCFunction
)Pickler_dump
, METH_VARARGS
,
2889 PyDoc_STR("dump(object) -- "
2890 "Write an object in pickle format to the object's pickle stream")},
2891 {"clear_memo", (PyCFunction
)Pickle_clear_memo
, METH_NOARGS
,
2892 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
2893 {"getvalue", (PyCFunction
)Pickle_getvalue
, METH_VARARGS
,
2894 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
2895 {NULL
, NULL
} /* sentinel */
2899 static Picklerobject
*
2900 newPicklerobject(PyObject
*file
, int proto
)
2902 Picklerobject
*self
;
2905 proto
= HIGHEST_PROTOCOL
;
2906 if (proto
> HIGHEST_PROTOCOL
) {
2907 PyErr_Format(PyExc_ValueError
, "pickle protocol %d asked for; "
2908 "the highest available protocol is %d",
2909 proto
, HIGHEST_PROTOCOL
);
2913 self
= PyObject_GC_New(Picklerobject
, &Picklertype
);
2916 self
->proto
= proto
;
2917 self
->bin
= proto
> 0;
2922 self
->pers_func
= NULL
;
2923 self
->inst_pers_func
= NULL
;
2924 self
->write_buf
= NULL
;
2926 self
->fast_container
= 0;
2927 self
->fast_memo
= NULL
;
2929 self
->dispatch_table
= NULL
;
2941 if (!( self
->memo
= PyDict_New()))
2944 if (PyFile_Check(file
)) {
2945 self
->fp
= PyFile_AsFile(file
);
2946 if (self
->fp
== NULL
) {
2947 PyErr_SetString(PyExc_ValueError
,
2948 "I/O operation on closed file");
2951 self
->write_func
= write_file
;
2953 else if (PycStringIO_OutputCheck(file
)) {
2954 self
->write_func
= write_cStringIO
;
2956 else if (file
== Py_None
) {
2957 self
->write_func
= write_none
;
2960 self
->write_func
= write_other
;
2962 if (! Pdata_Check(file
)) {
2963 self
->write
= PyObject_GetAttr(file
, write_str
);
2966 PyErr_SetString(PyExc_TypeError
,
2967 "argument must have 'write' "
2973 self
->write_buf
= (char *)PyMem_Malloc(WRITE_BUF_SIZE
);
2974 if (self
->write_buf
== NULL
) {
2980 if (PyEval_GetRestricted()) {
2981 /* Restricted execution, get private tables */
2982 PyObject
*m
= PyImport_Import(copyreg_str
);
2986 self
->dispatch_table
= PyObject_GetAttr(m
, dispatch_table_str
);
2988 if (self
->dispatch_table
== NULL
)
2992 self
->dispatch_table
= dispatch_table
;
2993 Py_INCREF(dispatch_table
);
2995 PyObject_GC_Track(self
);
3006 get_Pickler(PyObject
*self
, PyObject
*args
, PyObject
*kwds
)
3008 static char *kwlist
[] = {"file", "protocol", NULL
};
3009 PyObject
*file
= NULL
;
3013 * The documented signature is Pickler(file, protocol=0), but this
3014 * accepts Pickler() and Pickler(integer) too. The meaning then
3015 * is clear as mud, undocumented, and not supported by pickle.py.
3016 * I'm told Zope uses this, but I haven't traced into this code
3017 * far enough to figure out what it means.
3019 if (!PyArg_ParseTuple(args
, "|i:Pickler", &proto
)) {
3022 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "O|i:Pickler",
3023 kwlist
, &file
, &proto
))
3026 return (PyObject
*)newPicklerobject(file
, proto
);
3031 Pickler_dealloc(Picklerobject
*self
)
3033 PyObject_GC_UnTrack(self
);
3034 Py_XDECREF(self
->write
);
3035 Py_XDECREF(self
->memo
);
3036 Py_XDECREF(self
->fast_memo
);
3037 Py_XDECREF(self
->arg
);
3038 Py_XDECREF(self
->file
);
3039 Py_XDECREF(self
->pers_func
);
3040 Py_XDECREF(self
->inst_pers_func
);
3041 Py_XDECREF(self
->dispatch_table
);
3042 PyMem_Free(self
->write_buf
);
3043 Py_TYPE(self
)->tp_free((PyObject
*)self
);
3047 Pickler_traverse(Picklerobject
*self
, visitproc visit
, void *arg
)
3049 Py_VISIT(self
->write
);
3050 Py_VISIT(self
->memo
);
3051 Py_VISIT(self
->fast_memo
);
3052 Py_VISIT(self
->arg
);
3053 Py_VISIT(self
->file
);
3054 Py_VISIT(self
->pers_func
);
3055 Py_VISIT(self
->inst_pers_func
);
3056 Py_VISIT(self
->dispatch_table
);
3061 Pickler_clear(Picklerobject
*self
)
3063 Py_CLEAR(self
->write
);
3064 Py_CLEAR(self
->memo
);
3065 Py_CLEAR(self
->fast_memo
);
3066 Py_CLEAR(self
->arg
);
3067 Py_CLEAR(self
->file
);
3068 Py_CLEAR(self
->pers_func
);
3069 Py_CLEAR(self
->inst_pers_func
);
3070 Py_CLEAR(self
->dispatch_table
);
3075 Pickler_get_pers_func(Picklerobject
*p
)
3077 if (p
->pers_func
== NULL
)
3078 PyErr_SetString(PyExc_AttributeError
, "persistent_id");
3080 Py_INCREF(p
->pers_func
);
3081 return p
->pers_func
;
3085 Pickler_set_pers_func(Picklerobject
*p
, PyObject
*v
)
3088 PyErr_SetString(PyExc_TypeError
,
3089 "attribute deletion is not supported");
3092 Py_XDECREF(p
->pers_func
);
3099 Pickler_set_inst_pers_func(Picklerobject
*p
, PyObject
*v
)
3102 PyErr_SetString(PyExc_TypeError
,
3103 "attribute deletion is not supported");
3106 Py_XDECREF(p
->inst_pers_func
);
3108 p
->inst_pers_func
= v
;
3113 Pickler_get_memo(Picklerobject
*p
)
3115 if (p
->memo
== NULL
)
3116 PyErr_SetString(PyExc_AttributeError
, "memo");
3123 Pickler_set_memo(Picklerobject
*p
, PyObject
*v
)
3126 PyErr_SetString(PyExc_TypeError
,
3127 "attribute deletion is not supported");
3130 if (!PyDict_Check(v
)) {
3131 PyErr_SetString(PyExc_TypeError
, "memo must be a dictionary");
3134 Py_XDECREF(p
->memo
);
3141 Pickler_get_error(Picklerobject
*p
)
3143 /* why is this an attribute on the Pickler? */
3144 Py_INCREF(PicklingError
);
3145 return PicklingError
;
3148 static PyMemberDef Pickler_members
[] = {
3149 {"binary", T_INT
, offsetof(Picklerobject
, bin
)},
3150 {"fast", T_INT
, offsetof(Picklerobject
, fast
)},
3154 static PyGetSetDef Pickler_getsets
[] = {
3155 {"persistent_id", (getter
)Pickler_get_pers_func
,
3156 (setter
)Pickler_set_pers_func
},
3157 {"inst_persistent_id", NULL
, (setter
)Pickler_set_inst_pers_func
},
3158 {"memo", (getter
)Pickler_get_memo
, (setter
)Pickler_set_memo
},
3159 {"PicklingError", (getter
)Pickler_get_error
, NULL
},
3163 PyDoc_STRVAR(Picklertype__doc__
,
3164 "Objects that know how to pickle objects\n");
3166 static PyTypeObject Picklertype
= {
3167 PyVarObject_HEAD_INIT(NULL
, 0)
3168 "cPickle.Pickler", /*tp_name*/
3169 sizeof(Picklerobject
), /*tp_basicsize*/
3171 (destructor
)Pickler_dealloc
, /* tp_dealloc */
3177 0, /* tp_as_number */
3178 0, /* tp_as_sequence */
3179 0, /* tp_as_mapping */
3183 PyObject_GenericGetAttr
, /* tp_getattro */
3184 PyObject_GenericSetAttr
, /* tp_setattro */
3185 0, /* tp_as_buffer */
3186 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
| Py_TPFLAGS_HAVE_GC
,
3187 Picklertype__doc__
, /* tp_doc */
3188 (traverseproc
)Pickler_traverse
, /* tp_traverse */
3189 (inquiry
)Pickler_clear
, /* tp_clear */
3190 0, /* tp_richcompare */
3191 0, /* tp_weaklistoffset */
3193 0, /* tp_iternext */
3194 Pickler_methods
, /* tp_methods */
3195 Pickler_members
, /* tp_members */
3196 Pickler_getsets
, /* tp_getset */
3200 find_class(PyObject
*py_module_name
, PyObject
*py_global_name
, PyObject
*fc
)
3202 PyObject
*global
= 0, *module
;
3206 PyErr_SetString(UnpicklingError
, "Global and instance "
3207 "pickles are not supported.");
3210 return PyObject_CallFunctionObjArgs(fc
, py_module_name
,
3211 py_global_name
, NULL
);
3214 module
= PySys_GetObject("modules");
3218 module
= PyDict_GetItem(module
, py_module_name
);
3219 if (module
== NULL
) {
3220 module
= PyImport_Import(py_module_name
);
3223 global
= PyObject_GetAttr(module
, py_global_name
);
3227 global
= PyObject_GetAttr(module
, py_global_name
);
3232 marker(Unpicklerobject
*self
)
3234 if (self
->num_marks
< 1) {
3235 PyErr_SetString(UnpicklingError
, "could not find MARK");
3239 return self
->marks
[--self
->num_marks
];
3244 load_none(Unpicklerobject
*self
)
3246 PDATA_APPEND(self
->stack
, Py_None
, -1);
3253 PyErr_SetString(UnpicklingError
, "pickle data was truncated");
3258 load_int(Unpicklerobject
*self
)
3260 PyObject
*py_int
= 0;
3265 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3266 if (len
< 2) return bad_readline();
3267 if (!( s
=pystrndup(s
,len
))) return -1;
3270 l
= strtol(s
, &endptr
, 0);
3272 if (errno
|| (*endptr
!= '\n') || (endptr
[1] != '\0')) {
3273 /* Hm, maybe we've got something long. Let's try reading
3274 it as a Python long object. */
3276 py_int
= PyLong_FromString(s
, NULL
, 0);
3277 if (py_int
== NULL
) {
3278 PyErr_SetString(PyExc_ValueError
,
3279 "could not convert string to int");
3284 if (len
== 3 && (l
== 0 || l
== 1)) {
3285 if (!( py_int
= PyBool_FromLong(l
))) goto finally
;
3288 if (!( py_int
= PyInt_FromLong(l
))) goto finally
;
3293 PDATA_PUSH(self
->stack
, py_int
, -1);
3303 load_bool(Unpicklerobject
*self
, PyObject
*boolean
)
3305 assert(boolean
== Py_True
|| boolean
== Py_False
);
3306 PDATA_APPEND(self
->stack
, boolean
, -1);
3310 /* s contains x bytes of a little-endian integer. Return its value as a
3311 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3312 * int, but when x is 4 it's a signed one. This is an historical source
3313 * of x-platform bugs.
3316 calc_binint(char *s
, int x
)
3322 for (i
= 0, l
= 0L; i
< x
; i
++) {
3323 c
= (unsigned char)s
[i
];
3324 l
|= (long)c
<< (i
* 8);
3327 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3328 * is signed, so on a box with longs bigger than 4 bytes we need
3329 * to extend a BININT's sign bit to the full width.
3331 if (x
== 4 && l
& (1L << 31))
3339 load_binintx(Unpicklerobject
*self
, char *s
, int x
)
3341 PyObject
*py_int
= 0;
3344 l
= calc_binint(s
, x
);
3346 if (!( py_int
= PyInt_FromLong(l
)))
3349 PDATA_PUSH(self
->stack
, py_int
, -1);
3355 load_binint(Unpicklerobject
*self
)
3359 if (self
->read_func(self
, &s
, 4) < 0)
3362 return load_binintx(self
, s
, 4);
3367 load_binint1(Unpicklerobject
*self
)
3371 if (self
->read_func(self
, &s
, 1) < 0)
3374 return load_binintx(self
, s
, 1);
3379 load_binint2(Unpicklerobject
*self
)
3383 if (self
->read_func(self
, &s
, 2) < 0)
3386 return load_binintx(self
, s
, 2);
3390 load_long(Unpicklerobject
*self
)
3396 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3397 if (len
< 2) return bad_readline();
3398 if (!( s
=pystrndup(s
,len
))) return -1;
3400 if (!( l
= PyLong_FromString(s
, &end
, 0)))
3404 PDATA_PUSH(self
->stack
, l
, -1);
3413 /* 'size' bytes contain the # of bytes of little-endian 256's-complement
3417 load_counted_long(Unpicklerobject
*self
, int size
)
3421 unsigned char *pdata
;
3424 assert(size
== 1 || size
== 4);
3425 i
= self
->read_func(self
, &nbytes
, size
);
3426 if (i
< 0) return -1;
3428 size
= calc_binint(nbytes
, size
);
3430 /* Corrupt or hostile pickle -- we never write one like
3433 PyErr_SetString(UnpicklingError
, "LONG pickle has negative "
3439 along
= PyLong_FromLong(0L);
3441 /* Read the raw little-endian bytes & convert. */
3442 i
= self
->read_func(self
, (char **)&pdata
, size
);
3443 if (i
< 0) return -1;
3444 along
= _PyLong_FromByteArray(pdata
, (size_t)size
,
3445 1 /* little endian */, 1 /* signed */);
3449 PDATA_PUSH(self
->stack
, along
, -1);
3454 load_float(Unpicklerobject
*self
)
3456 PyObject
*py_float
= 0;
3461 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3462 if (len
< 2) return bad_readline();
3463 if (!( s
=pystrndup(s
,len
))) return -1;
3466 d
= PyOS_ascii_strtod(s
, &endptr
);
3468 if ((errno
== ERANGE
&& !(fabs(d
) <= 1.0)) ||
3469 (endptr
[0] != '\n') || (endptr
[1] != '\0')) {
3470 PyErr_SetString(PyExc_ValueError
,
3471 "could not convert string to float");
3475 if (!( py_float
= PyFloat_FromDouble(d
)))
3479 PDATA_PUSH(self
->stack
, py_float
, -1);
3489 load_binfloat(Unpicklerobject
*self
)
3495 if (self
->read_func(self
, &p
, 8) < 0)
3498 x
= _PyFloat_Unpack8((unsigned char *)p
, 0);
3499 if (x
== -1.0 && PyErr_Occurred())
3502 py_float
= PyFloat_FromDouble(x
);
3503 if (py_float
== NULL
)
3506 PDATA_PUSH(self
->stack
, py_float
, -1);
3511 load_string(Unpicklerobject
*self
)
3517 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3518 if (len
< 2) return bad_readline();
3519 if (!( s
=pystrndup(s
,len
))) return -1;
3522 /* Strip outermost quotes */
3523 while (s
[len
-1] <= ' ')
3525 if(s
[0]=='"' && s
[len
-1]=='"'){
3529 } else if(s
[0]=='\'' && s
[len
-1]=='\''){
3535 /********************************************/
3537 str
= PyString_DecodeEscape(p
, len
, NULL
, 0, NULL
);
3540 PDATA_PUSH(self
->stack
, str
, -1);
3547 PyErr_SetString(PyExc_ValueError
,"insecure string pickle");
3553 load_binstring(Unpicklerobject
*self
)
3555 PyObject
*py_string
= 0;
3559 if (self
->read_func(self
, &s
, 4) < 0) return -1;
3561 l
= calc_binint(s
, 4);
3563 /* Corrupt or hostile pickle -- we never write one like
3566 PyErr_SetString(UnpicklingError
,
3567 "BINSTRING pickle has negative byte count");
3571 if (self
->read_func(self
, &s
, l
) < 0)
3574 if (!( py_string
= PyString_FromStringAndSize(s
, l
)))
3577 PDATA_PUSH(self
->stack
, py_string
, -1);
3583 load_short_binstring(Unpicklerobject
*self
)
3585 PyObject
*py_string
= 0;
3589 if (self
->read_func(self
, &s
, 1) < 0)
3592 l
= (unsigned char)s
[0];
3594 if (self
->read_func(self
, &s
, l
) < 0) return -1;
3596 if (!( py_string
= PyString_FromStringAndSize(s
, l
))) return -1;
3598 PDATA_PUSH(self
->stack
, py_string
, -1);
3603 #ifdef Py_USING_UNICODE
3605 load_unicode(Unpicklerobject
*self
)
3611 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3612 if (len
< 1) return bad_readline();
3614 if (!( str
= PyUnicode_DecodeRawUnicodeEscape(s
, len
- 1, NULL
)))
3617 PDATA_PUSH(self
->stack
, str
, -1);
3626 #ifdef Py_USING_UNICODE
3628 load_binunicode(Unpicklerobject
*self
)
3634 if (self
->read_func(self
, &s
, 4) < 0) return -1;
3636 l
= calc_binint(s
, 4);
3638 /* Corrupt or hostile pickle -- we never write one like
3641 PyErr_SetString(UnpicklingError
,
3642 "BINUNICODE pickle has negative byte count");
3646 if (self
->read_func(self
, &s
, l
) < 0)
3649 if (!( unicode
= PyUnicode_DecodeUTF8(s
, l
, NULL
)))
3652 PDATA_PUSH(self
->stack
, unicode
, -1);
3659 load_tuple(Unpicklerobject
*self
)
3664 if ((i
= marker(self
)) < 0) return -1;
3665 if (!( tup
=Pdata_popTuple(self
->stack
, i
))) return -1;
3666 PDATA_PUSH(self
->stack
, tup
, -1);
3671 load_counted_tuple(Unpicklerobject
*self
, int len
)
3673 PyObject
*tup
= PyTuple_New(len
);
3678 while (--len
>= 0) {
3681 PDATA_POP(self
->stack
, element
);
3682 if (element
== NULL
)
3684 PyTuple_SET_ITEM(tup
, len
, element
);
3686 PDATA_PUSH(self
->stack
, tup
, -1);
3691 load_empty_list(Unpicklerobject
*self
)
3695 if (!( list
=PyList_New(0))) return -1;
3696 PDATA_PUSH(self
->stack
, list
, -1);
3701 load_empty_dict(Unpicklerobject
*self
)
3705 if (!( dict
=PyDict_New())) return -1;
3706 PDATA_PUSH(self
->stack
, dict
, -1);
3712 load_list(Unpicklerobject
*self
)
3717 if ((i
= marker(self
)) < 0) return -1;
3718 if (!( list
=Pdata_popList(self
->stack
, i
))) return -1;
3719 PDATA_PUSH(self
->stack
, list
, -1);
3724 load_dict(Unpicklerobject
*self
)
3726 PyObject
*dict
, *key
, *value
;
3729 if ((i
= marker(self
)) < 0) return -1;
3730 j
=self
->stack
->length
;
3732 if (!( dict
= PyDict_New())) return -1;
3734 for (k
= i
+1; k
< j
; k
+= 2) {
3735 key
=self
->stack
->data
[k
-1];
3736 value
=self
->stack
->data
[k
];
3737 if (PyDict_SetItem(dict
, key
, value
) < 0) {
3742 Pdata_clear(self
->stack
, i
);
3743 PDATA_PUSH(self
->stack
, dict
, -1);
3748 Instance_New(PyObject
*cls
, PyObject
*args
)
3752 if (PyClass_Check(cls
)) {
3755 if ((l
=PyObject_Size(args
)) < 0) goto err
;
3757 PyObject
*__getinitargs__
;
3759 __getinitargs__
= PyObject_GetAttr(cls
,
3760 __getinitargs___str
);
3761 if (!__getinitargs__
) {
3762 /* We have a class with no __getinitargs__,
3763 so bypass usual construction */
3767 if (!( inst
=PyInstance_NewRaw(cls
, NULL
)))
3771 Py_DECREF(__getinitargs__
);
3774 if ((r
=PyInstance_New(cls
, args
, NULL
))) return r
;
3778 if ((r
=PyObject_CallObject(cls
, args
))) return r
;
3782 PyObject
*tp
, *v
, *tb
, *tmp_value
;
3784 PyErr_Fetch(&tp
, &v
, &tb
);
3786 /* NULL occurs when there was a KeyboardInterrupt */
3787 if (tmp_value
== NULL
)
3788 tmp_value
= Py_None
;
3789 if ((r
= PyTuple_Pack(3, tmp_value
, cls
, args
))) {
3793 PyErr_Restore(tp
,v
,tb
);
3800 load_obj(Unpicklerobject
*self
)
3802 PyObject
*class, *tup
, *obj
=0;
3805 if ((i
= marker(self
)) < 0) return -1;
3806 if (!( tup
=Pdata_popTuple(self
->stack
, i
+1))) return -1;
3807 PDATA_POP(self
->stack
, class);
3809 obj
= Instance_New(class, tup
);
3814 if (! obj
) return -1;
3815 PDATA_PUSH(self
->stack
, obj
, -1);
3821 load_inst(Unpicklerobject
*self
)
3823 PyObject
*tup
, *class=0, *obj
=0, *module_name
, *class_name
;
3827 if ((i
= marker(self
)) < 0) return -1;
3829 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3830 if (len
< 2) return bad_readline();
3831 module_name
= PyString_FromStringAndSize(s
, len
- 1);
3832 if (!module_name
) return -1;
3834 if ((len
= self
->readline_func(self
, &s
)) >= 0) {
3835 if (len
< 2) return bad_readline();
3836 if ((class_name
= PyString_FromStringAndSize(s
, len
- 1))) {
3837 class = find_class(module_name
, class_name
,
3839 Py_DECREF(class_name
);
3842 Py_DECREF(module_name
);
3844 if (! class) return -1;
3846 if ((tup
=Pdata_popTuple(self
->stack
, i
))) {
3847 obj
= Instance_New(class, tup
);
3852 if (! obj
) return -1;
3854 PDATA_PUSH(self
->stack
, obj
, -1);
3859 load_newobj(Unpicklerobject
*self
)
3861 PyObject
*args
= NULL
;
3862 PyObject
*clsraw
= NULL
;
3863 PyTypeObject
*cls
; /* clsraw cast to its true type */
3866 /* Stack is ... cls argtuple, and we want to call
3867 * cls.__new__(cls, *argtuple).
3869 PDATA_POP(self
->stack
, args
);
3870 if (args
== NULL
) goto Fail
;
3871 if (! PyTuple_Check(args
)) {
3872 PyErr_SetString(UnpicklingError
, "NEWOBJ expected an arg "
3877 PDATA_POP(self
->stack
, clsraw
);
3878 cls
= (PyTypeObject
*)clsraw
;
3879 if (cls
== NULL
) goto Fail
;
3880 if (! PyType_Check(cls
)) {
3881 PyErr_SetString(UnpicklingError
, "NEWOBJ class argument "
3882 "isn't a type object");
3885 if (cls
->tp_new
== NULL
) {
3886 PyErr_SetString(UnpicklingError
, "NEWOBJ class argument "
3892 obj
= cls
->tp_new(cls
, args
, NULL
);
3893 if (obj
== NULL
) goto Fail
;
3897 PDATA_PUSH(self
->stack
, obj
, -1);
3907 load_global(Unpicklerobject
*self
)
3909 PyObject
*class = 0, *module_name
= 0, *class_name
= 0;
3913 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3914 if (len
< 2) return bad_readline();
3915 module_name
= PyString_FromStringAndSize(s
, len
- 1);
3916 if (!module_name
) return -1;
3918 if ((len
= self
->readline_func(self
, &s
)) >= 0) {
3920 Py_DECREF(module_name
);
3921 return bad_readline();
3923 if ((class_name
= PyString_FromStringAndSize(s
, len
- 1))) {
3924 class = find_class(module_name
, class_name
,
3926 Py_DECREF(class_name
);
3929 Py_DECREF(module_name
);
3931 if (! class) return -1;
3932 PDATA_PUSH(self
->stack
, class, -1);
3938 load_persid(Unpicklerobject
*self
)
3944 if (self
->pers_func
) {
3945 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3946 if (len
< 2) return bad_readline();
3948 pid
= PyString_FromStringAndSize(s
, len
- 1);
3949 if (!pid
) return -1;
3951 if (PyList_Check(self
->pers_func
)) {
3952 if (PyList_Append(self
->pers_func
, pid
) < 0) {
3960 pid
= PyObject_Call(self
->pers_func
, self
->arg
,
3966 if (! pid
) return -1;
3968 PDATA_PUSH(self
->stack
, pid
, -1);
3972 PyErr_SetString(UnpicklingError
,
3973 "A load persistent id instruction was encountered,\n"
3974 "but no persistent_load function was specified.");
3980 load_binpersid(Unpicklerobject
*self
)
3984 if (self
->pers_func
) {
3985 PDATA_POP(self
->stack
, pid
);
3986 if (! pid
) return -1;
3988 if (PyList_Check(self
->pers_func
)) {
3989 if (PyList_Append(self
->pers_func
, pid
) < 0) {
3997 pid
= PyObject_Call(self
->pers_func
, self
->arg
,
4001 if (! pid
) return -1;
4004 PDATA_PUSH(self
->stack
, pid
, -1);
4008 PyErr_SetString(UnpicklingError
,
4009 "A load persistent id instruction was encountered,\n"
4010 "but no persistent_load function was specified.");
4017 load_pop(Unpicklerobject
*self
)
4021 if (!( (len
=self
->stack
->length
) > 0 )) return stackUnderflow();
4023 /* Note that we split the (pickle.py) stack into two stacks,
4024 an object stack and a mark stack. We have to be clever and
4025 pop the right one. We do this by looking at the top of the
4029 if ((self
->num_marks
> 0) &&
4030 (self
->marks
[self
->num_marks
- 1] == len
))
4034 Py_DECREF(self
->stack
->data
[len
]);
4035 self
->stack
->length
=len
;
4043 load_pop_mark(Unpicklerobject
*self
)
4047 if ((i
= marker(self
)) < 0)
4050 Pdata_clear(self
->stack
, i
);
4057 load_dup(Unpicklerobject
*self
)
4062 if ((len
= self
->stack
->length
) <= 0) return stackUnderflow();
4063 last
=self
->stack
->data
[len
-1];
4065 PDATA_PUSH(self
->stack
, last
, -1);
4071 load_get(Unpicklerobject
*self
)
4073 PyObject
*py_str
= 0, *value
= 0;
4078 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
4079 if (len
< 2) return bad_readline();
4081 if (!( py_str
= PyString_FromStringAndSize(s
, len
- 1))) return -1;
4083 value
= PyDict_GetItem(self
->memo
, py_str
);
4085 PyErr_SetObject(BadPickleGet
, py_str
);
4089 PDATA_APPEND(self
->stack
, value
, -1);
4099 load_binget(Unpicklerobject
*self
)
4101 PyObject
*py_key
= 0, *value
= 0;
4106 if (self
->read_func(self
, &s
, 1) < 0) return -1;
4108 key
= (unsigned char)s
[0];
4109 if (!( py_key
= PyInt_FromLong((long)key
))) return -1;
4111 value
= PyDict_GetItem(self
->memo
, py_key
);
4113 PyErr_SetObject(BadPickleGet
, py_key
);
4117 PDATA_APPEND(self
->stack
, value
, -1);
4127 load_long_binget(Unpicklerobject
*self
)
4129 PyObject
*py_key
= 0, *value
= 0;
4135 if (self
->read_func(self
, &s
, 4) < 0) return -1;
4137 c
= (unsigned char)s
[0];
4139 c
= (unsigned char)s
[1];
4140 key
|= (long)c
<< 8;
4141 c
= (unsigned char)s
[2];
4142 key
|= (long)c
<< 16;
4143 c
= (unsigned char)s
[3];
4144 key
|= (long)c
<< 24;
4146 if (!( py_key
= PyInt_FromLong((long)key
))) return -1;
4148 value
= PyDict_GetItem(self
->memo
, py_key
);
4150 PyErr_SetObject(BadPickleGet
, py_key
);
4154 PDATA_APPEND(self
->stack
, value
, -1);
4162 /* Push an object from the extension registry (EXT[124]). nbytes is
4163 * the number of bytes following the opcode, holding the index (code) value.
4166 load_extension(Unpicklerobject
*self
, int nbytes
)
4168 char *codebytes
; /* the nbytes bytes after the opcode */
4169 long code
; /* calc_binint returns long */
4170 PyObject
*py_code
; /* code as a Python int */
4171 PyObject
*obj
; /* the object to push */
4172 PyObject
*pair
; /* (module_name, class_name) */
4173 PyObject
*module_name
, *class_name
;
4175 assert(nbytes
== 1 || nbytes
== 2 || nbytes
== 4);
4176 if (self
->read_func(self
, &codebytes
, nbytes
) < 0) return -1;
4177 code
= calc_binint(codebytes
, nbytes
);
4178 if (code
<= 0) { /* note that 0 is forbidden */
4179 /* Corrupt or hostile pickle. */
4180 PyErr_SetString(UnpicklingError
, "EXT specifies code <= 0");
4184 /* Look for the code in the cache. */
4185 py_code
= PyInt_FromLong(code
);
4186 if (py_code
== NULL
) return -1;
4187 obj
= PyDict_GetItem(extension_cache
, py_code
);
4191 PDATA_APPEND(self
->stack
, obj
, -1);
4195 /* Look up the (module_name, class_name) pair. */
4196 pair
= PyDict_GetItem(inverted_registry
, py_code
);
4199 PyErr_Format(PyExc_ValueError
, "unregistered extension "
4203 /* Since the extension registry is manipulable via Python code,
4204 * confirm that pair is really a 2-tuple of strings.
4206 if (!PyTuple_Check(pair
) || PyTuple_Size(pair
) != 2 ||
4207 !PyString_Check(module_name
= PyTuple_GET_ITEM(pair
, 0)) ||
4208 !PyString_Check(class_name
= PyTuple_GET_ITEM(pair
, 1))) {
4210 PyErr_Format(PyExc_ValueError
, "_inverted_registry[%ld] "
4211 "isn't a 2-tuple of strings", code
);
4214 /* Load the object. */
4215 obj
= find_class(module_name
, class_name
, self
->find_class
);
4220 /* Cache code -> obj. */
4221 code
= PyDict_SetItem(extension_cache
, py_code
, obj
);
4227 PDATA_PUSH(self
->stack
, obj
, -1);
4232 load_put(Unpicklerobject
*self
)
4234 PyObject
*py_str
= 0, *value
= 0;
4238 if ((l
= self
->readline_func(self
, &s
)) < 0) return -1;
4239 if (l
< 2) return bad_readline();
4240 if (!( len
=self
->stack
->length
)) return stackUnderflow();
4241 if (!( py_str
= PyString_FromStringAndSize(s
, l
- 1))) return -1;
4242 value
=self
->stack
->data
[len
-1];
4243 l
=PyDict_SetItem(self
->memo
, py_str
, value
);
4250 load_binput(Unpicklerobject
*self
)
4252 PyObject
*py_key
= 0, *value
= 0;
4257 if (self
->read_func(self
, &s
, 1) < 0) return -1;
4258 if (!( (len
=self
->stack
->length
) > 0 )) return stackUnderflow();
4260 key
= (unsigned char)s
[0];
4262 if (!( py_key
= PyInt_FromLong((long)key
))) return -1;
4263 value
=self
->stack
->data
[len
-1];
4264 len
=PyDict_SetItem(self
->memo
, py_key
, value
);
4271 load_long_binput(Unpicklerobject
*self
)
4273 PyObject
*py_key
= 0, *value
= 0;
4279 if (self
->read_func(self
, &s
, 4) < 0) return -1;
4280 if (!( len
=self
->stack
->length
)) return stackUnderflow();
4282 c
= (unsigned char)s
[0];
4284 c
= (unsigned char)s
[1];
4285 key
|= (long)c
<< 8;
4286 c
= (unsigned char)s
[2];
4287 key
|= (long)c
<< 16;
4288 c
= (unsigned char)s
[3];
4289 key
|= (long)c
<< 24;
4291 if (!( py_key
= PyInt_FromLong(key
))) return -1;
4292 value
=self
->stack
->data
[len
-1];
4293 len
=PyDict_SetItem(self
->memo
, py_key
, value
);
4300 do_append(Unpicklerobject
*self
, int x
)
4302 PyObject
*value
= 0, *list
= 0, *append_method
= 0;
4305 len
=self
->stack
->length
;
4306 if (!( len
>= x
&& x
> 0 )) return stackUnderflow();
4308 if (len
==x
) return 0;
4310 list
=self
->stack
->data
[x
-1];
4312 if (PyList_Check(list
)) {
4316 slice
=Pdata_popList(self
->stack
, x
);
4317 if (! slice
) return -1;
4318 list_len
= PyList_GET_SIZE(list
);
4319 i
=PyList_SetSlice(list
, list_len
, list_len
, slice
);
4325 if (!( append_method
= PyObject_GetAttr(list
, append_str
)))
4328 for (i
= x
; i
< len
; i
++) {
4331 value
=self
->stack
->data
[i
];
4333 ARG_TUP(self
, value
);
4335 junk
= PyObject_Call(append_method
, self
->arg
,
4340 Pdata_clear(self
->stack
, i
+1);
4341 self
->stack
->length
=x
;
4342 Py_DECREF(append_method
);
4347 self
->stack
->length
=x
;
4348 Py_DECREF(append_method
);
4356 load_append(Unpicklerobject
*self
)
4358 return do_append(self
, self
->stack
->length
- 1);
4363 load_appends(Unpicklerobject
*self
)
4365 return do_append(self
, marker(self
));
4370 do_setitems(Unpicklerobject
*self
, int x
)
4372 PyObject
*value
= 0, *key
= 0, *dict
= 0;
4375 if (!( (len
=self
->stack
->length
) >= x
4376 && x
> 0 )) return stackUnderflow();
4378 dict
=self
->stack
->data
[x
-1];
4380 for (i
= x
+1; i
< len
; i
+= 2) {
4381 key
=self
->stack
->data
[i
-1];
4382 value
=self
->stack
->data
[i
];
4383 if (PyObject_SetItem(dict
, key
, value
) < 0) {
4389 Pdata_clear(self
->stack
, x
);
4396 load_setitem(Unpicklerobject
*self
)
4398 return do_setitems(self
, self
->stack
->length
- 2);
4402 load_setitems(Unpicklerobject
*self
)
4404 return do_setitems(self
, marker(self
));
4409 load_build(Unpicklerobject
*self
)
4411 PyObject
*state
, *inst
, *slotstate
;
4412 PyObject
*__setstate__
;
4413 PyObject
*d_key
, *d_value
;
4417 /* Stack is ... instance, state. We want to leave instance at
4418 * the stack top, possibly mutated via instance.__setstate__(state).
4420 if (self
->stack
->length
< 2)
4421 return stackUnderflow();
4422 PDATA_POP(self
->stack
, state
);
4425 inst
= self
->stack
->data
[self
->stack
->length
- 1];
4427 __setstate__
= PyObject_GetAttr(inst
, __setstate___str
);
4428 if (__setstate__
!= NULL
) {
4429 PyObject
*junk
= NULL
;
4431 /* The explicit __setstate__ is responsible for everything. */
4432 ARG_TUP(self
, state
);
4434 junk
= PyObject_Call(__setstate__
, self
->arg
, NULL
);
4437 Py_DECREF(__setstate__
);
4443 if (!PyErr_ExceptionMatches(PyExc_AttributeError
))
4447 /* A default __setstate__. First see whether state embeds a
4448 * slot state dict too (a proto 2 addition).
4450 if (PyTuple_Check(state
) && PyTuple_Size(state
) == 2) {
4451 PyObject
*temp
= state
;
4452 state
= PyTuple_GET_ITEM(temp
, 0);
4453 slotstate
= PyTuple_GET_ITEM(temp
, 1);
4455 Py_INCREF(slotstate
);
4461 /* Set inst.__dict__ from the state dict (if any). */
4462 if (state
!= Py_None
) {
4464 if (! PyDict_Check(state
)) {
4465 PyErr_SetString(UnpicklingError
, "state is not a "
4469 dict
= PyObject_GetAttr(inst
, __dict___str
);
4474 while (PyDict_Next(state
, &i
, &d_key
, &d_value
)) {
4475 if (PyObject_SetItem(dict
, d_key
, d_value
) < 0)
4481 /* Also set instance attributes from the slotstate dict (if any). */
4482 if (slotstate
!= NULL
) {
4483 if (! PyDict_Check(slotstate
)) {
4484 PyErr_SetString(UnpicklingError
, "slot state is not "
4489 while (PyDict_Next(slotstate
, &i
, &d_key
, &d_value
)) {
4490 if (PyObject_SetAttr(inst
, d_key
, d_value
) < 0)
4498 Py_XDECREF(slotstate
);
4504 load_mark(Unpicklerobject
*self
)
4508 /* Note that we split the (pickle.py) stack into two stacks, an
4509 object stack and a mark stack. Here we push a mark onto the
4513 if ((self
->num_marks
+ 1) >= self
->marks_size
) {
4515 s
=self
->marks_size
+20;
4516 if (s
<= self
->num_marks
) s
=self
->num_marks
+ 1;
4517 if (self
->marks
== NULL
)
4518 marks
=(int *)malloc(s
* sizeof(int));
4520 marks
=(int *)realloc(self
->marks
,
4526 self
->marks
= marks
;
4527 self
->marks_size
= s
;
4530 self
->marks
[self
->num_marks
++] = self
->stack
->length
;
4536 load_reduce(Unpicklerobject
*self
)
4538 PyObject
*callable
= 0, *arg_tup
= 0, *ob
= 0;
4540 PDATA_POP(self
->stack
, arg_tup
);
4541 if (! arg_tup
) return -1;
4542 PDATA_POP(self
->stack
, callable
);
4544 ob
= Instance_New(callable
, arg_tup
);
4545 Py_DECREF(callable
);
4549 if (! ob
) return -1;
4551 PDATA_PUSH(self
->stack
, ob
, -1);
4555 /* Just raises an error if we don't know the protocol specified. PROTO
4556 * is the first opcode for protocols >= 2.
4559 load_proto(Unpicklerobject
*self
)
4564 i
= self
->read_func(self
, &protobyte
, 1);
4568 i
= calc_binint(protobyte
, 1);
4569 /* No point checking for < 0, since calc_binint returns an unsigned
4570 * int when chewing on 1 byte.
4573 if (i
<= HIGHEST_PROTOCOL
)
4576 PyErr_Format(PyExc_ValueError
, "unsupported pickle protocol: %d", i
);
4581 load(Unpicklerobject
*self
)
4583 PyObject
*err
= 0, *val
= 0;
4586 self
->num_marks
= 0;
4587 if (self
->stack
->length
) Pdata_clear(self
->stack
, 0);
4590 if (self
->read_func(self
, &s
, 1) < 0)
4595 if (load_none(self
) < 0)
4600 if (load_binint(self
) < 0)
4605 if (load_binint1(self
) < 0)
4610 if (load_binint2(self
) < 0)
4615 if (load_int(self
) < 0)
4620 if (load_long(self
) < 0)
4625 if (load_counted_long(self
, 1) < 0)
4630 if (load_counted_long(self
, 4) < 0)
4635 if (load_float(self
) < 0)
4640 if (load_binfloat(self
) < 0)
4645 if (load_binstring(self
) < 0)
4649 case SHORT_BINSTRING
:
4650 if (load_short_binstring(self
) < 0)
4655 if (load_string(self
) < 0)
4659 #ifdef Py_USING_UNICODE
4661 if (load_unicode(self
) < 0)
4666 if (load_binunicode(self
) < 0)
4672 if (load_counted_tuple(self
, 0) < 0)
4677 if (load_counted_tuple(self
, 1) < 0)
4682 if (load_counted_tuple(self
, 2) < 0)
4687 if (load_counted_tuple(self
, 3) < 0)
4692 if (load_tuple(self
) < 0)
4697 if (load_empty_list(self
) < 0)
4702 if (load_list(self
) < 0)
4707 if (load_empty_dict(self
) < 0)
4712 if (load_dict(self
) < 0)
4717 if (load_obj(self
) < 0)
4722 if (load_inst(self
) < 0)
4727 if (load_newobj(self
) < 0)
4732 if (load_global(self
) < 0)
4737 if (load_append(self
) < 0)
4742 if (load_appends(self
) < 0)
4747 if (load_build(self
) < 0)
4752 if (load_dup(self
) < 0)
4757 if (load_binget(self
) < 0)
4762 if (load_long_binget(self
) < 0)
4767 if (load_get(self
) < 0)
4772 if (load_extension(self
, 1) < 0)
4777 if (load_extension(self
, 2) < 0)
4782 if (load_extension(self
, 4) < 0)
4786 if (load_mark(self
) < 0)
4791 if (load_binput(self
) < 0)
4796 if (load_long_binput(self
) < 0)
4801 if (load_put(self
) < 0)
4806 if (load_pop(self
) < 0)
4811 if (load_pop_mark(self
) < 0)
4816 if (load_setitem(self
) < 0)
4821 if (load_setitems(self
) < 0)
4829 if (load_persid(self
) < 0)
4834 if (load_binpersid(self
) < 0)
4839 if (load_reduce(self
) < 0)
4844 if (load_proto(self
) < 0)
4849 if (load_bool(self
, Py_True
) < 0)
4854 if (load_bool(self
, Py_False
) < 0)
4860 PyErr_SetNone(PyExc_EOFError
);
4864 cPickle_ErrFormat(UnpicklingError
,
4865 "invalid load key, '%s'.",
4873 if ((err
= PyErr_Occurred())) {
4874 if (err
== PyExc_EOFError
) {
4875 PyErr_SetNone(PyExc_EOFError
);
4880 PDATA_POP(self
->stack
, val
);
4885 /* No-load functions to support noload, which is used to
4886 find persistent references. */
4889 noload_obj(Unpicklerobject
*self
)
4893 if ((i
= marker(self
)) < 0) return -1;
4894 return Pdata_clear(self
->stack
, i
+1);
4899 noload_inst(Unpicklerobject
*self
)
4904 if ((i
= marker(self
)) < 0) return -1;
4905 Pdata_clear(self
->stack
, i
);
4906 if (self
->readline_func(self
, &s
) < 0) return -1;
4907 if (self
->readline_func(self
, &s
) < 0) return -1;
4908 PDATA_APPEND(self
->stack
, Py_None
, -1);
4913 noload_newobj(Unpicklerobject
*self
)
4917 PDATA_POP(self
->stack
, obj
); /* pop argtuple */
4918 if (obj
== NULL
) return -1;
4921 PDATA_POP(self
->stack
, obj
); /* pop cls */
4922 if (obj
== NULL
) return -1;
4925 PDATA_APPEND(self
->stack
, Py_None
, -1);
4930 noload_global(Unpicklerobject
*self
)
4934 if (self
->readline_func(self
, &s
) < 0) return -1;
4935 if (self
->readline_func(self
, &s
) < 0) return -1;
4936 PDATA_APPEND(self
->stack
, Py_None
,-1);
4941 noload_reduce(Unpicklerobject
*self
)
4944 if (self
->stack
->length
< 2) return stackUnderflow();
4945 Pdata_clear(self
->stack
, self
->stack
->length
-2);
4946 PDATA_APPEND(self
->stack
, Py_None
,-1);
4951 noload_build(Unpicklerobject
*self
) {
4953 if (self
->stack
->length
< 1) return stackUnderflow();
4954 Pdata_clear(self
->stack
, self
->stack
->length
-1);
4959 noload_extension(Unpicklerobject
*self
, int nbytes
)
4963 assert(nbytes
== 1 || nbytes
== 2 || nbytes
== 4);
4964 if (self
->read_func(self
, &codebytes
, nbytes
) < 0) return -1;
4965 PDATA_APPEND(self
->stack
, Py_None
, -1);
4971 noload(Unpicklerobject
*self
)
4973 PyObject
*err
= 0, *val
= 0;
4976 self
->num_marks
= 0;
4977 Pdata_clear(self
->stack
, 0);
4980 if (self
->read_func(self
, &s
, 1) < 0)
4985 if (load_none(self
) < 0)
4990 if (load_binint(self
) < 0)
4995 if (load_binint1(self
) < 0)
5000 if (load_binint2(self
) < 0)
5005 if (load_int(self
) < 0)
5010 if (load_long(self
) < 0)
5015 if (load_counted_long(self
, 1) < 0)
5020 if (load_counted_long(self
, 4) < 0)
5025 if (load_float(self
) < 0)
5030 if (load_binfloat(self
) < 0)
5035 if (load_binstring(self
) < 0)
5039 case SHORT_BINSTRING
:
5040 if (load_short_binstring(self
) < 0)
5045 if (load_string(self
) < 0)
5049 #ifdef Py_USING_UNICODE
5051 if (load_unicode(self
) < 0)
5056 if (load_binunicode(self
) < 0)
5062 if (load_counted_tuple(self
, 0) < 0)
5067 if (load_counted_tuple(self
, 1) < 0)
5072 if (load_counted_tuple(self
, 2) < 0)
5077 if (load_counted_tuple(self
, 3) < 0)
5082 if (load_tuple(self
) < 0)
5087 if (load_empty_list(self
) < 0)
5092 if (load_list(self
) < 0)
5097 if (load_empty_dict(self
) < 0)
5102 if (load_dict(self
) < 0)
5107 if (noload_obj(self
) < 0)
5112 if (noload_inst(self
) < 0)
5117 if (noload_newobj(self
) < 0)
5122 if (noload_global(self
) < 0)
5127 if (load_append(self
) < 0)
5132 if (load_appends(self
) < 0)
5137 if (noload_build(self
) < 0)
5142 if (load_dup(self
) < 0)
5147 if (load_binget(self
) < 0)
5152 if (load_long_binget(self
) < 0)
5157 if (load_get(self
) < 0)
5162 if (noload_extension(self
, 1) < 0)
5167 if (noload_extension(self
, 2) < 0)
5172 if (noload_extension(self
, 4) < 0)
5177 if (load_mark(self
) < 0)
5182 if (load_binput(self
) < 0)
5187 if (load_long_binput(self
) < 0)
5192 if (load_put(self
) < 0)
5197 if (load_pop(self
) < 0)
5202 if (load_pop_mark(self
) < 0)
5207 if (load_setitem(self
) < 0)
5212 if (load_setitems(self
) < 0)
5220 if (load_persid(self
) < 0)
5225 if (load_binpersid(self
) < 0)
5230 if (noload_reduce(self
) < 0)
5235 if (load_proto(self
) < 0)
5240 if (load_bool(self
, Py_True
) < 0)
5245 if (load_bool(self
, Py_False
) < 0)
5249 cPickle_ErrFormat(UnpicklingError
,
5250 "invalid load key, '%s'.",
5258 if ((err
= PyErr_Occurred())) {
5259 if (err
== PyExc_EOFError
) {
5260 PyErr_SetNone(PyExc_EOFError
);
5265 PDATA_POP(self
->stack
, val
);
5271 Unpickler_load(Unpicklerobject
*self
, PyObject
*unused
)
5277 Unpickler_noload(Unpicklerobject
*self
, PyObject
*unused
)
5279 return noload(self
);
5283 static struct PyMethodDef Unpickler_methods
[] = {
5284 {"load", (PyCFunction
)Unpickler_load
, METH_NOARGS
,
5285 PyDoc_STR("load() -- Load a pickle")
5287 {"noload", (PyCFunction
)Unpickler_noload
, METH_NOARGS
,
5289 "noload() -- not load a pickle, but go through most of the motions\n"
5291 "This function can be used to read past a pickle without instantiating\n"
5292 "any objects or importing any modules. It can also be used to find all\n"
5293 "persistent references without instantiating any objects or importing\n"
5296 {NULL
, NULL
} /* sentinel */
5300 static Unpicklerobject
*
5301 newUnpicklerobject(PyObject
*f
)
5303 Unpicklerobject
*self
;
5305 if (!( self
= PyObject_GC_New(Unpicklerobject
, &Unpicklertype
)))
5310 self
->stack
= (Pdata
*)Pdata_New();
5311 self
->pers_func
= NULL
;
5312 self
->last_string
= NULL
;
5314 self
->num_marks
= 0;
5315 self
->marks_size
= 0;
5318 self
->readline
= NULL
;
5319 self
->find_class
= NULL
;
5321 if (!( self
->memo
= PyDict_New()))
5330 /* Set read, readline based on type of f */
5331 if (PyFile_Check(f
)) {
5332 self
->fp
= PyFile_AsFile(f
);
5333 if (self
->fp
== NULL
) {
5334 PyErr_SetString(PyExc_ValueError
,
5335 "I/O operation on closed file");
5338 self
->read_func
= read_file
;
5339 self
->readline_func
= readline_file
;
5341 else if (PycStringIO_InputCheck(f
)) {
5343 self
->read_func
= read_cStringIO
;
5344 self
->readline_func
= readline_cStringIO
;
5349 self
->read_func
= read_other
;
5350 self
->readline_func
= readline_other
;
5352 if (!( (self
->readline
= PyObject_GetAttr(f
, readline_str
)) &&
5353 (self
->read
= PyObject_GetAttr(f
, read_str
)))) {
5355 PyErr_SetString( PyExc_TypeError
,
5356 "argument must have 'read' and "
5357 "'readline' attributes" );
5361 PyObject_GC_Track(self
);
5366 Py_DECREF((PyObject
*)self
);
5372 get_Unpickler(PyObject
*self
, PyObject
*file
)
5374 return (PyObject
*)newUnpicklerobject(file
);
5379 Unpickler_dealloc(Unpicklerobject
*self
)
5381 PyObject_GC_UnTrack((PyObject
*)self
);
5382 Py_XDECREF(self
->readline
);
5383 Py_XDECREF(self
->read
);
5384 Py_XDECREF(self
->file
);
5385 Py_XDECREF(self
->memo
);
5386 Py_XDECREF(self
->stack
);
5387 Py_XDECREF(self
->pers_func
);
5388 Py_XDECREF(self
->arg
);
5389 Py_XDECREF(self
->last_string
);
5390 Py_XDECREF(self
->find_class
);
5396 if (self
->buf_size
) {
5400 Py_TYPE(self
)->tp_free((PyObject
*)self
);
5404 Unpickler_traverse(Unpicklerobject
*self
, visitproc visit
, void *arg
)
5406 Py_VISIT(self
->readline
);
5407 Py_VISIT(self
->read
);
5408 Py_VISIT(self
->file
);
5409 Py_VISIT(self
->memo
);
5410 Py_VISIT(self
->stack
);
5411 Py_VISIT(self
->pers_func
);
5412 Py_VISIT(self
->arg
);
5413 Py_VISIT(self
->last_string
);
5414 Py_VISIT(self
->find_class
);
5419 Unpickler_clear(Unpicklerobject
*self
)
5421 Py_CLEAR(self
->readline
);
5422 Py_CLEAR(self
->read
);
5423 Py_CLEAR(self
->file
);
5424 Py_CLEAR(self
->memo
);
5425 Py_CLEAR(self
->stack
);
5426 Py_CLEAR(self
->pers_func
);
5427 Py_CLEAR(self
->arg
);
5428 Py_CLEAR(self
->last_string
);
5429 Py_CLEAR(self
->find_class
);
5434 Unpickler_getattr(Unpicklerobject
*self
, char *name
)
5436 if (!strcmp(name
, "persistent_load")) {
5437 if (!self
->pers_func
) {
5438 PyErr_SetString(PyExc_AttributeError
, name
);
5442 Py_INCREF(self
->pers_func
);
5443 return self
->pers_func
;
5446 if (!strcmp(name
, "find_global")) {
5447 if (!self
->find_class
) {
5448 PyErr_SetString(PyExc_AttributeError
, name
);
5452 Py_INCREF(self
->find_class
);
5453 return self
->find_class
;
5456 if (!strcmp(name
, "memo")) {
5458 PyErr_SetString(PyExc_AttributeError
, name
);
5462 Py_INCREF(self
->memo
);
5466 if (!strcmp(name
, "UnpicklingError")) {
5467 Py_INCREF(UnpicklingError
);
5468 return UnpicklingError
;
5471 return Py_FindMethod(Unpickler_methods
, (PyObject
*)self
, name
);
5476 Unpickler_setattr(Unpicklerobject
*self
, char *name
, PyObject
*value
)
5479 if (!strcmp(name
, "persistent_load")) {
5480 Py_XDECREF(self
->pers_func
);
5481 self
->pers_func
= value
;
5486 if (!strcmp(name
, "find_global")) {
5487 Py_XDECREF(self
->find_class
);
5488 self
->find_class
= value
;
5494 PyErr_SetString(PyExc_TypeError
,
5495 "attribute deletion is not supported");
5499 if (strcmp(name
, "memo") == 0) {
5500 if (!PyDict_Check(value
)) {
5501 PyErr_SetString(PyExc_TypeError
,
5502 "memo must be a dictionary");
5505 Py_XDECREF(self
->memo
);
5511 PyErr_SetString(PyExc_AttributeError
, name
);
5515 /* ---------------------------------------------------------------------------
5516 * Module-level functions.
5519 /* dump(obj, file, protocol=0). */
5521 cpm_dump(PyObject
*self
, PyObject
*args
, PyObject
*kwds
)
5523 static char *kwlist
[] = {"obj", "file", "protocol", NULL
};
5524 PyObject
*ob
, *file
, *res
= NULL
;
5525 Picklerobject
*pickler
= 0;
5528 if (!( PyArg_ParseTupleAndKeywords(args
, kwds
, "OO|i", kwlist
,
5529 &ob
, &file
, &proto
)))
5532 if (!( pickler
= newPicklerobject(file
, proto
)))
5535 if (dump(pickler
, ob
) < 0)
5542 Py_XDECREF(pickler
);
5548 /* dumps(obj, protocol=0). */
5550 cpm_dumps(PyObject
*self
, PyObject
*args
, PyObject
*kwds
)
5552 static char *kwlist
[] = {"obj", "protocol", NULL
};
5553 PyObject
*ob
, *file
= 0, *res
= NULL
;
5554 Picklerobject
*pickler
= 0;
5557 if (!( PyArg_ParseTupleAndKeywords(args
, kwds
, "O|i:dumps", kwlist
,
5561 if (!( file
= PycStringIO
->NewOutput(128)))
5564 if (!( pickler
= newPicklerobject(file
, proto
)))
5567 if (dump(pickler
, ob
) < 0)
5570 res
= PycStringIO
->cgetvalue(file
);
5573 Py_XDECREF(pickler
);
5580 /* load(fileobj). */
5582 cpm_load(PyObject
*self
, PyObject
*ob
)
5584 Unpicklerobject
*unpickler
= 0;
5585 PyObject
*res
= NULL
;
5587 if (!( unpickler
= newUnpicklerobject(ob
)))
5590 res
= load(unpickler
);
5593 Py_XDECREF(unpickler
);
5601 cpm_loads(PyObject
*self
, PyObject
*args
)
5603 PyObject
*ob
, *file
= 0, *res
= NULL
;
5604 Unpicklerobject
*unpickler
= 0;
5606 if (!( PyArg_ParseTuple(args
, "S:loads", &ob
)))
5609 if (!( file
= PycStringIO
->NewInput(ob
)))
5612 if (!( unpickler
= newUnpicklerobject(file
)))
5615 res
= load(unpickler
);
5619 Py_XDECREF(unpickler
);
5625 PyDoc_STRVAR(Unpicklertype__doc__
,
5626 "Objects that know how to unpickle");
5628 static PyTypeObject Unpicklertype
= {
5629 PyVarObject_HEAD_INIT(NULL
, 0)
5630 "cPickle.Unpickler", /*tp_name*/
5631 sizeof(Unpicklerobject
), /*tp_basicsize*/
5633 (destructor
)Unpickler_dealloc
, /* tp_dealloc */
5635 (getattrfunc
)Unpickler_getattr
, /* tp_getattr */
5636 (setattrfunc
)Unpickler_setattr
, /* tp_setattr */
5639 0, /* tp_as_number */
5640 0, /* tp_as_sequence */
5641 0, /* tp_as_mapping */
5645 0, /* tp_getattro */
5646 0, /* tp_setattro */
5647 0, /* tp_as_buffer */
5648 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
| Py_TPFLAGS_HAVE_GC
,
5649 Unpicklertype__doc__
, /* tp_doc */
5650 (traverseproc
)Unpickler_traverse
, /* tp_traverse */
5651 (inquiry
)Unpickler_clear
, /* tp_clear */
5654 static struct PyMethodDef cPickle_methods
[] = {
5655 {"dump", (PyCFunction
)cpm_dump
, METH_VARARGS
| METH_KEYWORDS
,
5656 PyDoc_STR("dump(obj, file, protocol=0) -- "
5657 "Write an object in pickle format to the given file.\n"
5659 "See the Pickler docstring for the meaning of optional argument proto.")
5662 {"dumps", (PyCFunction
)cpm_dumps
, METH_VARARGS
| METH_KEYWORDS
,
5663 PyDoc_STR("dumps(obj, protocol=0) -- "
5664 "Return a string containing an object in pickle format.\n"
5666 "See the Pickler docstring for the meaning of optional argument proto.")
5669 {"load", (PyCFunction
)cpm_load
, METH_O
,
5670 PyDoc_STR("load(file) -- Load a pickle from the given file")},
5672 {"loads", (PyCFunction
)cpm_loads
, METH_VARARGS
,
5673 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
5675 {"Pickler", (PyCFunction
)get_Pickler
, METH_VARARGS
| METH_KEYWORDS
,
5676 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
5678 "This takes a file-like object for writing a pickle data stream.\n"
5679 "The optional proto argument tells the pickler to use the given\n"
5680 "protocol; supported protocols are 0, 1, 2. The default\n"
5681 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5682 "only protocol that can be written to a file opened in text\n"
5683 "mode and read back successfully. When using a protocol higher\n"
5684 "than 0, make sure the file is opened in binary mode, both when\n"
5685 "pickling and unpickling.)\n"
5687 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5688 "more efficient than protocol 1.\n"
5690 "Specifying a negative protocol version selects the highest\n"
5691 "protocol version supported. The higher the protocol used, the\n"
5692 "more recent the version of Python needed to read the pickle\n"
5695 "The file parameter must have a write() method that accepts a single\n"
5696 "string argument. It can thus be an open file object, a StringIO\n"
5697 "object, or any other custom object that meets this interface.\n")
5700 {"Unpickler", (PyCFunction
)get_Unpickler
, METH_O
,
5701 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5707 init_stuff(PyObject
*module_dict
)
5709 PyObject
*copyreg
, *t
, *r
;
5711 #define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
5713 if (PyType_Ready(&Unpicklertype
) < 0)
5715 if (PyType_Ready(&Picklertype
) < 0)
5718 INIT_STR(__class__
);
5719 INIT_STR(__getinitargs__
);
5721 INIT_STR(__getstate__
);
5722 INIT_STR(__setstate__
);
5725 INIT_STR(__reduce__
);
5726 INIT_STR(__reduce_ex__
);
5732 INIT_STR(dispatch_table
);
5734 if (!( copyreg
= PyImport_ImportModule("copy_reg")))
5737 /* This is special because we want to use a different
5738 one in restricted mode. */
5739 dispatch_table
= PyObject_GetAttr(copyreg
, dispatch_table_str
);
5740 if (!dispatch_table
) return -1;
5742 extension_registry
= PyObject_GetAttrString(copyreg
,
5743 "_extension_registry");
5744 if (!extension_registry
) return -1;
5746 inverted_registry
= PyObject_GetAttrString(copyreg
,
5747 "_inverted_registry");
5748 if (!inverted_registry
) return -1;
5750 extension_cache
= PyObject_GetAttrString(copyreg
,
5751 "_extension_cache");
5752 if (!extension_cache
) return -1;
5756 if (!(empty_tuple
= PyTuple_New(0)))
5759 two_tuple
= PyTuple_New(2);
5760 if (two_tuple
== NULL
)
5762 /* We use this temp container with no regard to refcounts, or to
5763 * keeping containees alive. Exempt from GC, because we don't
5764 * want anything looking at two_tuple() by magic.
5766 PyObject_GC_UnTrack(two_tuple
);
5769 if (!( t
=PyImport_ImportModule("__builtin__"))) return -1;
5770 if (PyDict_SetItemString(module_dict
, "__builtins__", t
) < 0)
5773 if (!( t
=PyDict_New())) return -1;
5774 if (!( r
=PyRun_String(
5775 "def __str__(self):\n"
5776 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5778 module_dict
, t
) )) return -1;
5781 PickleError
= PyErr_NewException("cPickle.PickleError", NULL
, t
);
5787 PicklingError
= PyErr_NewException("cPickle.PicklingError",
5792 if (!( t
=PyDict_New())) return -1;
5793 if (!( r
=PyRun_String(
5794 "def __str__(self):\n"
5796 " a=a and type(a[0]) or '(what)'\n"
5797 " return 'Cannot pickle %s objects' % a\n"
5799 module_dict
, t
) )) return -1;
5802 if (!( UnpickleableError
= PyErr_NewException(
5803 "cPickle.UnpickleableError", PicklingError
, t
)))
5808 if (!( UnpicklingError
= PyErr_NewException("cPickle.UnpicklingError",
5809 PickleError
, NULL
)))
5812 if (!( BadPickleGet
= PyErr_NewException("cPickle.BadPickleGet",
5813 UnpicklingError
, NULL
)))
5816 if (PyDict_SetItemString(module_dict
, "PickleError",
5820 if (PyDict_SetItemString(module_dict
, "PicklingError",
5824 if (PyDict_SetItemString(module_dict
, "UnpicklingError",
5825 UnpicklingError
) < 0)
5828 if (PyDict_SetItemString(module_dict
, "UnpickleableError",
5829 UnpickleableError
) < 0)
5832 if (PyDict_SetItemString(module_dict
, "BadPickleGet",
5841 #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5842 #define PyMODINIT_FUNC void
5847 PyObject
*m
, *d
, *di
, *v
, *k
;
5849 char *rev
= "1.71"; /* XXX when does this change? */
5850 PyObject
*format_version
;
5851 PyObject
*compatible_formats
;
5853 /* XXX: Should mention that the pickle module will include the C
5854 XXX: optimized implementation automatically. */
5855 if (PyErr_WarnPy3k("the cPickle module has been removed in "
5856 "Python 3.0", 2) < 0)
5859 Py_TYPE(&Picklertype
) = &PyType_Type
;
5860 Py_TYPE(&Unpicklertype
) = &PyType_Type
;
5861 Py_TYPE(&PdataType
) = &PyType_Type
;
5863 /* Initialize some pieces. We need to do this before module creation,
5864 * so we're forced to use a temporary dictionary. :(
5868 if (init_stuff(di
) < 0) return;
5870 /* Create the module and add the functions */
5871 m
= Py_InitModule4("cPickle", cPickle_methods
,
5872 cPickle_module_documentation
,
5873 (PyObject
*)NULL
,PYTHON_API_VERSION
);
5877 /* Add some symbolic constants to the module */
5878 d
= PyModule_GetDict(m
);
5879 v
= PyString_FromString(rev
);
5880 PyDict_SetItemString(d
, "__version__", v
);
5883 /* Copy data from di. Waaa. */
5884 for (i
=0; PyDict_Next(di
, &i
, &k
, &v
); ) {
5885 if (PyObject_SetItem(d
, k
, v
) < 0) {
5892 i
= PyModule_AddIntConstant(m
, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL
);
5896 /* These are purely informational; no code uses them. */
5897 /* File format version we write. */
5898 format_version
= PyString_FromString("2.0");
5899 /* Format versions we can read. */
5900 compatible_formats
= Py_BuildValue("[sssss]",
5901 "1.0", /* Original protocol 0 */
5902 "1.1", /* Protocol 0 + INST */
5903 "1.2", /* Original protocol 1 */
5904 "1.3", /* Protocol 1 + BINFLOAT */
5905 "2.0"); /* Original protocol 2 */
5906 PyDict_SetItemString(d
, "format_version", format_version
);
5907 PyDict_SetItemString(d
, "compatible_formats", compatible_formats
);
5908 Py_XDECREF(format_version
);
5909 Py_XDECREF(compatible_formats
);