3 #include "structmember.h"
5 PyDoc_STRVAR(cPickle_module_documentation
,
6 "C implementation and optimization of the Python pickle module.");
10 #define Py_eval_input eval_input
11 #endif /* Py_eval_input */
13 #define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
15 #define WRITE_BUF_SIZE 256
17 /* Bump this when new opcodes are added to the pickle protocol. */
18 #define HIGHEST_PROTOCOL 2
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
42 #define SHORT_BINSTRING 'U'
44 #define BINUNICODE 'X'
49 #define EMPTY_DICT '}'
54 #define LONG_BINGET 'j'
56 #define EMPTY_LIST ']'
60 #define LONG_BINPUT 'r'
63 #define EMPTY_TUPLE ')'
67 #define PROTO '\x80' /* identify pickle protocol */
68 #define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69 #define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70 #define EXT2 '\x83' /* ditto, but 2-byte index */
71 #define EXT4 '\x84' /* ditto, but 4-byte index */
72 #define TUPLE1 '\x85' /* build 1-tuple from stack top */
73 #define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74 #define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75 #define NEWTRUE '\x88' /* push True */
76 #define NEWFALSE '\x89' /* push False */
77 #define LONG1 '\x8a' /* push long from < 256 bytes */
78 #define LONG4 '\x8b' /* push really big long */
80 /* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
90 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
91 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
92 * break if this gets out of synch with pickle.py, but it's unclear that
93 * would help anything either.
95 #define BATCHSIZE 1000
97 static char MARKv
= MARK
;
99 static PyObject
*PickleError
;
100 static PyObject
*PicklingError
;
101 static PyObject
*UnpickleableError
;
102 static PyObject
*UnpicklingError
;
103 static PyObject
*BadPickleGet
;
105 /* As the name says, an empty tuple. */
106 static PyObject
*empty_tuple
;
108 /* copy_reg.dispatch_table, {type_object: pickling_function} */
109 static PyObject
*dispatch_table
;
111 /* For EXT[124] opcodes. */
112 /* copy_reg._extension_registry, {(module_name, function_name): code} */
113 static PyObject
*extension_registry
;
114 /* copy_reg._inverted_registry, {code: (module_name, function_name)} */
115 static PyObject
*inverted_registry
;
116 /* copy_reg._extension_cache, {code: object} */
117 static PyObject
*extension_cache
;
119 /* For looking up name pairs in copy_reg._extension_registry. */
120 static PyObject
*two_tuple
;
122 static PyObject
*__class___str
, *__getinitargs___str
, *__dict___str
,
123 *__getstate___str
, *__setstate___str
, *__name___str
, *__reduce___str
,
125 *write_str
, *append_str
,
126 *read_str
, *readline_str
, *__main___str
,
127 *copyreg_str
, *dispatch_table_str
;
129 /*************************************************************************
130 Internal Data type for pickle data. */
134 int length
; /* number of initial slots in data currently used */
135 int size
; /* number of slots in data allocated */
140 Pdata_dealloc(Pdata
*self
)
145 for (i
= self
->length
, p
= self
->data
; --i
>= 0; p
++) {
153 static PyTypeObject PdataType
= {
154 PyVarObject_HEAD_INIT(NULL
, 0) "cPickle.Pdata", sizeof(Pdata
), 0,
155 (destructor
)Pdata_dealloc
,
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
159 #define Pdata_Check(O) (Py_TYPE(O) == &PdataType)
166 if (!(self
= PyObject_New(Pdata
, &PdataType
)))
170 self
->data
= malloc(self
->size
* sizeof(PyObject
*));
172 return (PyObject
*)self
;
174 return PyErr_NoMemory();
180 PyErr_SetString(UnpicklingError
, "unpickling stack underflow");
184 /* Retain only the initial clearto items. If clearto >= the current
185 * number of items, this is a (non-erroneous) NOP.
188 Pdata_clear(Pdata
*self
, int clearto
)
193 if (clearto
< 0) return stackUnderflow();
194 if (clearto
>= self
->length
) return 0;
196 for (i
= self
->length
, p
= self
->data
+ clearto
;
201 self
->length
= clearto
;
207 Pdata_grow(Pdata
*self
)
213 bigger
= self
->size
<< 1;
214 if (bigger
<= 0) /* was 0, or new value overflows */
216 if ((int)(size_t)bigger
!= bigger
)
218 nbytes
= (size_t)bigger
* sizeof(PyObject
*);
219 if (nbytes
/ sizeof(PyObject
*) != (size_t)bigger
)
221 tmp
= realloc(self
->data
, nbytes
);
233 /* D is a Pdata*. Pop the topmost element and store it into V, which
234 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
235 * is raised and V is set to NULL. D and V may be evaluated several times.
237 #define PDATA_POP(D, V) { \
239 (V) = (D)->data[--((D)->length)]; \
241 PyErr_SetString(UnpicklingError, "bad pickle data"); \
246 /* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
247 * D. If the Pdata stack can't be grown to hold the new value, both
248 * raise MemoryError and execute "return ER". The difference is in ownership
249 * of O after: _PUSH transfers ownership of O from the caller to the stack
250 * (no incref of O is done, and in case of error O is decrefed), while
251 * _APPEND pushes a new reference.
254 /* Push O on stack D, giving ownership of O to the stack. */
255 #define PDATA_PUSH(D, O, ER) { \
256 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
257 Pdata_grow((Pdata*)(D)) < 0) { \
261 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
264 /* Push O on stack D, pushing a new reference. */
265 #define PDATA_APPEND(D, O, ER) { \
266 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
267 Pdata_grow((Pdata*)(D)) < 0) \
270 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
275 Pdata_popTuple(Pdata
*self
, int start
)
280 l
= self
->length
-start
;
284 for (i
= start
, j
= 0 ; j
< l
; i
++, j
++)
285 PyTuple_SET_ITEM(r
, j
, self
->data
[i
]);
287 self
->length
= start
;
292 Pdata_popList(Pdata
*self
, int start
)
297 l
=self
->length
-start
;
298 if (!( r
=PyList_New(l
))) return NULL
;
299 for (i
=start
, j
=0 ; j
< l
; i
++, j
++)
300 PyList_SET_ITEM(r
, j
, self
->data
[i
]);
306 /*************************************************************************/
308 #define ARG_TUP(self, o) { \
309 if (self->arg || (self->arg=PyTuple_New(1))) { \
310 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
311 PyTuple_SET_ITEM(self->arg,0,o); \
318 #define FREE_ARG_TUP(self) { \
319 if (Py_REFCNT(self->arg) > 1) { \
320 Py_DECREF(self->arg); \
325 typedef struct Picklerobject
{
333 PyObject
*inst_pers_func
;
335 /* pickle protocol number, >= 0 */
338 /* bool, true if proto > 0 */
341 int fast
; /* Fast mode doesn't save in memo, don't use if circ ref */
342 int (*write_func
)(struct Picklerobject
*, const char *, Py_ssize_t
);
345 PyObject
*dispatch_table
;
346 int fast_container
; /* count nested container dumps */
350 #ifndef PY_CPICKLE_FAST_LIMIT
351 #define PY_CPICKLE_FAST_LIMIT 50
354 static PyTypeObject Picklertype
;
356 typedef struct Unpicklerobject
{
367 PyObject
*last_string
;
371 Py_ssize_t (*read_func
)(struct Unpicklerobject
*, char **, Py_ssize_t
);
372 Py_ssize_t (*readline_func
)(struct Unpicklerobject
*, char **);
375 PyObject
*find_class
;
378 static PyTypeObject Unpicklertype
;
380 /* Forward decls that need the above structs */
381 static int save(Picklerobject
*, PyObject
*, int);
382 static int put2(Picklerobject
*, PyObject
*);
386 cPickle_ErrFormat(PyObject
*ErrType
, char *stringformat
, char *format
, ...)
389 PyObject
*args
=0, *retval
=0;
390 va_start(va
, format
);
392 if (format
) args
= Py_VaBuildValue(format
, va
);
394 if (format
&& ! args
) return NULL
;
395 if (stringformat
&& !(retval
=PyString_FromString(stringformat
)))
401 v
=PyString_Format(retval
, args
);
404 if (! v
) return NULL
;
409 if (args
) retval
=args
;
411 PyErr_SetObject(ErrType
,Py_None
);
414 PyErr_SetObject(ErrType
,retval
);
420 write_file(Picklerobject
*self
, const char *s
, Py_ssize_t n
)
422 size_t nbyteswritten
;
429 /* String too large */
433 PyFile_IncUseCount((PyFileObject
*)self
->file
);
434 Py_BEGIN_ALLOW_THREADS
435 nbyteswritten
= fwrite(s
, sizeof(char), n
, self
->fp
);
437 PyFile_DecUseCount((PyFileObject
*)self
->file
);
438 if (nbyteswritten
!= (size_t)n
) {
439 PyErr_SetFromErrno(PyExc_IOError
);
447 write_cStringIO(Picklerobject
*self
, const char *s
, Py_ssize_t n
)
453 if (PycStringIO
->cwrite((PyObject
*)self
->file
, s
, n
) != n
) {
461 write_none(Picklerobject
*self
, const char *s
, Py_ssize_t n
)
463 if (s
== NULL
) return 0;
464 if (n
> INT_MAX
) return -1;
469 write_other(Picklerobject
*self
, const char *s
, Py_ssize_t _n
)
471 PyObject
*py_str
= 0, *junk
= 0;
478 if (!( self
->buf_size
)) return 0;
479 py_str
= PyString_FromStringAndSize(self
->write_buf
,
485 if (self
->buf_size
&& (n
+ self
->buf_size
) > WRITE_BUF_SIZE
) {
486 if (write_other(self
, NULL
, 0) < 0)
490 if (n
> WRITE_BUF_SIZE
) {
492 PyString_FromStringAndSize(s
, n
)))
496 memcpy(self
->write_buf
+ self
->buf_size
, s
, n
);
503 /* object with write method */
504 ARG_TUP(self
, py_str
);
506 junk
= PyObject_Call(self
->write
, self
->arg
, NULL
);
509 if (junk
) Py_DECREF(junk
);
513 PDATA_PUSH(self
->file
, py_str
, -1);
521 read_file(Unpicklerobject
*self
, char **s
, Py_ssize_t n
)
525 if (self
->buf_size
== 0) {
528 size
= ((n
< 32) ? 32 : n
);
529 if (!( self
->buf
= (char *)malloc(size
))) {
534 self
->buf_size
= size
;
536 else if (n
> self
->buf_size
) {
537 char *newbuf
= (char *)realloc(self
->buf
, n
);
546 PyFile_IncUseCount((PyFileObject
*)self
->file
);
547 Py_BEGIN_ALLOW_THREADS
548 nbytesread
= fread(self
->buf
, sizeof(char), n
, self
->fp
);
550 PyFile_DecUseCount((PyFileObject
*)self
->file
);
551 if (nbytesread
!= (size_t)n
) {
552 if (feof(self
->fp
)) {
553 PyErr_SetNone(PyExc_EOFError
);
557 PyErr_SetFromErrno(PyExc_IOError
);
568 readline_file(Unpicklerobject
*self
, char **s
)
572 if (self
->buf_size
== 0) {
573 if (!( self
->buf
= (char *)malloc(40))) {
584 for (; i
< (self
->buf_size
- 1); i
++) {
585 if (feof(self
->fp
) ||
586 (self
->buf
[i
] = getc(self
->fp
)) == '\n') {
587 self
->buf
[i
+ 1] = '\0';
592 bigger
= self
->buf_size
<< 1;
593 if (bigger
<= 0) { /* overflow */
597 newbuf
= (char *)realloc(self
->buf
, bigger
);
603 self
->buf_size
= bigger
;
609 read_cStringIO(Unpicklerobject
*self
, char **s
, Py_ssize_t n
)
613 if (PycStringIO
->cread((PyObject
*)self
->file
, &ptr
, n
) != n
) {
614 PyErr_SetNone(PyExc_EOFError
);
625 readline_cStringIO(Unpicklerobject
*self
, char **s
)
630 if ((n
= PycStringIO
->creadline((PyObject
*)self
->file
, &ptr
)) < 0) {
641 read_other(Unpicklerobject
*self
, char **s
, Py_ssize_t n
)
643 PyObject
*bytes
, *str
=0;
645 if (!( bytes
= PyInt_FromSsize_t(n
))) return -1;
647 ARG_TUP(self
, bytes
);
649 str
= PyObject_Call(self
->read
, self
->arg
, NULL
);
652 if (! str
) return -1;
654 Py_XDECREF(self
->last_string
);
655 self
->last_string
= str
;
657 if (! (*s
= PyString_AsString(str
))) return -1;
663 readline_other(Unpicklerobject
*self
, char **s
)
668 if (!( str
= PyObject_CallObject(self
->readline
, empty_tuple
))) {
672 if ((str_size
= PyString_Size(str
)) < 0)
675 Py_XDECREF(self
->last_string
);
676 self
->last_string
= str
;
678 if (! (*s
= PyString_AsString(str
)))
684 /* Copy the first n bytes from s into newly malloc'ed memory, plus a
685 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
686 * The caller is responsible for free()'ing the return value.
689 pystrndup(const char *s
, int n
)
691 char *r
= (char *)malloc(n
+1);
693 return (char*)PyErr_NoMemory();
701 get(Picklerobject
*self
, PyObject
*id
)
703 PyObject
*value
, *mv
;
708 if (!( mv
= PyDict_GetItem(self
->memo
, id
))) {
709 PyErr_SetObject(PyExc_KeyError
, id
);
713 if (!( value
= PyTuple_GetItem(mv
, 0)))
716 if (!( PyInt_Check(value
))) {
717 PyErr_SetString(PicklingError
, "no int where int expected in memo");
720 c_value
= PyInt_AS_LONG((PyIntObject
*)value
);
724 PyOS_snprintf(s
+ 1, sizeof(s
) - 1, "%ld\n", c_value
);
727 else if (Pdata_Check(self
->file
)) {
728 if (write_other(self
, NULL
, 0) < 0) return -1;
729 PDATA_APPEND(self
->file
, mv
, -1);
735 s
[1] = (int)(c_value
& 0xff);
740 s
[1] = (int)(c_value
& 0xff);
741 s
[2] = (int)((c_value
>> 8) & 0xff);
742 s
[3] = (int)((c_value
>> 16) & 0xff);
743 s
[4] = (int)((c_value
>> 24) & 0xff);
748 if (self
->write_func(self
, s
, len
) < 0)
756 put(Picklerobject
*self
, PyObject
*ob
)
758 if (Py_REFCNT(ob
) < 2 || self
->fast
)
761 return put2(self
, ob
);
766 put2(Picklerobject
*self
, PyObject
*ob
)
772 PyObject
*py_ob_id
= 0, *memo_len
= 0, *t
= 0;
777 if ((p
= PyDict_Size(self
->memo
)) < 0)
780 /* Make sure memo keys are positive! */
782 * XXX And does "positive" really mean non-negative?
783 * XXX pickle.py starts with PUT index 0, not 1. This makes for
784 * XXX gratuitous differences between the pickling modules.
788 if (!( py_ob_id
= PyLong_FromVoidPtr(ob
)))
791 if (!( memo_len
= PyInt_FromLong(p
)))
794 if (!( t
= PyTuple_New(2)))
797 PyTuple_SET_ITEM(t
, 0, memo_len
);
799 PyTuple_SET_ITEM(t
, 1, ob
);
802 if (PyDict_SetItem(self
->memo
, py_ob_id
, t
) < 0)
807 PyOS_snprintf(c_str
+ 1, sizeof(c_str
) - 1, "%d\n", p
);
810 else if (Pdata_Check(self
->file
)) {
811 if (write_other(self
, NULL
, 0) < 0) return -1;
812 PDATA_APPEND(self
->file
, memo_len
, -1);
813 res
=0; /* Job well done ;) */
818 c_str
[0] = LONG_BINPUT
;
819 c_str
[1] = (int)(p
& 0xff);
820 c_str
[2] = (int)((p
>> 8) & 0xff);
821 c_str
[3] = (int)((p
>> 16) & 0xff);
822 c_str
[4] = (int)((p
>> 24) & 0xff);
832 if (self
->write_func(self
, c_str
, len
) < 0)
838 Py_XDECREF(py_ob_id
);
839 Py_XDECREF(memo_len
);
846 whichmodule(PyObject
*global
, PyObject
*global_name
)
849 PyObject
*module
= 0, *modules_dict
= 0,
850 *global_name_attr
= 0, *name
= 0;
852 module
= PyObject_GetAttrString(global
, "__module__");
855 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
860 if (!( modules_dict
= PySys_GetObject("modules")))
864 while ((j
= PyDict_Next(modules_dict
, &i
, &name
, &module
))) {
866 if (PyObject_Compare(name
, __main___str
)==0) continue;
868 global_name_attr
= PyObject_GetAttr(module
, global_name
);
869 if (!global_name_attr
) {
870 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
877 if (global_name_attr
!= global
) {
878 Py_DECREF(global_name_attr
);
882 Py_DECREF(global_name_attr
);
887 /* The following implements the rule in pickle.py added in 1.5
888 that used __main__ if no module is found. I don't actually
902 fast_save_enter(Picklerobject
*self
, PyObject
*obj
)
904 /* if fast_container < 0, we're doing an error exit. */
905 if (++self
->fast_container
>= PY_CPICKLE_FAST_LIMIT
) {
906 PyObject
*key
= NULL
;
907 if (self
->fast_memo
== NULL
) {
908 self
->fast_memo
= PyDict_New();
909 if (self
->fast_memo
== NULL
) {
910 self
->fast_container
= -1;
914 key
= PyLong_FromVoidPtr(obj
);
917 if (PyDict_GetItem(self
->fast_memo
, key
)) {
919 PyErr_Format(PyExc_ValueError
,
920 "fast mode: can't pickle cyclic objects "
921 "including object type %s at %p",
922 Py_TYPE(obj
)->tp_name
, obj
);
923 self
->fast_container
= -1;
926 if (PyDict_SetItem(self
->fast_memo
, key
, Py_None
) < 0) {
928 self
->fast_container
= -1;
937 fast_save_leave(Picklerobject
*self
, PyObject
*obj
)
939 if (self
->fast_container
-- >= PY_CPICKLE_FAST_LIMIT
) {
940 PyObject
*key
= PyLong_FromVoidPtr(obj
);
943 if (PyDict_DelItem(self
->fast_memo
, key
) < 0) {
953 save_none(Picklerobject
*self
, PyObject
*args
)
955 static char none
= NONE
;
956 if (self
->write_func(self
, &none
, 1) < 0)
963 save_bool(Picklerobject
*self
, PyObject
*args
)
965 static const char *buf
[2] = {FALSE
, TRUE
};
966 static char len
[2] = {sizeof(FALSE
)-1, sizeof(TRUE
)-1};
967 long l
= PyInt_AS_LONG((PyIntObject
*)args
);
969 if (self
->proto
>= 2) {
970 char opcode
= l
? NEWTRUE
: NEWFALSE
;
971 if (self
->write_func(self
, &opcode
, 1) < 0)
974 else if (self
->write_func(self
, buf
[l
], len
[l
]) < 0)
980 save_int(Picklerobject
*self
, PyObject
*args
)
983 long l
= PyInt_AS_LONG((PyIntObject
*)args
);
992 /* Text-mode pickle, or long too big to fit in the 4-byte
993 * signed BININT format: store as a string.
996 PyOS_snprintf(c_str
+ 1, sizeof(c_str
) - 1, "%ld\n", l
);
997 if (self
->write_func(self
, c_str
, strlen(c_str
)) < 0)
1001 /* Binary pickle and l fits in a signed 4-byte int. */
1002 c_str
[1] = (int)( l
& 0xff);
1003 c_str
[2] = (int)((l
>> 8) & 0xff);
1004 c_str
[3] = (int)((l
>> 16) & 0xff);
1005 c_str
[4] = (int)((l
>> 24) & 0xff);
1007 if ((c_str
[4] == 0) && (c_str
[3] == 0)) {
1008 if (c_str
[2] == 0) {
1022 if (self
->write_func(self
, c_str
, len
) < 0)
1031 save_long(Picklerobject
*self
, PyObject
*args
)
1035 PyObject
*repr
= NULL
;
1037 static char l
= LONG
;
1039 if (self
->proto
>= 2) {
1040 /* Linear-time pickling. */
1043 unsigned char *pdata
;
1046 int sign
= _PyLong_Sign(args
);
1049 /* It's 0 -- an empty bytestring. */
1052 i
= self
->write_func(self
, c_str
, 2);
1053 if (i
< 0) goto finally
;
1057 nbits
= _PyLong_NumBits(args
);
1058 if (nbits
== (size_t)-1 && PyErr_Occurred())
1060 /* How many bytes do we need? There are nbits >> 3 full
1061 * bytes of data, and nbits & 7 leftover bits. If there
1062 * are any leftover bits, then we clearly need another
1063 * byte. Wnat's not so obvious is that we *probably*
1064 * need another byte even if there aren't any leftovers:
1065 * the most-significant bit of the most-significant byte
1066 * acts like a sign bit, and it's usually got a sense
1067 * opposite of the one we need. The exception is longs
1068 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1069 * its own 256's-complement, so has the right sign bit
1070 * even without the extra byte. That's a pain to check
1071 * for in advance, though, so we always grab an extra
1072 * byte at the start, and cut it back later if possible.
1074 nbytes
= (nbits
>> 3) + 1;
1075 if (nbytes
> INT_MAX
) {
1076 PyErr_SetString(PyExc_OverflowError
, "long too large "
1080 repr
= PyString_FromStringAndSize(NULL
, (int)nbytes
);
1081 if (repr
== NULL
) goto finally
;
1082 pdata
= (unsigned char *)PyString_AS_STRING(repr
);
1083 i
= _PyLong_AsByteArray((PyLongObject
*)args
,
1085 1 /* little endian */, 1 /* signed */);
1086 if (i
< 0) goto finally
;
1087 /* If the long is negative, this may be a byte more than
1088 * needed. This is so iff the MSB is all redundant sign
1091 if (sign
< 0 && nbytes
> 1 && pdata
[nbytes
- 1] == 0xff &&
1092 (pdata
[nbytes
- 2] & 0x80) != 0)
1097 c_str
[1] = (char)nbytes
;
1103 for (i
= 1; i
< 5; i
++) {
1104 c_str
[i
] = (char)(size
& 0xff);
1109 i
= self
->write_func(self
, c_str
, size
);
1110 if (i
< 0) goto finally
;
1111 i
= self
->write_func(self
, (char *)pdata
, (int)nbytes
);
1112 if (i
< 0) goto finally
;
1117 /* proto < 2: write the repr and newline. This is quadratic-time
1118 * (in the number of digits), in both directions.
1120 if (!( repr
= PyObject_Repr(args
)))
1123 if ((size
= PyString_Size(repr
)) < 0)
1126 if (self
->write_func(self
, &l
, 1) < 0)
1129 if (self
->write_func(self
,
1130 PyString_AS_STRING((PyStringObject
*)repr
),
1134 if (self
->write_func(self
, "\n", 1) < 0)
1146 save_float(Picklerobject
*self
, PyObject
*args
)
1148 double x
= PyFloat_AS_DOUBLE((PyFloatObject
*)args
);
1153 if (_PyFloat_Pack8(x
, (unsigned char *)&str
[1], 0) < 0)
1155 if (self
->write_func(self
, str
, 9) < 0)
1161 PyOS_ascii_formatd(c_str
+ 1, sizeof(c_str
) - 2, "%.17g", x
);
1162 /* Extend the formatted string with a newline character */
1163 strcat(c_str
, "\n");
1165 if (self
->write_func(self
, c_str
, strlen(c_str
)) < 0)
1174 save_string(Picklerobject
*self
, PyObject
*args
, int doput
)
1179 if ((size
= PyString_Size(args
)) < 0)
1185 static char string
= STRING
;
1187 if (!( repr
= PyObject_Repr(args
)))
1190 if ((len
= PyString_Size(repr
)) < 0)
1192 repr_str
= PyString_AS_STRING((PyStringObject
*)repr
);
1194 if (self
->write_func(self
, &string
, 1) < 0)
1197 if (self
->write_func(self
, repr_str
, len
) < 0)
1200 if (self
->write_func(self
, "\n", 1) < 0)
1209 if ((size
= PyString_Size(args
)) < 0)
1213 c_str
[0] = SHORT_BINSTRING
;
1217 else if (size
<= INT_MAX
) {
1218 c_str
[0] = BINSTRING
;
1219 for (i
= 1; i
< 5; i
++)
1220 c_str
[i
] = (int)(size
>> ((i
- 1) * 8));
1224 return -1; /* string too large */
1226 if (self
->write_func(self
, c_str
, len
) < 0)
1229 if (size
> 128 && Pdata_Check(self
->file
)) {
1230 if (write_other(self
, NULL
, 0) < 0) return -1;
1231 PDATA_APPEND(self
->file
, args
, -1);
1234 if (self
->write_func(self
,
1236 (PyStringObject
*)args
),
1243 if (put(self
, args
) < 0)
1254 #ifdef Py_USING_UNICODE
1255 /* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1256 backslash and newline characters to \uXXXX escapes. */
1258 modified_EncodeRawUnicodeEscape(const Py_UNICODE
*s
, int size
)
1264 static const char *hexdigit
= "0123456789ABCDEF";
1266 repr
= PyString_FromStringAndSize(NULL
, 6 * size
);
1272 p
= q
= PyString_AS_STRING(repr
);
1273 while (size
-- > 0) {
1274 Py_UNICODE ch
= *s
++;
1275 /* Map 16-bit characters to '\uxxxx' */
1276 if (ch
>= 256 || ch
== '\\' || ch
== '\n') {
1279 *p
++ = hexdigit
[(ch
>> 12) & 0xf];
1280 *p
++ = hexdigit
[(ch
>> 8) & 0xf];
1281 *p
++ = hexdigit
[(ch
>> 4) & 0xf];
1282 *p
++ = hexdigit
[ch
& 15];
1284 /* Copy everything else as-is */
1289 _PyString_Resize(&repr
, p
- q
);
1295 save_unicode(Picklerobject
*self
, PyObject
*args
, int doput
)
1297 Py_ssize_t size
, len
;
1300 if (!PyUnicode_Check(args
))
1305 static char string
= UNICODE
;
1307 repr
= modified_EncodeRawUnicodeEscape(
1308 PyUnicode_AS_UNICODE(args
), PyUnicode_GET_SIZE(args
));
1312 if ((len
= PyString_Size(repr
)) < 0)
1314 repr_str
= PyString_AS_STRING((PyStringObject
*)repr
);
1316 if (self
->write_func(self
, &string
, 1) < 0)
1319 if (self
->write_func(self
, repr_str
, len
) < 0)
1322 if (self
->write_func(self
, "\n", 1) < 0)
1331 if (!( repr
= PyUnicode_AsUTF8String(args
)))
1334 if ((size
= PyString_Size(repr
)) < 0)
1337 return -1; /* string too large */
1339 c_str
[0] = BINUNICODE
;
1340 for (i
= 1; i
< 5; i
++)
1341 c_str
[i
] = (int)(size
>> ((i
- 1) * 8));
1344 if (self
->write_func(self
, c_str
, len
) < 0)
1347 if (size
> 128 && Pdata_Check(self
->file
)) {
1348 if (write_other(self
, NULL
, 0) < 0)
1350 PDATA_APPEND(self
->file
, repr
, -1);
1353 if (self
->write_func(self
, PyString_AS_STRING(repr
),
1362 if (put(self
, args
) < 0)
1373 /* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1375 store_tuple_elements(Picklerobject
*self
, PyObject
*t
, int len
)
1378 int res
= -1; /* guilty until proved innocent */
1380 assert(PyTuple_Size(t
) == len
);
1382 for (i
= 0; i
< len
; i
++) {
1383 PyObject
*element
= PyTuple_GET_ITEM(t
, i
);
1385 if (element
== NULL
)
1387 if (save(self
, element
, 0) < 0)
1396 /* Tuples are ubiquitous in the pickle protocols, so many techniques are
1397 * used across protocols to minimize the space needed to pickle them.
1398 * Tuples are also the only builtin immutable type that can be recursive
1399 * (a tuple can be reached from itself), and that requires some subtle
1400 * magic so that it works in all cases. IOW, this is a long routine.
1403 save_tuple(Picklerobject
*self
, PyObject
*args
)
1405 PyObject
*py_tuple_id
= NULL
;
1409 static char tuple
= TUPLE
;
1410 static char pop
= POP
;
1411 static char pop_mark
= POP_MARK
;
1412 static char len2opcode
[] = {EMPTY_TUPLE
, TUPLE1
, TUPLE2
, TUPLE3
};
1414 if ((len
= PyTuple_Size(args
)) < 0)
1421 c_str
[0] = EMPTY_TUPLE
;
1429 if (self
->write_func(self
, c_str
, len
) >= 0)
1431 /* Don't memoize an empty tuple. */
1435 /* A non-empty tuple. */
1437 /* id(tuple) isn't in the memo now. If it shows up there after
1438 * saving the tuple elements, the tuple must be recursive, in
1439 * which case we'll pop everything we put on the stack, and fetch
1440 * its value from the memo.
1442 py_tuple_id
= PyLong_FromVoidPtr(args
);
1443 if (py_tuple_id
== NULL
)
1446 if (len
<= 3 && self
->proto
>= 2) {
1447 /* Use TUPLE{1,2,3} opcodes. */
1448 if (store_tuple_elements(self
, args
, len
) < 0)
1450 if (PyDict_GetItem(self
->memo
, py_tuple_id
)) {
1451 /* pop the len elements */
1452 for (i
= 0; i
< len
; ++i
)
1453 if (self
->write_func(self
, &pop
, 1) < 0)
1455 /* fetch from memo */
1456 if (get(self
, py_tuple_id
) < 0)
1461 /* Not recursive. */
1462 if (self
->write_func(self
, len2opcode
+ len
, 1) < 0)
1467 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1468 * Generate MARK elt1 elt2 ... TUPLE
1470 if (self
->write_func(self
, &MARKv
, 1) < 0)
1473 if (store_tuple_elements(self
, args
, len
) < 0)
1476 if (PyDict_GetItem(self
->memo
, py_tuple_id
)) {
1477 /* pop the stack stuff we pushed */
1479 if (self
->write_func(self
, &pop_mark
, 1) < 0)
1483 /* Note that we pop one more than len, to remove
1486 for (i
= 0; i
<= len
; i
++)
1487 if (self
->write_func(self
, &pop
, 1) < 0)
1490 /* fetch from memo */
1491 if (get(self
, py_tuple_id
) >= 0)
1496 /* Not recursive. */
1497 if (self
->write_func(self
, &tuple
, 1) < 0)
1501 if (put(self
, args
) >= 0)
1505 Py_XDECREF(py_tuple_id
);
1509 /* iter is an iterator giving items, and we batch up chunks of
1510 * MARK item item ... item APPENDS
1511 * opcode sequences. Calling code should have arranged to first create an
1512 * empty list, or list-like object, for the APPENDS to operate on.
1513 * Returns 0 on success, <0 on error.
1516 batch_list(Picklerobject
*self
, PyObject
*iter
)
1518 PyObject
*obj
= NULL
;
1519 PyObject
*firstitem
= NULL
;
1522 static char append
= APPEND
;
1523 static char appends
= APPENDS
;
1525 assert(iter
!= NULL
);
1527 if (self
->proto
== 0) {
1528 /* APPENDS isn't available; do one at a time. */
1530 obj
= PyIter_Next(iter
);
1532 if (PyErr_Occurred())
1536 i
= save(self
, obj
, 0);
1540 if (self
->write_func(self
, &append
, 1) < 0)
1546 /* proto > 0: write in batches of BATCHSIZE. */
1548 /* Get first item */
1549 firstitem
= PyIter_Next(iter
);
1550 if (firstitem
== NULL
) {
1551 if (PyErr_Occurred())
1554 /* nothing more to add */
1558 /* Try to get a second item */
1559 obj
= PyIter_Next(iter
);
1561 if (PyErr_Occurred())
1564 /* Only one item to write */
1565 if (save(self
, firstitem
, 0) < 0)
1567 if (self
->write_func(self
, &append
, 1) < 0)
1569 Py_CLEAR(firstitem
);
1573 /* More than one item to write */
1575 /* Pump out MARK, items, APPENDS. */
1576 if (self
->write_func(self
, &MARKv
, 1) < 0)
1579 if (save(self
, firstitem
, 0) < 0)
1581 Py_CLEAR(firstitem
);
1584 /* Fetch and save up to BATCHSIZE items */
1586 if (save(self
, obj
, 0) < 0)
1594 obj
= PyIter_Next(iter
);
1596 if (PyErr_Occurred())
1602 if (self
->write_func(self
, &appends
, 1) < 0)
1605 } while (n
== BATCHSIZE
);
1609 Py_XDECREF(firstitem
);
1615 save_list(Picklerobject
*self
, PyObject
*args
)
1622 if (self
->fast
&& !fast_save_enter(self
, args
))
1625 /* Create an empty list. */
1636 if (self
->write_func(self
, s
, len
) < 0)
1639 /* Get list length, and bow out early if empty. */
1640 if ((len
= PyList_Size(args
)) < 0)
1645 if (put(self
, args
) >= 0)
1649 if (put2(self
, args
) < 0)
1652 /* Materialize the list elements. */
1653 iter
= PyObject_GetIter(args
);
1657 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1659 res
= batch_list(self
, iter
);
1660 Py_LeaveRecursiveCall();
1665 if (self
->fast
&& !fast_save_leave(self
, args
))
1672 /* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1673 * MARK key value ... key value SETITEMS
1674 * opcode sequences. Calling code should have arranged to first create an
1675 * empty dict, or dict-like object, for the SETITEMS to operate on.
1676 * Returns 0 on success, <0 on error.
1678 * This is very much like batch_list(). The difference between saving
1679 * elements directly, and picking apart two-tuples, is so long-winded at
1680 * the C level, though, that attempts to combine these routines were too
1684 batch_dict(Picklerobject
*self
, PyObject
*iter
)
1687 PyObject
*firstitem
= NULL
;
1690 static char setitem
= SETITEM
;
1691 static char setitems
= SETITEMS
;
1693 assert(iter
!= NULL
);
1695 if (self
->proto
== 0) {
1696 /* SETITEMS isn't available; do one at a time. */
1698 p
= PyIter_Next(iter
);
1700 if (PyErr_Occurred())
1704 if (!PyTuple_Check(p
) || PyTuple_Size(p
) != 2) {
1705 PyErr_SetString(PyExc_TypeError
, "dict items "
1706 "iterator must return 2-tuples");
1709 i
= save(self
, PyTuple_GET_ITEM(p
, 0), 0);
1711 i
= save(self
, PyTuple_GET_ITEM(p
, 1), 0);
1715 if (self
->write_func(self
, &setitem
, 1) < 0)
1721 /* proto > 0: write in batches of BATCHSIZE. */
1723 /* Get first item */
1724 firstitem
= PyIter_Next(iter
);
1725 if (firstitem
== NULL
) {
1726 if (PyErr_Occurred())
1729 /* nothing more to add */
1732 if (!PyTuple_Check(firstitem
) || PyTuple_Size(firstitem
) != 2) {
1733 PyErr_SetString(PyExc_TypeError
, "dict items "
1734 "iterator must return 2-tuples");
1738 /* Try to get a second item */
1739 p
= PyIter_Next(iter
);
1741 if (PyErr_Occurred())
1744 /* Only one item to write */
1745 if (save(self
, PyTuple_GET_ITEM(firstitem
, 0), 0) < 0)
1747 if (save(self
, PyTuple_GET_ITEM(firstitem
, 1), 0) < 0)
1749 if (self
->write_func(self
, &setitem
, 1) < 0)
1751 Py_CLEAR(firstitem
);
1755 /* More than one item to write */
1757 /* Pump out MARK, items, SETITEMS. */
1758 if (self
->write_func(self
, &MARKv
, 1) < 0)
1761 if (save(self
, PyTuple_GET_ITEM(firstitem
, 0), 0) < 0)
1763 if (save(self
, PyTuple_GET_ITEM(firstitem
, 1), 0) < 0)
1765 Py_CLEAR(firstitem
);
1768 /* Fetch and save up to BATCHSIZE items */
1770 if (!PyTuple_Check(p
) || PyTuple_Size(p
) != 2) {
1771 PyErr_SetString(PyExc_TypeError
, "dict items "
1772 "iterator must return 2-tuples");
1775 if (save(self
, PyTuple_GET_ITEM(p
, 0), 0) < 0)
1777 if (save(self
, PyTuple_GET_ITEM(p
, 1), 0) < 0)
1785 p
= PyIter_Next(iter
);
1787 if (PyErr_Occurred())
1793 if (self
->write_func(self
, &setitems
, 1) < 0)
1796 } while (n
== BATCHSIZE
);
1800 Py_XDECREF(firstitem
);
1806 save_dict(Picklerobject
*self
, PyObject
*args
)
1813 if (self
->fast
&& !fast_save_enter(self
, args
))
1816 /* Create an empty dict. */
1827 if (self
->write_func(self
, s
, len
) < 0)
1830 /* Get dict size, and bow out early if empty. */
1831 if ((len
= PyDict_Size(args
)) < 0)
1835 if (put(self
, args
) >= 0)
1839 if (put2(self
, args
) < 0)
1842 /* Materialize the dict items. */
1843 iter
= PyObject_CallMethod(args
, "iteritems", "()");
1846 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1848 res
= batch_dict(self
, iter
);
1849 Py_LeaveRecursiveCall();
1854 if (self
->fast
&& !fast_save_leave(self
, args
))
1862 save_inst(Picklerobject
*self
, PyObject
*args
)
1864 PyObject
*class = 0, *module
= 0, *name
= 0, *state
= 0,
1865 *getinitargs_func
= 0, *getstate_func
= 0, *class_args
= 0;
1866 char *module_str
, *name_str
;
1867 int module_size
, name_size
, res
= -1;
1869 static char inst
= INST
, obj
= OBJ
, build
= BUILD
;
1871 if (self
->fast
&& !fast_save_enter(self
, args
))
1874 if (self
->write_func(self
, &MARKv
, 1) < 0)
1877 if (!( class = PyObject_GetAttr(args
, __class___str
)))
1881 if (save(self
, class, 0) < 0)
1885 if ((getinitargs_func
= PyObject_GetAttr(args
, __getinitargs___str
))) {
1886 PyObject
*element
= 0;
1890 PyObject_Call(getinitargs_func
, empty_tuple
, NULL
)))
1893 if ((len
= PyObject_Size(class_args
)) < 0)
1896 for (i
= 0; i
< len
; i
++) {
1897 if (!( element
= PySequence_GetItem(class_args
, i
)))
1900 if (save(self
, element
, 0) < 0) {
1909 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
1916 if (!( name
= ((PyClassObject
*)class)->cl_name
)) {
1917 PyErr_SetString(PicklingError
, "class has no name");
1921 if (!( module
= whichmodule(class, name
)))
1925 if ((module_size
= PyString_Size(module
)) < 0 ||
1926 (name_size
= PyString_Size(name
)) < 0)
1929 module_str
= PyString_AS_STRING((PyStringObject
*)module
);
1930 name_str
= PyString_AS_STRING((PyStringObject
*)name
);
1932 if (self
->write_func(self
, &inst
, 1) < 0)
1935 if (self
->write_func(self
, module_str
, module_size
) < 0)
1938 if (self
->write_func(self
, "\n", 1) < 0)
1941 if (self
->write_func(self
, name_str
, name_size
) < 0)
1944 if (self
->write_func(self
, "\n", 1) < 0)
1947 else if (self
->write_func(self
, &obj
, 1) < 0) {
1951 if ((getstate_func
= PyObject_GetAttr(args
, __getstate___str
))) {
1952 state
= PyObject_Call(getstate_func
, empty_tuple
, NULL
);
1957 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
1962 if (!( state
= PyObject_GetAttr(args
, __dict___str
))) {
1963 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
1972 if (!PyDict_Check(state
)) {
1973 if (put2(self
, args
) < 0)
1977 if (put(self
, args
) < 0)
1981 if (save(self
, state
, 0) < 0)
1984 if (self
->write_func(self
, &build
, 1) < 0)
1990 if (self
->fast
&& !fast_save_leave(self
, args
))
1996 Py_XDECREF(getinitargs_func
);
1997 Py_XDECREF(getstate_func
);
1998 Py_XDECREF(class_args
);
2005 save_global(Picklerobject
*self
, PyObject
*args
, PyObject
*name
)
2007 PyObject
*global_name
= 0, *module
= 0, *mod
= 0, *klass
= 0;
2008 char *name_str
, *module_str
;
2009 int module_size
, name_size
, res
= -1;
2011 static char global
= GLOBAL
;
2015 Py_INCREF(global_name
);
2018 if (!( global_name
= PyObject_GetAttr(args
, __name___str
)))
2022 if (!( module
= whichmodule(args
, global_name
)))
2025 if ((module_size
= PyString_Size(module
)) < 0 ||
2026 (name_size
= PyString_Size(global_name
)) < 0)
2029 module_str
= PyString_AS_STRING((PyStringObject
*)module
);
2030 name_str
= PyString_AS_STRING((PyStringObject
*)global_name
);
2032 /* XXX This can be doing a relative import. Clearly it shouldn't,
2033 but I don't know how to stop it. :-( */
2034 mod
= PyImport_ImportModule(module_str
);
2036 cPickle_ErrFormat(PicklingError
,
2037 "Can't pickle %s: import of module %s "
2039 "OS", args
, module
);
2042 klass
= PyObject_GetAttrString(mod
, name_str
);
2043 if (klass
== NULL
) {
2044 cPickle_ErrFormat(PicklingError
,
2045 "Can't pickle %s: attribute lookup %s.%s "
2047 "OSS", args
, module
, global_name
);
2050 if (klass
!= args
) {
2052 cPickle_ErrFormat(PicklingError
,
2053 "Can't pickle %s: it's not the same object "
2055 "OSS", args
, module
, global_name
);
2060 if (self
->proto
>= 2) {
2061 /* See whether this is in the extension registry, and if
2062 * so generate an EXT opcode.
2064 PyObject
*py_code
; /* extension code as Python object */
2065 long code
; /* extension code as C value */
2069 PyTuple_SET_ITEM(two_tuple
, 0, module
);
2070 PyTuple_SET_ITEM(two_tuple
, 1, global_name
);
2071 py_code
= PyDict_GetItem(extension_registry
, two_tuple
);
2072 if (py_code
== NULL
)
2073 goto gen_global
; /* not registered */
2075 /* Verify py_code has the right type and value. */
2076 if (!PyInt_Check(py_code
)) {
2077 cPickle_ErrFormat(PicklingError
, "Can't pickle %s: "
2078 "extension code %s isn't an integer",
2079 "OO", args
, py_code
);
2082 code
= PyInt_AS_LONG(py_code
);
2083 if (code
<= 0 || code
> 0x7fffffffL
) {
2084 cPickle_ErrFormat(PicklingError
, "Can't pickle %s: "
2085 "extension code %ld is out of range",
2090 /* Generate an EXT opcode. */
2093 c_str
[1] = (char)code
;
2096 else if (code
<= 0xffff) {
2098 c_str
[1] = (char)(code
& 0xff);
2099 c_str
[2] = (char)((code
>> 8) & 0xff);
2104 c_str
[1] = (char)(code
& 0xff);
2105 c_str
[2] = (char)((code
>> 8) & 0xff);
2106 c_str
[3] = (char)((code
>> 16) & 0xff);
2107 c_str
[4] = (char)((code
>> 24) & 0xff);
2111 if (self
->write_func(self
, c_str
, n
) >= 0)
2113 goto finally
; /* and don't memoize */
2117 if (self
->write_func(self
, &global
, 1) < 0)
2120 if (self
->write_func(self
, module_str
, module_size
) < 0)
2123 if (self
->write_func(self
, "\n", 1) < 0)
2126 if (self
->write_func(self
, name_str
, name_size
) < 0)
2129 if (self
->write_func(self
, "\n", 1) < 0)
2132 if (put(self
, args
) < 0)
2139 Py_XDECREF(global_name
);
2146 save_pers(Picklerobject
*self
, PyObject
*args
, PyObject
*f
)
2151 static char persid
= PERSID
, binpersid
= BINPERSID
;
2154 ARG_TUP(self
, args
);
2156 pid
= PyObject_Call(f
, self
->arg
, NULL
);
2159 if (! pid
) return -1;
2161 if (pid
!= Py_None
) {
2163 if (!PyString_Check(pid
)) {
2164 PyErr_SetString(PicklingError
,
2165 "persistent id must be string");
2169 if (self
->write_func(self
, &persid
, 1) < 0)
2172 if ((size
= PyString_Size(pid
)) < 0)
2175 if (self
->write_func(self
,
2177 (PyStringObject
*)pid
),
2181 if (self
->write_func(self
, "\n", 1) < 0)
2187 else if (save(self
, pid
, 1) >= 0) {
2188 if (self
->write_func(self
, &binpersid
, 1) < 0)
2205 /* We're saving ob, and args is the 2-thru-5 tuple returned by the
2206 * appropriate __reduce__ method for ob.
2209 save_reduce(Picklerobject
*self
, PyObject
*args
, PyObject
*ob
)
2213 PyObject
*state
= NULL
;
2214 PyObject
*listitems
= NULL
;
2215 PyObject
*dictitems
= NULL
;
2217 int use_newobj
= self
->proto
>= 2;
2219 static char reduce
= REDUCE
;
2220 static char build
= BUILD
;
2221 static char newobj
= NEWOBJ
;
2223 if (! PyArg_UnpackTuple(args
, "save_reduce", 2, 5,
2231 if (!PyTuple_Check(argtup
)) {
2232 PyErr_SetString(PicklingError
,
2233 "args from reduce() should be a tuple");
2237 if (state
== Py_None
)
2239 if (listitems
== Py_None
)
2241 if (dictitems
== Py_None
)
2244 /* Protocol 2 special case: if callable's name is __newobj__, use
2245 * NEWOBJ. This consumes a lot of code.
2248 PyObject
*temp
= PyObject_GetAttr(callable
, __name___str
);
2251 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
2258 use_newobj
= PyString_Check(temp
) &&
2259 strcmp(PyString_AS_STRING(temp
),
2266 PyObject
*newargtup
;
2269 /* Sanity checks. */
2270 n
= PyTuple_Size(argtup
);
2272 PyErr_SetString(PicklingError
, "__newobj__ arglist "
2277 cls
= PyTuple_GET_ITEM(argtup
, 0);
2278 if (! PyObject_HasAttrString(cls
, "__new__")) {
2279 PyErr_SetString(PicklingError
, "args[0] from "
2280 "__newobj__ args has no __new__");
2284 /* XXX How could ob be NULL? */
2286 PyObject
*ob_dot_class
;
2288 ob_dot_class
= PyObject_GetAttr(ob
, __class___str
);
2289 if (ob_dot_class
== NULL
) {
2290 if (PyErr_ExceptionMatches(
2291 PyExc_AttributeError
))
2296 i
= ob_dot_class
!= cls
; /* true iff a problem */
2297 Py_XDECREF(ob_dot_class
);
2299 PyErr_SetString(PicklingError
, "args[0] from "
2300 "__newobj__ args has the wrong class");
2305 /* Save the class and its __new__ arguments. */
2306 if (save(self
, cls
, 0) < 0)
2309 newargtup
= PyTuple_New(n
-1); /* argtup[1:] */
2310 if (newargtup
== NULL
)
2312 for (i
= 1; i
< n
; ++i
) {
2313 PyObject
*temp
= PyTuple_GET_ITEM(argtup
, i
);
2315 PyTuple_SET_ITEM(newargtup
, i
-1, temp
);
2317 i
= save(self
, newargtup
, 0);
2318 Py_DECREF(newargtup
);
2322 /* Add NEWOBJ opcode. */
2323 if (self
->write_func(self
, &newobj
, 1) < 0)
2327 /* Not using NEWOBJ. */
2328 if (save(self
, callable
, 0) < 0 ||
2329 save(self
, argtup
, 0) < 0 ||
2330 self
->write_func(self
, &reduce
, 1) < 0)
2335 /* XXX How can ob be NULL? */
2337 if (state
&& !PyDict_Check(state
)) {
2338 if (put2(self
, ob
) < 0)
2341 else if (put(self
, ob
) < 0)
2346 if (listitems
&& batch_list(self
, listitems
) < 0)
2349 if (dictitems
&& batch_dict(self
, dictitems
) < 0)
2353 if (save(self
, state
, 0) < 0 ||
2354 self
->write_func(self
, &build
, 1) < 0)
2362 save(Picklerobject
*self
, PyObject
*args
, int pers_save
)
2365 PyObject
*py_ob_id
= 0, *__reduce__
= 0, *t
= 0;
2370 if (Py_EnterRecursiveCall(" while pickling an object"))
2373 if (!pers_save
&& self
->pers_func
) {
2374 if ((tmp
= save_pers(self
, args
, self
->pers_func
)) != 0) {
2380 if (args
== Py_None
) {
2381 res
= save_none(self
, args
);
2385 type
= Py_TYPE(args
);
2387 switch (type
->tp_name
[0]) {
2389 if (args
== Py_False
|| args
== Py_True
) {
2390 res
= save_bool(self
, args
);
2395 if (type
== &PyInt_Type
) {
2396 res
= save_int(self
, args
);
2402 if (type
== &PyLong_Type
) {
2403 res
= save_long(self
, args
);
2409 if (type
== &PyFloat_Type
) {
2410 res
= save_float(self
, args
);
2416 if (type
== &PyTuple_Type
&& PyTuple_Size(args
) == 0) {
2417 res
= save_tuple(self
, args
);
2423 if ((type
== &PyString_Type
) && (PyString_GET_SIZE(args
) < 2)) {
2424 res
= save_string(self
, args
, 0);
2429 #ifdef Py_USING_UNICODE
2431 if ((type
== &PyUnicode_Type
) && (PyString_GET_SIZE(args
) < 2)) {
2432 res
= save_unicode(self
, args
, 0);
2439 if (Py_REFCNT(args
) > 1) {
2440 if (!( py_ob_id
= PyLong_FromVoidPtr(args
)))
2443 if (PyDict_GetItem(self
->memo
, py_ob_id
)) {
2444 if (get(self
, py_ob_id
) < 0)
2452 switch (type
->tp_name
[0]) {
2454 if (type
== &PyString_Type
) {
2455 res
= save_string(self
, args
, 1);
2460 #ifdef Py_USING_UNICODE
2462 if (type
== &PyUnicode_Type
) {
2463 res
= save_unicode(self
, args
, 1);
2470 if (type
== &PyTuple_Type
) {
2471 res
= save_tuple(self
, args
);
2474 if (type
== &PyType_Type
) {
2475 res
= save_global(self
, args
, NULL
);
2481 if (type
== &PyList_Type
) {
2482 res
= save_list(self
, args
);
2488 if (type
== &PyDict_Type
) {
2489 res
= save_dict(self
, args
);
2495 if (type
== &PyInstance_Type
) {
2496 res
= save_inst(self
, args
);
2502 if (type
== &PyClass_Type
) {
2503 res
= save_global(self
, args
, NULL
);
2509 if (type
== &PyFunction_Type
) {
2510 res
= save_global(self
, args
, NULL
);
2511 if (res
&& PyErr_ExceptionMatches(PickleError
)) {
2512 /* fall back to reduce */
2521 if (type
== &PyCFunction_Type
) {
2522 res
= save_global(self
, args
, NULL
);
2527 if (!pers_save
&& self
->inst_pers_func
) {
2528 if ((tmp
= save_pers(self
, args
, self
->inst_pers_func
)) != 0) {
2534 if (PyType_IsSubtype(type
, &PyType_Type
)) {
2535 res
= save_global(self
, args
, NULL
);
2539 /* Get a reduction callable, and call it. This may come from
2540 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2541 * or the object's __reduce__ method.
2543 __reduce__
= PyDict_GetItem(dispatch_table
, (PyObject
*)type
);
2544 if (__reduce__
!= NULL
) {
2545 Py_INCREF(__reduce__
);
2547 ARG_TUP(self
, args
);
2549 t
= PyObject_Call(__reduce__
, self
->arg
, NULL
);
2554 /* Check for a __reduce_ex__ method. */
2555 __reduce__
= PyObject_GetAttr(args
, __reduce_ex___str
);
2556 if (__reduce__
!= NULL
) {
2557 t
= PyInt_FromLong(self
->proto
);
2562 t
= PyObject_Call(__reduce__
,
2569 if (PyErr_ExceptionMatches(PyExc_AttributeError
))
2573 /* Check for a __reduce__ method. */
2574 __reduce__
= PyObject_GetAttr(args
, __reduce___str
);
2575 if (__reduce__
!= NULL
) {
2576 t
= PyObject_Call(__reduce__
,
2580 PyErr_SetObject(UnpickleableError
, args
);
2589 if (PyString_Check(t
)) {
2590 res
= save_global(self
, args
, t
);
2594 if (! PyTuple_Check(t
)) {
2595 cPickle_ErrFormat(PicklingError
, "Value returned by "
2596 "%s must be string or tuple",
2601 size
= PyTuple_Size(t
);
2602 if (size
< 2 || size
> 5) {
2603 cPickle_ErrFormat(PicklingError
, "tuple returned by "
2604 "%s must contain 2 through 5 elements",
2609 arg_tup
= PyTuple_GET_ITEM(t
, 1);
2610 if (!(PyTuple_Check(arg_tup
) || arg_tup
== Py_None
)) {
2611 cPickle_ErrFormat(PicklingError
, "Second element of "
2612 "tuple returned by %s must be a tuple",
2617 res
= save_reduce(self
, t
, args
);
2620 Py_LeaveRecursiveCall();
2621 Py_XDECREF(py_ob_id
);
2622 Py_XDECREF(__reduce__
);
2630 dump(Picklerobject
*self
, PyObject
*args
)
2632 static char stop
= STOP
;
2634 if (self
->proto
>= 2) {
2638 assert(self
->proto
>= 0 && self
->proto
< 256);
2639 bytes
[1] = (char)self
->proto
;
2640 if (self
->write_func(self
, bytes
, 2) < 0)
2644 if (save(self
, args
, 0) < 0)
2647 if (self
->write_func(self
, &stop
, 1) < 0)
2650 if (self
->write_func(self
, NULL
, 0) < 0)
2657 Pickle_clear_memo(Picklerobject
*self
, PyObject
*args
)
2660 PyDict_Clear(self
->memo
);
2666 Pickle_getvalue(Picklerobject
*self
, PyObject
*args
)
2668 int l
, i
, rsize
, ssize
, clear
=1, lm
;
2671 char *s
, *p
, *have_get
;
2674 /* Can be called by Python code or C code */
2675 if (args
&& !PyArg_ParseTuple(args
, "|i:getvalue", &clear
))
2678 /* Check to make sure we are based on a list */
2679 if (! Pdata_Check(self
->file
)) {
2680 PyErr_SetString(PicklingError
,
2681 "Attempt to getvalue() a non-list-based pickler");
2685 /* flush write buffer */
2686 if (write_other(self
, NULL
, 0) < 0) return NULL
;
2688 data
=(Pdata
*)self
->file
;
2691 /* set up an array to hold get/put status */
2692 lm
= PyDict_Size(self
->memo
);
2693 if (lm
< 0) return NULL
;
2695 have_get
= malloc(lm
);
2696 if (have_get
== NULL
) return PyErr_NoMemory();
2697 memset(have_get
, 0, lm
);
2699 /* Scan for gets. */
2700 for (rsize
= 0, i
= l
; --i
>= 0; ) {
2703 if (PyString_Check(k
))
2704 rsize
+= PyString_GET_SIZE(k
);
2706 else if (PyInt_Check(k
)) { /* put */
2707 ik
= PyInt_AS_LONG((PyIntObject
*)k
);
2708 if (ik
>= lm
|| ik
== 0) {
2709 PyErr_SetString(PicklingError
,
2710 "Invalid get data");
2713 if (have_get
[ik
]) /* with matching get */
2714 rsize
+= ik
< 256 ? 2 : 5;
2717 else if (! (PyTuple_Check(k
) &&
2718 PyTuple_GET_SIZE(k
) == 2 &&
2719 PyInt_Check((k
= PyTuple_GET_ITEM(k
, 0))))
2721 PyErr_SetString(PicklingError
,
2722 "Unexpected data in internal list");
2727 ik
= PyInt_AS_LONG((PyIntObject
*)k
);
2728 if (ik
>= lm
|| ik
== 0) {
2729 PyErr_SetString(PicklingError
,
2730 "Invalid get data");
2734 rsize
+= ik
< 256 ? 2 : 5;
2738 /* Now generate the result */
2739 r
= PyString_FromStringAndSize(NULL
, rsize
);
2740 if (r
== NULL
) goto err
;
2741 s
= PyString_AS_STRING((PyStringObject
*)r
);
2743 for (i
= 0; i
< l
; i
++) {
2746 if (PyString_Check(k
)) {
2747 ssize
= PyString_GET_SIZE(k
);
2749 p
=PyString_AS_STRING((PyStringObject
*)k
);
2750 while (--ssize
>= 0)
2755 else if (PyTuple_Check(k
)) { /* get */
2756 ik
= PyInt_AS_LONG((PyIntObject
*)
2757 PyTuple_GET_ITEM(k
, 0));
2760 *s
++ = (int)(ik
& 0xff);
2764 *s
++ = (int)(ik
& 0xff);
2765 *s
++ = (int)((ik
>> 8) & 0xff);
2766 *s
++ = (int)((ik
>> 16) & 0xff);
2767 *s
++ = (int)((ik
>> 24) & 0xff);
2772 ik
= PyInt_AS_LONG((PyIntObject
*)k
);
2774 if (have_get
[ik
]) { /* with matching get */
2777 *s
++ = (int)(ik
& 0xff);
2781 *s
++ = (int)(ik
& 0xff);
2782 *s
++ = (int)((ik
>> 8) & 0xff);
2783 *s
++ = (int)((ik
>> 16) & 0xff);
2784 *s
++ = (int)((ik
>> 24) & 0xff);
2791 PyDict_Clear(self
->memo
);
2792 Pdata_clear(data
, 0);
2803 Pickler_dump(Picklerobject
*self
, PyObject
*args
)
2808 if (!( PyArg_ParseTuple(args
, "O|i:dump", &ob
, &get
)))
2811 if (dump(self
, ob
) < 0)
2814 if (get
) return Pickle_getvalue(self
, NULL
);
2816 /* XXX Why does dump() return self? */
2818 return (PyObject
*)self
;
2822 static struct PyMethodDef Pickler_methods
[] =
2824 {"dump", (PyCFunction
)Pickler_dump
, METH_VARARGS
,
2825 PyDoc_STR("dump(object) -- "
2826 "Write an object in pickle format to the object's pickle stream")},
2827 {"clear_memo", (PyCFunction
)Pickle_clear_memo
, METH_NOARGS
,
2828 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
2829 {"getvalue", (PyCFunction
)Pickle_getvalue
, METH_VARARGS
,
2830 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
2831 {NULL
, NULL
} /* sentinel */
2835 static Picklerobject
*
2836 newPicklerobject(PyObject
*file
, int proto
)
2838 Picklerobject
*self
;
2841 proto
= HIGHEST_PROTOCOL
;
2842 if (proto
> HIGHEST_PROTOCOL
) {
2843 PyErr_Format(PyExc_ValueError
, "pickle protocol %d asked for; "
2844 "the highest available protocol is %d",
2845 proto
, HIGHEST_PROTOCOL
);
2849 self
= PyObject_GC_New(Picklerobject
, &Picklertype
);
2852 self
->proto
= proto
;
2853 self
->bin
= proto
> 0;
2858 self
->pers_func
= NULL
;
2859 self
->inst_pers_func
= NULL
;
2860 self
->write_buf
= NULL
;
2862 self
->fast_container
= 0;
2863 self
->fast_memo
= NULL
;
2865 self
->dispatch_table
= NULL
;
2877 if (!( self
->memo
= PyDict_New()))
2880 if (PyFile_Check(file
)) {
2881 self
->fp
= PyFile_AsFile(file
);
2882 if (self
->fp
== NULL
) {
2883 PyErr_SetString(PyExc_ValueError
,
2884 "I/O operation on closed file");
2887 self
->write_func
= write_file
;
2889 else if (PycStringIO_OutputCheck(file
)) {
2890 self
->write_func
= write_cStringIO
;
2892 else if (file
== Py_None
) {
2893 self
->write_func
= write_none
;
2896 self
->write_func
= write_other
;
2898 if (! Pdata_Check(file
)) {
2899 self
->write
= PyObject_GetAttr(file
, write_str
);
2902 PyErr_SetString(PyExc_TypeError
,
2903 "argument must have 'write' "
2909 self
->write_buf
= (char *)PyMem_Malloc(WRITE_BUF_SIZE
);
2910 if (self
->write_buf
== NULL
) {
2916 if (PyEval_GetRestricted()) {
2917 /* Restricted execution, get private tables */
2918 PyObject
*m
= PyImport_Import(copyreg_str
);
2922 self
->dispatch_table
= PyObject_GetAttr(m
, dispatch_table_str
);
2924 if (self
->dispatch_table
== NULL
)
2928 self
->dispatch_table
= dispatch_table
;
2929 Py_INCREF(dispatch_table
);
2931 PyObject_GC_Track(self
);
2942 get_Pickler(PyObject
*self
, PyObject
*args
, PyObject
*kwds
)
2944 static char *kwlist
[] = {"file", "protocol", NULL
};
2945 PyObject
*file
= NULL
;
2949 * The documented signature is Pickler(file, protocol=0), but this
2950 * accepts Pickler() and Pickler(integer) too. The meaning then
2951 * is clear as mud, undocumented, and not supported by pickle.py.
2952 * I'm told Zope uses this, but I haven't traced into this code
2953 * far enough to figure out what it means.
2955 if (!PyArg_ParseTuple(args
, "|i:Pickler", &proto
)) {
2958 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "O|i:Pickler",
2959 kwlist
, &file
, &proto
))
2962 return (PyObject
*)newPicklerobject(file
, proto
);
2967 Pickler_dealloc(Picklerobject
*self
)
2969 PyObject_GC_UnTrack(self
);
2970 Py_XDECREF(self
->write
);
2971 Py_XDECREF(self
->memo
);
2972 Py_XDECREF(self
->fast_memo
);
2973 Py_XDECREF(self
->arg
);
2974 Py_XDECREF(self
->file
);
2975 Py_XDECREF(self
->pers_func
);
2976 Py_XDECREF(self
->inst_pers_func
);
2977 Py_XDECREF(self
->dispatch_table
);
2978 PyMem_Free(self
->write_buf
);
2979 Py_TYPE(self
)->tp_free((PyObject
*)self
);
2983 Pickler_traverse(Picklerobject
*self
, visitproc visit
, void *arg
)
2985 Py_VISIT(self
->write
);
2986 Py_VISIT(self
->memo
);
2987 Py_VISIT(self
->fast_memo
);
2988 Py_VISIT(self
->arg
);
2989 Py_VISIT(self
->file
);
2990 Py_VISIT(self
->pers_func
);
2991 Py_VISIT(self
->inst_pers_func
);
2992 Py_VISIT(self
->dispatch_table
);
2997 Pickler_clear(Picklerobject
*self
)
2999 Py_CLEAR(self
->write
);
3000 Py_CLEAR(self
->memo
);
3001 Py_CLEAR(self
->fast_memo
);
3002 Py_CLEAR(self
->arg
);
3003 Py_CLEAR(self
->file
);
3004 Py_CLEAR(self
->pers_func
);
3005 Py_CLEAR(self
->inst_pers_func
);
3006 Py_CLEAR(self
->dispatch_table
);
3011 Pickler_get_pers_func(Picklerobject
*p
)
3013 if (p
->pers_func
== NULL
)
3014 PyErr_SetString(PyExc_AttributeError
, "persistent_id");
3016 Py_INCREF(p
->pers_func
);
3017 return p
->pers_func
;
3021 Pickler_set_pers_func(Picklerobject
*p
, PyObject
*v
)
3024 PyErr_SetString(PyExc_TypeError
,
3025 "attribute deletion is not supported");
3028 Py_XDECREF(p
->pers_func
);
3035 Pickler_set_inst_pers_func(Picklerobject
*p
, PyObject
*v
)
3038 PyErr_SetString(PyExc_TypeError
,
3039 "attribute deletion is not supported");
3042 Py_XDECREF(p
->inst_pers_func
);
3044 p
->inst_pers_func
= v
;
3049 Pickler_get_memo(Picklerobject
*p
)
3051 if (p
->memo
== NULL
)
3052 PyErr_SetString(PyExc_AttributeError
, "memo");
3059 Pickler_set_memo(Picklerobject
*p
, PyObject
*v
)
3062 PyErr_SetString(PyExc_TypeError
,
3063 "attribute deletion is not supported");
3066 if (!PyDict_Check(v
)) {
3067 PyErr_SetString(PyExc_TypeError
, "memo must be a dictionary");
3070 Py_XDECREF(p
->memo
);
3077 Pickler_get_error(Picklerobject
*p
)
3079 /* why is this an attribute on the Pickler? */
3080 Py_INCREF(PicklingError
);
3081 return PicklingError
;
3084 static PyMemberDef Pickler_members
[] = {
3085 {"binary", T_INT
, offsetof(Picklerobject
, bin
)},
3086 {"fast", T_INT
, offsetof(Picklerobject
, fast
)},
3090 static PyGetSetDef Pickler_getsets
[] = {
3091 {"persistent_id", (getter
)Pickler_get_pers_func
,
3092 (setter
)Pickler_set_pers_func
},
3093 {"inst_persistent_id", NULL
, (setter
)Pickler_set_inst_pers_func
},
3094 {"memo", (getter
)Pickler_get_memo
, (setter
)Pickler_set_memo
},
3095 {"PicklingError", (getter
)Pickler_get_error
, NULL
},
3099 PyDoc_STRVAR(Picklertype__doc__
,
3100 "Objects that know how to pickle objects\n");
3102 static PyTypeObject Picklertype
= {
3103 PyVarObject_HEAD_INIT(NULL
, 0)
3104 "cPickle.Pickler", /*tp_name*/
3105 sizeof(Picklerobject
), /*tp_basicsize*/
3107 (destructor
)Pickler_dealloc
, /* tp_dealloc */
3113 0, /* tp_as_number */
3114 0, /* tp_as_sequence */
3115 0, /* tp_as_mapping */
3119 PyObject_GenericGetAttr
, /* tp_getattro */
3120 PyObject_GenericSetAttr
, /* tp_setattro */
3121 0, /* tp_as_buffer */
3122 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
| Py_TPFLAGS_HAVE_GC
,
3123 Picklertype__doc__
, /* tp_doc */
3124 (traverseproc
)Pickler_traverse
, /* tp_traverse */
3125 (inquiry
)Pickler_clear
, /* tp_clear */
3126 0, /* tp_richcompare */
3127 0, /* tp_weaklistoffset */
3129 0, /* tp_iternext */
3130 Pickler_methods
, /* tp_methods */
3131 Pickler_members
, /* tp_members */
3132 Pickler_getsets
, /* tp_getset */
3136 find_class(PyObject
*py_module_name
, PyObject
*py_global_name
, PyObject
*fc
)
3138 PyObject
*global
= 0, *module
;
3142 PyErr_SetString(UnpicklingError
, "Global and instance "
3143 "pickles are not supported.");
3146 return PyObject_CallFunctionObjArgs(fc
, py_module_name
,
3147 py_global_name
, NULL
);
3150 module
= PySys_GetObject("modules");
3154 module
= PyDict_GetItem(module
, py_module_name
);
3155 if (module
== NULL
) {
3156 module
= PyImport_Import(py_module_name
);
3159 global
= PyObject_GetAttr(module
, py_global_name
);
3163 global
= PyObject_GetAttr(module
, py_global_name
);
3168 marker(Unpicklerobject
*self
)
3170 if (self
->num_marks
< 1) {
3171 PyErr_SetString(UnpicklingError
, "could not find MARK");
3175 return self
->marks
[--self
->num_marks
];
3180 load_none(Unpicklerobject
*self
)
3182 PDATA_APPEND(self
->stack
, Py_None
, -1);
3189 PyErr_SetString(UnpicklingError
, "pickle data was truncated");
3194 load_int(Unpicklerobject
*self
)
3196 PyObject
*py_int
= 0;
3201 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3202 if (len
< 2) return bad_readline();
3203 if (!( s
=pystrndup(s
,len
))) return -1;
3206 l
= strtol(s
, &endptr
, 0);
3208 if (errno
|| (*endptr
!= '\n') || (endptr
[1] != '\0')) {
3209 /* Hm, maybe we've got something long. Let's try reading
3210 it as a Python long object. */
3212 py_int
= PyLong_FromString(s
, NULL
, 0);
3213 if (py_int
== NULL
) {
3214 PyErr_SetString(PyExc_ValueError
,
3215 "could not convert string to int");
3220 if (len
== 3 && (l
== 0 || l
== 1)) {
3221 if (!( py_int
= PyBool_FromLong(l
))) goto finally
;
3224 if (!( py_int
= PyInt_FromLong(l
))) goto finally
;
3229 PDATA_PUSH(self
->stack
, py_int
, -1);
3239 load_bool(Unpicklerobject
*self
, PyObject
*boolean
)
3241 assert(boolean
== Py_True
|| boolean
== Py_False
);
3242 PDATA_APPEND(self
->stack
, boolean
, -1);
3246 /* s contains x bytes of a little-endian integer. Return its value as a
3247 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3248 * int, but when x is 4 it's a signed one. This is an historical source
3249 * of x-platform bugs.
3252 calc_binint(char *s
, int x
)
3258 for (i
= 0, l
= 0L; i
< x
; i
++) {
3259 c
= (unsigned char)s
[i
];
3260 l
|= (long)c
<< (i
* 8);
3263 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3264 * is signed, so on a box with longs bigger than 4 bytes we need
3265 * to extend a BININT's sign bit to the full width.
3267 if (x
== 4 && l
& (1L << 31))
3275 load_binintx(Unpicklerobject
*self
, char *s
, int x
)
3277 PyObject
*py_int
= 0;
3280 l
= calc_binint(s
, x
);
3282 if (!( py_int
= PyInt_FromLong(l
)))
3285 PDATA_PUSH(self
->stack
, py_int
, -1);
3291 load_binint(Unpicklerobject
*self
)
3295 if (self
->read_func(self
, &s
, 4) < 0)
3298 return load_binintx(self
, s
, 4);
3303 load_binint1(Unpicklerobject
*self
)
3307 if (self
->read_func(self
, &s
, 1) < 0)
3310 return load_binintx(self
, s
, 1);
3315 load_binint2(Unpicklerobject
*self
)
3319 if (self
->read_func(self
, &s
, 2) < 0)
3322 return load_binintx(self
, s
, 2);
3326 load_long(Unpicklerobject
*self
)
3332 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3333 if (len
< 2) return bad_readline();
3334 if (!( s
=pystrndup(s
,len
))) return -1;
3336 if (!( l
= PyLong_FromString(s
, &end
, 0)))
3340 PDATA_PUSH(self
->stack
, l
, -1);
3349 /* 'size' bytes contain the # of bytes of little-endian 256's-complement
3353 load_counted_long(Unpicklerobject
*self
, int size
)
3357 unsigned char *pdata
;
3360 assert(size
== 1 || size
== 4);
3361 i
= self
->read_func(self
, &nbytes
, size
);
3362 if (i
< 0) return -1;
3364 size
= calc_binint(nbytes
, size
);
3366 /* Corrupt or hostile pickle -- we never write one like
3369 PyErr_SetString(UnpicklingError
, "LONG pickle has negative "
3375 along
= PyLong_FromLong(0L);
3377 /* Read the raw little-endian bytes & convert. */
3378 i
= self
->read_func(self
, (char **)&pdata
, size
);
3379 if (i
< 0) return -1;
3380 along
= _PyLong_FromByteArray(pdata
, (size_t)size
,
3381 1 /* little endian */, 1 /* signed */);
3385 PDATA_PUSH(self
->stack
, along
, -1);
3390 load_float(Unpicklerobject
*self
)
3392 PyObject
*py_float
= 0;
3397 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3398 if (len
< 2) return bad_readline();
3399 if (!( s
=pystrndup(s
,len
))) return -1;
3402 d
= PyOS_ascii_strtod(s
, &endptr
);
3404 if (errno
|| (endptr
[0] != '\n') || (endptr
[1] != '\0')) {
3405 PyErr_SetString(PyExc_ValueError
,
3406 "could not convert string to float");
3410 if (!( py_float
= PyFloat_FromDouble(d
)))
3414 PDATA_PUSH(self
->stack
, py_float
, -1);
3424 load_binfloat(Unpicklerobject
*self
)
3430 if (self
->read_func(self
, &p
, 8) < 0)
3433 x
= _PyFloat_Unpack8((unsigned char *)p
, 0);
3434 if (x
== -1.0 && PyErr_Occurred())
3437 py_float
= PyFloat_FromDouble(x
);
3438 if (py_float
== NULL
)
3441 PDATA_PUSH(self
->stack
, py_float
, -1);
3446 load_string(Unpicklerobject
*self
)
3452 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3453 if (len
< 2) return bad_readline();
3454 if (!( s
=pystrndup(s
,len
))) return -1;
3457 /* Strip outermost quotes */
3458 while (s
[len
-1] <= ' ')
3460 if(s
[0]=='"' && s
[len
-1]=='"'){
3464 } else if(s
[0]=='\'' && s
[len
-1]=='\''){
3470 /********************************************/
3472 str
= PyString_DecodeEscape(p
, len
, NULL
, 0, NULL
);
3475 PDATA_PUSH(self
->stack
, str
, -1);
3482 PyErr_SetString(PyExc_ValueError
,"insecure string pickle");
3488 load_binstring(Unpicklerobject
*self
)
3490 PyObject
*py_string
= 0;
3494 if (self
->read_func(self
, &s
, 4) < 0) return -1;
3496 l
= calc_binint(s
, 4);
3498 /* Corrupt or hostile pickle -- we never write one like
3501 PyErr_SetString(UnpicklingError
,
3502 "BINSTRING pickle has negative byte count");
3506 if (self
->read_func(self
, &s
, l
) < 0)
3509 if (!( py_string
= PyString_FromStringAndSize(s
, l
)))
3512 PDATA_PUSH(self
->stack
, py_string
, -1);
3518 load_short_binstring(Unpicklerobject
*self
)
3520 PyObject
*py_string
= 0;
3524 if (self
->read_func(self
, &s
, 1) < 0)
3527 l
= (unsigned char)s
[0];
3529 if (self
->read_func(self
, &s
, l
) < 0) return -1;
3531 if (!( py_string
= PyString_FromStringAndSize(s
, l
))) return -1;
3533 PDATA_PUSH(self
->stack
, py_string
, -1);
3538 #ifdef Py_USING_UNICODE
3540 load_unicode(Unpicklerobject
*self
)
3546 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3547 if (len
< 1) return bad_readline();
3549 if (!( str
= PyUnicode_DecodeRawUnicodeEscape(s
, len
- 1, NULL
)))
3552 PDATA_PUSH(self
->stack
, str
, -1);
3561 #ifdef Py_USING_UNICODE
3563 load_binunicode(Unpicklerobject
*self
)
3569 if (self
->read_func(self
, &s
, 4) < 0) return -1;
3571 l
= calc_binint(s
, 4);
3573 /* Corrupt or hostile pickle -- we never write one like
3576 PyErr_SetString(UnpicklingError
,
3577 "BINUNICODE pickle has negative byte count");
3581 if (self
->read_func(self
, &s
, l
) < 0)
3584 if (!( unicode
= PyUnicode_DecodeUTF8(s
, l
, NULL
)))
3587 PDATA_PUSH(self
->stack
, unicode
, -1);
3594 load_tuple(Unpicklerobject
*self
)
3599 if ((i
= marker(self
)) < 0) return -1;
3600 if (!( tup
=Pdata_popTuple(self
->stack
, i
))) return -1;
3601 PDATA_PUSH(self
->stack
, tup
, -1);
3606 load_counted_tuple(Unpicklerobject
*self
, int len
)
3608 PyObject
*tup
= PyTuple_New(len
);
3613 while (--len
>= 0) {
3616 PDATA_POP(self
->stack
, element
);
3617 if (element
== NULL
)
3619 PyTuple_SET_ITEM(tup
, len
, element
);
3621 PDATA_PUSH(self
->stack
, tup
, -1);
3626 load_empty_list(Unpicklerobject
*self
)
3630 if (!( list
=PyList_New(0))) return -1;
3631 PDATA_PUSH(self
->stack
, list
, -1);
3636 load_empty_dict(Unpicklerobject
*self
)
3640 if (!( dict
=PyDict_New())) return -1;
3641 PDATA_PUSH(self
->stack
, dict
, -1);
3647 load_list(Unpicklerobject
*self
)
3652 if ((i
= marker(self
)) < 0) return -1;
3653 if (!( list
=Pdata_popList(self
->stack
, i
))) return -1;
3654 PDATA_PUSH(self
->stack
, list
, -1);
3659 load_dict(Unpicklerobject
*self
)
3661 PyObject
*dict
, *key
, *value
;
3664 if ((i
= marker(self
)) < 0) return -1;
3665 j
=self
->stack
->length
;
3667 if (!( dict
= PyDict_New())) return -1;
3669 for (k
= i
+1; k
< j
; k
+= 2) {
3670 key
=self
->stack
->data
[k
-1];
3671 value
=self
->stack
->data
[k
];
3672 if (PyDict_SetItem(dict
, key
, value
) < 0) {
3677 Pdata_clear(self
->stack
, i
);
3678 PDATA_PUSH(self
->stack
, dict
, -1);
3683 Instance_New(PyObject
*cls
, PyObject
*args
)
3687 if (PyClass_Check(cls
)) {
3690 if ((l
=PyObject_Size(args
)) < 0) goto err
;
3692 PyObject
*__getinitargs__
;
3694 __getinitargs__
= PyObject_GetAttr(cls
,
3695 __getinitargs___str
);
3696 if (!__getinitargs__
) {
3697 /* We have a class with no __getinitargs__,
3698 so bypass usual construction */
3702 if (!( inst
=PyInstance_NewRaw(cls
, NULL
)))
3706 Py_DECREF(__getinitargs__
);
3709 if ((r
=PyInstance_New(cls
, args
, NULL
))) return r
;
3713 if ((r
=PyObject_CallObject(cls
, args
))) return r
;
3717 PyObject
*tp
, *v
, *tb
, *tmp_value
;
3719 PyErr_Fetch(&tp
, &v
, &tb
);
3721 /* NULL occurs when there was a KeyboardInterrupt */
3722 if (tmp_value
== NULL
)
3723 tmp_value
= Py_None
;
3724 if ((r
= PyTuple_Pack(3, tmp_value
, cls
, args
))) {
3728 PyErr_Restore(tp
,v
,tb
);
3735 load_obj(Unpicklerobject
*self
)
3737 PyObject
*class, *tup
, *obj
=0;
3740 if ((i
= marker(self
)) < 0) return -1;
3741 if (!( tup
=Pdata_popTuple(self
->stack
, i
+1))) return -1;
3742 PDATA_POP(self
->stack
, class);
3744 obj
= Instance_New(class, tup
);
3749 if (! obj
) return -1;
3750 PDATA_PUSH(self
->stack
, obj
, -1);
3756 load_inst(Unpicklerobject
*self
)
3758 PyObject
*tup
, *class=0, *obj
=0, *module_name
, *class_name
;
3762 if ((i
= marker(self
)) < 0) return -1;
3764 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3765 if (len
< 2) return bad_readline();
3766 module_name
= PyString_FromStringAndSize(s
, len
- 1);
3767 if (!module_name
) return -1;
3769 if ((len
= self
->readline_func(self
, &s
)) >= 0) {
3770 if (len
< 2) return bad_readline();
3771 if ((class_name
= PyString_FromStringAndSize(s
, len
- 1))) {
3772 class = find_class(module_name
, class_name
,
3774 Py_DECREF(class_name
);
3777 Py_DECREF(module_name
);
3779 if (! class) return -1;
3781 if ((tup
=Pdata_popTuple(self
->stack
, i
))) {
3782 obj
= Instance_New(class, tup
);
3787 if (! obj
) return -1;
3789 PDATA_PUSH(self
->stack
, obj
, -1);
3794 load_newobj(Unpicklerobject
*self
)
3796 PyObject
*args
= NULL
;
3797 PyObject
*clsraw
= NULL
;
3798 PyTypeObject
*cls
; /* clsraw cast to its true type */
3801 /* Stack is ... cls argtuple, and we want to call
3802 * cls.__new__(cls, *argtuple).
3804 PDATA_POP(self
->stack
, args
);
3805 if (args
== NULL
) goto Fail
;
3806 if (! PyTuple_Check(args
)) {
3807 PyErr_SetString(UnpicklingError
, "NEWOBJ expected an arg "
3812 PDATA_POP(self
->stack
, clsraw
);
3813 cls
= (PyTypeObject
*)clsraw
;
3814 if (cls
== NULL
) goto Fail
;
3815 if (! PyType_Check(cls
)) {
3816 PyErr_SetString(UnpicklingError
, "NEWOBJ class argument "
3817 "isn't a type object");
3820 if (cls
->tp_new
== NULL
) {
3821 PyErr_SetString(UnpicklingError
, "NEWOBJ class argument "
3827 obj
= cls
->tp_new(cls
, args
, NULL
);
3828 if (obj
== NULL
) goto Fail
;
3832 PDATA_PUSH(self
->stack
, obj
, -1);
3842 load_global(Unpicklerobject
*self
)
3844 PyObject
*class = 0, *module_name
= 0, *class_name
= 0;
3848 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3849 if (len
< 2) return bad_readline();
3850 module_name
= PyString_FromStringAndSize(s
, len
- 1);
3851 if (!module_name
) return -1;
3853 if ((len
= self
->readline_func(self
, &s
)) >= 0) {
3855 Py_DECREF(module_name
);
3856 return bad_readline();
3858 if ((class_name
= PyString_FromStringAndSize(s
, len
- 1))) {
3859 class = find_class(module_name
, class_name
,
3861 Py_DECREF(class_name
);
3864 Py_DECREF(module_name
);
3866 if (! class) return -1;
3867 PDATA_PUSH(self
->stack
, class, -1);
3873 load_persid(Unpicklerobject
*self
)
3879 if (self
->pers_func
) {
3880 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
3881 if (len
< 2) return bad_readline();
3883 pid
= PyString_FromStringAndSize(s
, len
- 1);
3884 if (!pid
) return -1;
3886 if (PyList_Check(self
->pers_func
)) {
3887 if (PyList_Append(self
->pers_func
, pid
) < 0) {
3895 pid
= PyObject_Call(self
->pers_func
, self
->arg
,
3901 if (! pid
) return -1;
3903 PDATA_PUSH(self
->stack
, pid
, -1);
3907 PyErr_SetString(UnpicklingError
,
3908 "A load persistent id instruction was encountered,\n"
3909 "but no persistent_load function was specified.");
3915 load_binpersid(Unpicklerobject
*self
)
3919 if (self
->pers_func
) {
3920 PDATA_POP(self
->stack
, pid
);
3921 if (! pid
) return -1;
3923 if (PyList_Check(self
->pers_func
)) {
3924 if (PyList_Append(self
->pers_func
, pid
) < 0) {
3932 pid
= PyObject_Call(self
->pers_func
, self
->arg
,
3936 if (! pid
) return -1;
3939 PDATA_PUSH(self
->stack
, pid
, -1);
3943 PyErr_SetString(UnpicklingError
,
3944 "A load persistent id instruction was encountered,\n"
3945 "but no persistent_load function was specified.");
3952 load_pop(Unpicklerobject
*self
)
3956 if (!( (len
=self
->stack
->length
) > 0 )) return stackUnderflow();
3958 /* Note that we split the (pickle.py) stack into two stacks,
3959 an object stack and a mark stack. We have to be clever and
3960 pop the right one. We do this by looking at the top of the
3964 if ((self
->num_marks
> 0) &&
3965 (self
->marks
[self
->num_marks
- 1] == len
))
3969 Py_DECREF(self
->stack
->data
[len
]);
3970 self
->stack
->length
=len
;
3978 load_pop_mark(Unpicklerobject
*self
)
3982 if ((i
= marker(self
)) < 0)
3985 Pdata_clear(self
->stack
, i
);
3992 load_dup(Unpicklerobject
*self
)
3997 if ((len
= self
->stack
->length
) <= 0) return stackUnderflow();
3998 last
=self
->stack
->data
[len
-1];
4000 PDATA_PUSH(self
->stack
, last
, -1);
4006 load_get(Unpicklerobject
*self
)
4008 PyObject
*py_str
= 0, *value
= 0;
4013 if ((len
= self
->readline_func(self
, &s
)) < 0) return -1;
4014 if (len
< 2) return bad_readline();
4016 if (!( py_str
= PyString_FromStringAndSize(s
, len
- 1))) return -1;
4018 value
= PyDict_GetItem(self
->memo
, py_str
);
4020 PyErr_SetObject(BadPickleGet
, py_str
);
4024 PDATA_APPEND(self
->stack
, value
, -1);
4034 load_binget(Unpicklerobject
*self
)
4036 PyObject
*py_key
= 0, *value
= 0;
4041 if (self
->read_func(self
, &s
, 1) < 0) return -1;
4043 key
= (unsigned char)s
[0];
4044 if (!( py_key
= PyInt_FromLong((long)key
))) return -1;
4046 value
= PyDict_GetItem(self
->memo
, py_key
);
4048 PyErr_SetObject(BadPickleGet
, py_key
);
4052 PDATA_APPEND(self
->stack
, value
, -1);
4062 load_long_binget(Unpicklerobject
*self
)
4064 PyObject
*py_key
= 0, *value
= 0;
4070 if (self
->read_func(self
, &s
, 4) < 0) return -1;
4072 c
= (unsigned char)s
[0];
4074 c
= (unsigned char)s
[1];
4075 key
|= (long)c
<< 8;
4076 c
= (unsigned char)s
[2];
4077 key
|= (long)c
<< 16;
4078 c
= (unsigned char)s
[3];
4079 key
|= (long)c
<< 24;
4081 if (!( py_key
= PyInt_FromLong((long)key
))) return -1;
4083 value
= PyDict_GetItem(self
->memo
, py_key
);
4085 PyErr_SetObject(BadPickleGet
, py_key
);
4089 PDATA_APPEND(self
->stack
, value
, -1);
4097 /* Push an object from the extension registry (EXT[124]). nbytes is
4098 * the number of bytes following the opcode, holding the index (code) value.
4101 load_extension(Unpicklerobject
*self
, int nbytes
)
4103 char *codebytes
; /* the nbytes bytes after the opcode */
4104 long code
; /* calc_binint returns long */
4105 PyObject
*py_code
; /* code as a Python int */
4106 PyObject
*obj
; /* the object to push */
4107 PyObject
*pair
; /* (module_name, class_name) */
4108 PyObject
*module_name
, *class_name
;
4110 assert(nbytes
== 1 || nbytes
== 2 || nbytes
== 4);
4111 if (self
->read_func(self
, &codebytes
, nbytes
) < 0) return -1;
4112 code
= calc_binint(codebytes
, nbytes
);
4113 if (code
<= 0) { /* note that 0 is forbidden */
4114 /* Corrupt or hostile pickle. */
4115 PyErr_SetString(UnpicklingError
, "EXT specifies code <= 0");
4119 /* Look for the code in the cache. */
4120 py_code
= PyInt_FromLong(code
);
4121 if (py_code
== NULL
) return -1;
4122 obj
= PyDict_GetItem(extension_cache
, py_code
);
4126 PDATA_APPEND(self
->stack
, obj
, -1);
4130 /* Look up the (module_name, class_name) pair. */
4131 pair
= PyDict_GetItem(inverted_registry
, py_code
);
4134 PyErr_Format(PyExc_ValueError
, "unregistered extension "
4138 /* Since the extension registry is manipulable via Python code,
4139 * confirm that pair is really a 2-tuple of strings.
4141 if (!PyTuple_Check(pair
) || PyTuple_Size(pair
) != 2 ||
4142 !PyString_Check(module_name
= PyTuple_GET_ITEM(pair
, 0)) ||
4143 !PyString_Check(class_name
= PyTuple_GET_ITEM(pair
, 1))) {
4145 PyErr_Format(PyExc_ValueError
, "_inverted_registry[%ld] "
4146 "isn't a 2-tuple of strings", code
);
4149 /* Load the object. */
4150 obj
= find_class(module_name
, class_name
, self
->find_class
);
4155 /* Cache code -> obj. */
4156 code
= PyDict_SetItem(extension_cache
, py_code
, obj
);
4162 PDATA_PUSH(self
->stack
, obj
, -1);
4167 load_put(Unpicklerobject
*self
)
4169 PyObject
*py_str
= 0, *value
= 0;
4173 if ((l
= self
->readline_func(self
, &s
)) < 0) return -1;
4174 if (l
< 2) return bad_readline();
4175 if (!( len
=self
->stack
->length
)) return stackUnderflow();
4176 if (!( py_str
= PyString_FromStringAndSize(s
, l
- 1))) return -1;
4177 value
=self
->stack
->data
[len
-1];
4178 l
=PyDict_SetItem(self
->memo
, py_str
, value
);
4185 load_binput(Unpicklerobject
*self
)
4187 PyObject
*py_key
= 0, *value
= 0;
4192 if (self
->read_func(self
, &s
, 1) < 0) return -1;
4193 if (!( (len
=self
->stack
->length
) > 0 )) return stackUnderflow();
4195 key
= (unsigned char)s
[0];
4197 if (!( py_key
= PyInt_FromLong((long)key
))) return -1;
4198 value
=self
->stack
->data
[len
-1];
4199 len
=PyDict_SetItem(self
->memo
, py_key
, value
);
4206 load_long_binput(Unpicklerobject
*self
)
4208 PyObject
*py_key
= 0, *value
= 0;
4214 if (self
->read_func(self
, &s
, 4) < 0) return -1;
4215 if (!( len
=self
->stack
->length
)) return stackUnderflow();
4217 c
= (unsigned char)s
[0];
4219 c
= (unsigned char)s
[1];
4220 key
|= (long)c
<< 8;
4221 c
= (unsigned char)s
[2];
4222 key
|= (long)c
<< 16;
4223 c
= (unsigned char)s
[3];
4224 key
|= (long)c
<< 24;
4226 if (!( py_key
= PyInt_FromLong(key
))) return -1;
4227 value
=self
->stack
->data
[len
-1];
4228 len
=PyDict_SetItem(self
->memo
, py_key
, value
);
4235 do_append(Unpicklerobject
*self
, int x
)
4237 PyObject
*value
= 0, *list
= 0, *append_method
= 0;
4240 len
=self
->stack
->length
;
4241 if (!( len
>= x
&& x
> 0 )) return stackUnderflow();
4243 if (len
==x
) return 0;
4245 list
=self
->stack
->data
[x
-1];
4247 if (PyList_Check(list
)) {
4251 slice
=Pdata_popList(self
->stack
, x
);
4252 if (! slice
) return -1;
4253 list_len
= PyList_GET_SIZE(list
);
4254 i
=PyList_SetSlice(list
, list_len
, list_len
, slice
);
4260 if (!( append_method
= PyObject_GetAttr(list
, append_str
)))
4263 for (i
= x
; i
< len
; i
++) {
4266 value
=self
->stack
->data
[i
];
4268 ARG_TUP(self
, value
);
4270 junk
= PyObject_Call(append_method
, self
->arg
,
4275 Pdata_clear(self
->stack
, i
+1);
4276 self
->stack
->length
=x
;
4277 Py_DECREF(append_method
);
4282 self
->stack
->length
=x
;
4283 Py_DECREF(append_method
);
4291 load_append(Unpicklerobject
*self
)
4293 return do_append(self
, self
->stack
->length
- 1);
4298 load_appends(Unpicklerobject
*self
)
4300 return do_append(self
, marker(self
));
4305 do_setitems(Unpicklerobject
*self
, int x
)
4307 PyObject
*value
= 0, *key
= 0, *dict
= 0;
4310 if (!( (len
=self
->stack
->length
) >= x
4311 && x
> 0 )) return stackUnderflow();
4313 dict
=self
->stack
->data
[x
-1];
4315 for (i
= x
+1; i
< len
; i
+= 2) {
4316 key
=self
->stack
->data
[i
-1];
4317 value
=self
->stack
->data
[i
];
4318 if (PyObject_SetItem(dict
, key
, value
) < 0) {
4324 Pdata_clear(self
->stack
, x
);
4331 load_setitem(Unpicklerobject
*self
)
4333 return do_setitems(self
, self
->stack
->length
- 2);
4337 load_setitems(Unpicklerobject
*self
)
4339 return do_setitems(self
, marker(self
));
4344 load_build(Unpicklerobject
*self
)
4346 PyObject
*state
, *inst
, *slotstate
;
4347 PyObject
*__setstate__
;
4348 PyObject
*d_key
, *d_value
;
4352 /* Stack is ... instance, state. We want to leave instance at
4353 * the stack top, possibly mutated via instance.__setstate__(state).
4355 if (self
->stack
->length
< 2)
4356 return stackUnderflow();
4357 PDATA_POP(self
->stack
, state
);
4360 inst
= self
->stack
->data
[self
->stack
->length
- 1];
4362 __setstate__
= PyObject_GetAttr(inst
, __setstate___str
);
4363 if (__setstate__
!= NULL
) {
4364 PyObject
*junk
= NULL
;
4366 /* The explicit __setstate__ is responsible for everything. */
4367 ARG_TUP(self
, state
);
4369 junk
= PyObject_Call(__setstate__
, self
->arg
, NULL
);
4372 Py_DECREF(__setstate__
);
4378 if (!PyErr_ExceptionMatches(PyExc_AttributeError
))
4382 /* A default __setstate__. First see whether state embeds a
4383 * slot state dict too (a proto 2 addition).
4385 if (PyTuple_Check(state
) && PyTuple_Size(state
) == 2) {
4386 PyObject
*temp
= state
;
4387 state
= PyTuple_GET_ITEM(temp
, 0);
4388 slotstate
= PyTuple_GET_ITEM(temp
, 1);
4390 Py_INCREF(slotstate
);
4396 /* Set inst.__dict__ from the state dict (if any). */
4397 if (state
!= Py_None
) {
4399 if (! PyDict_Check(state
)) {
4400 PyErr_SetString(UnpicklingError
, "state is not a "
4404 dict
= PyObject_GetAttr(inst
, __dict___str
);
4409 while (PyDict_Next(state
, &i
, &d_key
, &d_value
)) {
4410 if (PyObject_SetItem(dict
, d_key
, d_value
) < 0)
4416 /* Also set instance attributes from the slotstate dict (if any). */
4417 if (slotstate
!= NULL
) {
4418 if (! PyDict_Check(slotstate
)) {
4419 PyErr_SetString(UnpicklingError
, "slot state is not "
4424 while (PyDict_Next(slotstate
, &i
, &d_key
, &d_value
)) {
4425 if (PyObject_SetAttr(inst
, d_key
, d_value
) < 0)
4433 Py_XDECREF(slotstate
);
4439 load_mark(Unpicklerobject
*self
)
4443 /* Note that we split the (pickle.py) stack into two stacks, an
4444 object stack and a mark stack. Here we push a mark onto the
4448 if ((self
->num_marks
+ 1) >= self
->marks_size
) {
4450 s
=self
->marks_size
+20;
4451 if (s
<= self
->num_marks
) s
=self
->num_marks
+ 1;
4452 if (self
->marks
== NULL
)
4453 marks
=(int *)malloc(s
* sizeof(int));
4455 marks
=(int *)realloc(self
->marks
,
4461 self
->marks
= marks
;
4462 self
->marks_size
= s
;
4465 self
->marks
[self
->num_marks
++] = self
->stack
->length
;
4471 load_reduce(Unpicklerobject
*self
)
4473 PyObject
*callable
= 0, *arg_tup
= 0, *ob
= 0;
4475 PDATA_POP(self
->stack
, arg_tup
);
4476 if (! arg_tup
) return -1;
4477 PDATA_POP(self
->stack
, callable
);
4479 ob
= Instance_New(callable
, arg_tup
);
4480 Py_DECREF(callable
);
4484 if (! ob
) return -1;
4486 PDATA_PUSH(self
->stack
, ob
, -1);
4490 /* Just raises an error if we don't know the protocol specified. PROTO
4491 * is the first opcode for protocols >= 2.
4494 load_proto(Unpicklerobject
*self
)
4499 i
= self
->read_func(self
, &protobyte
, 1);
4503 i
= calc_binint(protobyte
, 1);
4504 /* No point checking for < 0, since calc_binint returns an unsigned
4505 * int when chewing on 1 byte.
4508 if (i
<= HIGHEST_PROTOCOL
)
4511 PyErr_Format(PyExc_ValueError
, "unsupported pickle protocol: %d", i
);
4516 load(Unpicklerobject
*self
)
4518 PyObject
*err
= 0, *val
= 0;
4521 self
->num_marks
= 0;
4522 if (self
->stack
->length
) Pdata_clear(self
->stack
, 0);
4525 if (self
->read_func(self
, &s
, 1) < 0)
4530 if (load_none(self
) < 0)
4535 if (load_binint(self
) < 0)
4540 if (load_binint1(self
) < 0)
4545 if (load_binint2(self
) < 0)
4550 if (load_int(self
) < 0)
4555 if (load_long(self
) < 0)
4560 if (load_counted_long(self
, 1) < 0)
4565 if (load_counted_long(self
, 4) < 0)
4570 if (load_float(self
) < 0)
4575 if (load_binfloat(self
) < 0)
4580 if (load_binstring(self
) < 0)
4584 case SHORT_BINSTRING
:
4585 if (load_short_binstring(self
) < 0)
4590 if (load_string(self
) < 0)
4594 #ifdef Py_USING_UNICODE
4596 if (load_unicode(self
) < 0)
4601 if (load_binunicode(self
) < 0)
4607 if (load_counted_tuple(self
, 0) < 0)
4612 if (load_counted_tuple(self
, 1) < 0)
4617 if (load_counted_tuple(self
, 2) < 0)
4622 if (load_counted_tuple(self
, 3) < 0)
4627 if (load_tuple(self
) < 0)
4632 if (load_empty_list(self
) < 0)
4637 if (load_list(self
) < 0)
4642 if (load_empty_dict(self
) < 0)
4647 if (load_dict(self
) < 0)
4652 if (load_obj(self
) < 0)
4657 if (load_inst(self
) < 0)
4662 if (load_newobj(self
) < 0)
4667 if (load_global(self
) < 0)
4672 if (load_append(self
) < 0)
4677 if (load_appends(self
) < 0)
4682 if (load_build(self
) < 0)
4687 if (load_dup(self
) < 0)
4692 if (load_binget(self
) < 0)
4697 if (load_long_binget(self
) < 0)
4702 if (load_get(self
) < 0)
4707 if (load_extension(self
, 1) < 0)
4712 if (load_extension(self
, 2) < 0)
4717 if (load_extension(self
, 4) < 0)
4721 if (load_mark(self
) < 0)
4726 if (load_binput(self
) < 0)
4731 if (load_long_binput(self
) < 0)
4736 if (load_put(self
) < 0)
4741 if (load_pop(self
) < 0)
4746 if (load_pop_mark(self
) < 0)
4751 if (load_setitem(self
) < 0)
4756 if (load_setitems(self
) < 0)
4764 if (load_persid(self
) < 0)
4769 if (load_binpersid(self
) < 0)
4774 if (load_reduce(self
) < 0)
4779 if (load_proto(self
) < 0)
4784 if (load_bool(self
, Py_True
) < 0)
4789 if (load_bool(self
, Py_False
) < 0)
4795 PyErr_SetNone(PyExc_EOFError
);
4799 cPickle_ErrFormat(UnpicklingError
,
4800 "invalid load key, '%s'.",
4808 if ((err
= PyErr_Occurred())) {
4809 if (err
== PyExc_EOFError
) {
4810 PyErr_SetNone(PyExc_EOFError
);
4815 PDATA_POP(self
->stack
, val
);
4820 /* No-load functions to support noload, which is used to
4821 find persistent references. */
4824 noload_obj(Unpicklerobject
*self
)
4828 if ((i
= marker(self
)) < 0) return -1;
4829 return Pdata_clear(self
->stack
, i
+1);
4834 noload_inst(Unpicklerobject
*self
)
4839 if ((i
= marker(self
)) < 0) return -1;
4840 Pdata_clear(self
->stack
, i
);
4841 if (self
->readline_func(self
, &s
) < 0) return -1;
4842 if (self
->readline_func(self
, &s
) < 0) return -1;
4843 PDATA_APPEND(self
->stack
, Py_None
, -1);
4848 noload_newobj(Unpicklerobject
*self
)
4852 PDATA_POP(self
->stack
, obj
); /* pop argtuple */
4853 if (obj
== NULL
) return -1;
4856 PDATA_POP(self
->stack
, obj
); /* pop cls */
4857 if (obj
== NULL
) return -1;
4860 PDATA_APPEND(self
->stack
, Py_None
, -1);
4865 noload_global(Unpicklerobject
*self
)
4869 if (self
->readline_func(self
, &s
) < 0) return -1;
4870 if (self
->readline_func(self
, &s
) < 0) return -1;
4871 PDATA_APPEND(self
->stack
, Py_None
,-1);
4876 noload_reduce(Unpicklerobject
*self
)
4879 if (self
->stack
->length
< 2) return stackUnderflow();
4880 Pdata_clear(self
->stack
, self
->stack
->length
-2);
4881 PDATA_APPEND(self
->stack
, Py_None
,-1);
4886 noload_build(Unpicklerobject
*self
) {
4888 if (self
->stack
->length
< 1) return stackUnderflow();
4889 Pdata_clear(self
->stack
, self
->stack
->length
-1);
4894 noload_extension(Unpicklerobject
*self
, int nbytes
)
4898 assert(nbytes
== 1 || nbytes
== 2 || nbytes
== 4);
4899 if (self
->read_func(self
, &codebytes
, nbytes
) < 0) return -1;
4900 PDATA_APPEND(self
->stack
, Py_None
, -1);
4906 noload(Unpicklerobject
*self
)
4908 PyObject
*err
= 0, *val
= 0;
4911 self
->num_marks
= 0;
4912 Pdata_clear(self
->stack
, 0);
4915 if (self
->read_func(self
, &s
, 1) < 0)
4920 if (load_none(self
) < 0)
4925 if (load_binint(self
) < 0)
4930 if (load_binint1(self
) < 0)
4935 if (load_binint2(self
) < 0)
4940 if (load_int(self
) < 0)
4945 if (load_long(self
) < 0)
4950 if (load_counted_long(self
, 1) < 0)
4955 if (load_counted_long(self
, 4) < 0)
4960 if (load_float(self
) < 0)
4965 if (load_binfloat(self
) < 0)
4970 if (load_binstring(self
) < 0)
4974 case SHORT_BINSTRING
:
4975 if (load_short_binstring(self
) < 0)
4980 if (load_string(self
) < 0)
4984 #ifdef Py_USING_UNICODE
4986 if (load_unicode(self
) < 0)
4991 if (load_binunicode(self
) < 0)
4997 if (load_counted_tuple(self
, 0) < 0)
5002 if (load_counted_tuple(self
, 1) < 0)
5007 if (load_counted_tuple(self
, 2) < 0)
5012 if (load_counted_tuple(self
, 3) < 0)
5017 if (load_tuple(self
) < 0)
5022 if (load_empty_list(self
) < 0)
5027 if (load_list(self
) < 0)
5032 if (load_empty_dict(self
) < 0)
5037 if (load_dict(self
) < 0)
5042 if (noload_obj(self
) < 0)
5047 if (noload_inst(self
) < 0)
5052 if (noload_newobj(self
) < 0)
5057 if (noload_global(self
) < 0)
5062 if (load_append(self
) < 0)
5067 if (load_appends(self
) < 0)
5072 if (noload_build(self
) < 0)
5077 if (load_dup(self
) < 0)
5082 if (load_binget(self
) < 0)
5087 if (load_long_binget(self
) < 0)
5092 if (load_get(self
) < 0)
5097 if (noload_extension(self
, 1) < 0)
5102 if (noload_extension(self
, 2) < 0)
5107 if (noload_extension(self
, 4) < 0)
5112 if (load_mark(self
) < 0)
5117 if (load_binput(self
) < 0)
5122 if (load_long_binput(self
) < 0)
5127 if (load_put(self
) < 0)
5132 if (load_pop(self
) < 0)
5137 if (load_pop_mark(self
) < 0)
5142 if (load_setitem(self
) < 0)
5147 if (load_setitems(self
) < 0)
5155 if (load_persid(self
) < 0)
5160 if (load_binpersid(self
) < 0)
5165 if (noload_reduce(self
) < 0)
5170 if (load_proto(self
) < 0)
5175 if (load_bool(self
, Py_True
) < 0)
5180 if (load_bool(self
, Py_False
) < 0)
5184 cPickle_ErrFormat(UnpicklingError
,
5185 "invalid load key, '%s'.",
5193 if ((err
= PyErr_Occurred())) {
5194 if (err
== PyExc_EOFError
) {
5195 PyErr_SetNone(PyExc_EOFError
);
5200 PDATA_POP(self
->stack
, val
);
5206 Unpickler_load(Unpicklerobject
*self
, PyObject
*unused
)
5212 Unpickler_noload(Unpicklerobject
*self
, PyObject
*unused
)
5214 return noload(self
);
5218 static struct PyMethodDef Unpickler_methods
[] = {
5219 {"load", (PyCFunction
)Unpickler_load
, METH_NOARGS
,
5220 PyDoc_STR("load() -- Load a pickle")
5222 {"noload", (PyCFunction
)Unpickler_noload
, METH_NOARGS
,
5224 "noload() -- not load a pickle, but go through most of the motions\n"
5226 "This function can be used to read past a pickle without instantiating\n"
5227 "any objects or importing any modules. It can also be used to find all\n"
5228 "persistent references without instantiating any objects or importing\n"
5231 {NULL
, NULL
} /* sentinel */
5235 static Unpicklerobject
*
5236 newUnpicklerobject(PyObject
*f
)
5238 Unpicklerobject
*self
;
5240 if (!( self
= PyObject_GC_New(Unpicklerobject
, &Unpicklertype
)))
5245 self
->stack
= (Pdata
*)Pdata_New();
5246 self
->pers_func
= NULL
;
5247 self
->last_string
= NULL
;
5249 self
->num_marks
= 0;
5250 self
->marks_size
= 0;
5253 self
->readline
= NULL
;
5254 self
->find_class
= NULL
;
5256 if (!( self
->memo
= PyDict_New()))
5265 /* Set read, readline based on type of f */
5266 if (PyFile_Check(f
)) {
5267 self
->fp
= PyFile_AsFile(f
);
5268 if (self
->fp
== NULL
) {
5269 PyErr_SetString(PyExc_ValueError
,
5270 "I/O operation on closed file");
5273 self
->read_func
= read_file
;
5274 self
->readline_func
= readline_file
;
5276 else if (PycStringIO_InputCheck(f
)) {
5278 self
->read_func
= read_cStringIO
;
5279 self
->readline_func
= readline_cStringIO
;
5284 self
->read_func
= read_other
;
5285 self
->readline_func
= readline_other
;
5287 if (!( (self
->readline
= PyObject_GetAttr(f
, readline_str
)) &&
5288 (self
->read
= PyObject_GetAttr(f
, read_str
)))) {
5290 PyErr_SetString( PyExc_TypeError
,
5291 "argument must have 'read' and "
5292 "'readline' attributes" );
5296 PyObject_GC_Track(self
);
5301 Py_DECREF((PyObject
*)self
);
5307 get_Unpickler(PyObject
*self
, PyObject
*file
)
5309 return (PyObject
*)newUnpicklerobject(file
);
5314 Unpickler_dealloc(Unpicklerobject
*self
)
5316 PyObject_GC_UnTrack((PyObject
*)self
);
5317 Py_XDECREF(self
->readline
);
5318 Py_XDECREF(self
->read
);
5319 Py_XDECREF(self
->file
);
5320 Py_XDECREF(self
->memo
);
5321 Py_XDECREF(self
->stack
);
5322 Py_XDECREF(self
->pers_func
);
5323 Py_XDECREF(self
->arg
);
5324 Py_XDECREF(self
->last_string
);
5325 Py_XDECREF(self
->find_class
);
5331 if (self
->buf_size
) {
5335 Py_TYPE(self
)->tp_free((PyObject
*)self
);
5339 Unpickler_traverse(Unpicklerobject
*self
, visitproc visit
, void *arg
)
5341 Py_VISIT(self
->readline
);
5342 Py_VISIT(self
->read
);
5343 Py_VISIT(self
->file
);
5344 Py_VISIT(self
->memo
);
5345 Py_VISIT(self
->stack
);
5346 Py_VISIT(self
->pers_func
);
5347 Py_VISIT(self
->arg
);
5348 Py_VISIT(self
->last_string
);
5349 Py_VISIT(self
->find_class
);
5354 Unpickler_clear(Unpicklerobject
*self
)
5356 Py_CLEAR(self
->readline
);
5357 Py_CLEAR(self
->read
);
5358 Py_CLEAR(self
->file
);
5359 Py_CLEAR(self
->memo
);
5360 Py_CLEAR(self
->stack
);
5361 Py_CLEAR(self
->pers_func
);
5362 Py_CLEAR(self
->arg
);
5363 Py_CLEAR(self
->last_string
);
5364 Py_CLEAR(self
->find_class
);
5369 Unpickler_getattr(Unpicklerobject
*self
, char *name
)
5371 if (!strcmp(name
, "persistent_load")) {
5372 if (!self
->pers_func
) {
5373 PyErr_SetString(PyExc_AttributeError
, name
);
5377 Py_INCREF(self
->pers_func
);
5378 return self
->pers_func
;
5381 if (!strcmp(name
, "find_global")) {
5382 if (!self
->find_class
) {
5383 PyErr_SetString(PyExc_AttributeError
, name
);
5387 Py_INCREF(self
->find_class
);
5388 return self
->find_class
;
5391 if (!strcmp(name
, "memo")) {
5393 PyErr_SetString(PyExc_AttributeError
, name
);
5397 Py_INCREF(self
->memo
);
5401 if (!strcmp(name
, "UnpicklingError")) {
5402 Py_INCREF(UnpicklingError
);
5403 return UnpicklingError
;
5406 return Py_FindMethod(Unpickler_methods
, (PyObject
*)self
, name
);
5411 Unpickler_setattr(Unpicklerobject
*self
, char *name
, PyObject
*value
)
5414 if (!strcmp(name
, "persistent_load")) {
5415 Py_XDECREF(self
->pers_func
);
5416 self
->pers_func
= value
;
5421 if (!strcmp(name
, "find_global")) {
5422 Py_XDECREF(self
->find_class
);
5423 self
->find_class
= value
;
5429 PyErr_SetString(PyExc_TypeError
,
5430 "attribute deletion is not supported");
5434 if (strcmp(name
, "memo") == 0) {
5435 if (!PyDict_Check(value
)) {
5436 PyErr_SetString(PyExc_TypeError
,
5437 "memo must be a dictionary");
5440 Py_XDECREF(self
->memo
);
5446 PyErr_SetString(PyExc_AttributeError
, name
);
5450 /* ---------------------------------------------------------------------------
5451 * Module-level functions.
5454 /* dump(obj, file, protocol=0). */
5456 cpm_dump(PyObject
*self
, PyObject
*args
, PyObject
*kwds
)
5458 static char *kwlist
[] = {"obj", "file", "protocol", NULL
};
5459 PyObject
*ob
, *file
, *res
= NULL
;
5460 Picklerobject
*pickler
= 0;
5463 if (!( PyArg_ParseTupleAndKeywords(args
, kwds
, "OO|i", kwlist
,
5464 &ob
, &file
, &proto
)))
5467 if (!( pickler
= newPicklerobject(file
, proto
)))
5470 if (dump(pickler
, ob
) < 0)
5477 Py_XDECREF(pickler
);
5483 /* dumps(obj, protocol=0). */
5485 cpm_dumps(PyObject
*self
, PyObject
*args
, PyObject
*kwds
)
5487 static char *kwlist
[] = {"obj", "protocol", NULL
};
5488 PyObject
*ob
, *file
= 0, *res
= NULL
;
5489 Picklerobject
*pickler
= 0;
5492 if (!( PyArg_ParseTupleAndKeywords(args
, kwds
, "O|i:dumps", kwlist
,
5496 if (!( file
= PycStringIO
->NewOutput(128)))
5499 if (!( pickler
= newPicklerobject(file
, proto
)))
5502 if (dump(pickler
, ob
) < 0)
5505 res
= PycStringIO
->cgetvalue(file
);
5508 Py_XDECREF(pickler
);
5515 /* load(fileobj). */
5517 cpm_load(PyObject
*self
, PyObject
*ob
)
5519 Unpicklerobject
*unpickler
= 0;
5520 PyObject
*res
= NULL
;
5522 if (!( unpickler
= newUnpicklerobject(ob
)))
5525 res
= load(unpickler
);
5528 Py_XDECREF(unpickler
);
5536 cpm_loads(PyObject
*self
, PyObject
*args
)
5538 PyObject
*ob
, *file
= 0, *res
= NULL
;
5539 Unpicklerobject
*unpickler
= 0;
5541 if (!( PyArg_ParseTuple(args
, "S:loads", &ob
)))
5544 if (!( file
= PycStringIO
->NewInput(ob
)))
5547 if (!( unpickler
= newUnpicklerobject(file
)))
5550 res
= load(unpickler
);
5554 Py_XDECREF(unpickler
);
5560 PyDoc_STRVAR(Unpicklertype__doc__
,
5561 "Objects that know how to unpickle");
5563 static PyTypeObject Unpicklertype
= {
5564 PyVarObject_HEAD_INIT(NULL
, 0)
5565 "cPickle.Unpickler", /*tp_name*/
5566 sizeof(Unpicklerobject
), /*tp_basicsize*/
5568 (destructor
)Unpickler_dealloc
, /* tp_dealloc */
5570 (getattrfunc
)Unpickler_getattr
, /* tp_getattr */
5571 (setattrfunc
)Unpickler_setattr
, /* tp_setattr */
5574 0, /* tp_as_number */
5575 0, /* tp_as_sequence */
5576 0, /* tp_as_mapping */
5580 0, /* tp_getattro */
5581 0, /* tp_setattro */
5582 0, /* tp_as_buffer */
5583 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
| Py_TPFLAGS_HAVE_GC
,
5584 Unpicklertype__doc__
, /* tp_doc */
5585 (traverseproc
)Unpickler_traverse
, /* tp_traverse */
5586 (inquiry
)Unpickler_clear
, /* tp_clear */
5589 static struct PyMethodDef cPickle_methods
[] = {
5590 {"dump", (PyCFunction
)cpm_dump
, METH_VARARGS
| METH_KEYWORDS
,
5591 PyDoc_STR("dump(obj, file, protocol=0) -- "
5592 "Write an object in pickle format to the given file.\n"
5594 "See the Pickler docstring for the meaning of optional argument proto.")
5597 {"dumps", (PyCFunction
)cpm_dumps
, METH_VARARGS
| METH_KEYWORDS
,
5598 PyDoc_STR("dumps(obj, protocol=0) -- "
5599 "Return a string containing an object in pickle format.\n"
5601 "See the Pickler docstring for the meaning of optional argument proto.")
5604 {"load", (PyCFunction
)cpm_load
, METH_O
,
5605 PyDoc_STR("load(file) -- Load a pickle from the given file")},
5607 {"loads", (PyCFunction
)cpm_loads
, METH_VARARGS
,
5608 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
5610 {"Pickler", (PyCFunction
)get_Pickler
, METH_VARARGS
| METH_KEYWORDS
,
5611 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
5613 "This takes a file-like object for writing a pickle data stream.\n"
5614 "The optional proto argument tells the pickler to use the given\n"
5615 "protocol; supported protocols are 0, 1, 2. The default\n"
5616 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5617 "only protocol that can be written to a file opened in text\n"
5618 "mode and read back successfully. When using a protocol higher\n"
5619 "than 0, make sure the file is opened in binary mode, both when\n"
5620 "pickling and unpickling.)\n"
5622 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5623 "more efficient than protocol 1.\n"
5625 "Specifying a negative protocol version selects the highest\n"
5626 "protocol version supported. The higher the protocol used, the\n"
5627 "more recent the version of Python needed to read the pickle\n"
5630 "The file parameter must have a write() method that accepts a single\n"
5631 "string argument. It can thus be an open file object, a StringIO\n"
5632 "object, or any other custom object that meets this interface.\n")
5635 {"Unpickler", (PyCFunction
)get_Unpickler
, METH_O
,
5636 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5642 init_stuff(PyObject
*module_dict
)
5644 PyObject
*copyreg
, *t
, *r
;
5646 #define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
5648 if (PyType_Ready(&Unpicklertype
) < 0)
5650 if (PyType_Ready(&Picklertype
) < 0)
5653 INIT_STR(__class__
);
5654 INIT_STR(__getinitargs__
);
5656 INIT_STR(__getstate__
);
5657 INIT_STR(__setstate__
);
5660 INIT_STR(__reduce__
);
5661 INIT_STR(__reduce_ex__
);
5667 INIT_STR(dispatch_table
);
5669 if (!( copyreg
= PyImport_ImportModule("copy_reg")))
5672 /* This is special because we want to use a different
5673 one in restricted mode. */
5674 dispatch_table
= PyObject_GetAttr(copyreg
, dispatch_table_str
);
5675 if (!dispatch_table
) return -1;
5677 extension_registry
= PyObject_GetAttrString(copyreg
,
5678 "_extension_registry");
5679 if (!extension_registry
) return -1;
5681 inverted_registry
= PyObject_GetAttrString(copyreg
,
5682 "_inverted_registry");
5683 if (!inverted_registry
) return -1;
5685 extension_cache
= PyObject_GetAttrString(copyreg
,
5686 "_extension_cache");
5687 if (!extension_cache
) return -1;
5691 if (!(empty_tuple
= PyTuple_New(0)))
5694 two_tuple
= PyTuple_New(2);
5695 if (two_tuple
== NULL
)
5697 /* We use this temp container with no regard to refcounts, or to
5698 * keeping containees alive. Exempt from GC, because we don't
5699 * want anything looking at two_tuple() by magic.
5701 PyObject_GC_UnTrack(two_tuple
);
5704 if (!( t
=PyImport_ImportModule("__builtin__"))) return -1;
5705 if (PyDict_SetItemString(module_dict
, "__builtins__", t
) < 0)
5708 if (!( t
=PyDict_New())) return -1;
5709 if (!( r
=PyRun_String(
5710 "def __str__(self):\n"
5711 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5713 module_dict
, t
) )) return -1;
5716 PickleError
= PyErr_NewException("cPickle.PickleError", NULL
, t
);
5722 PicklingError
= PyErr_NewException("cPickle.PicklingError",
5727 if (!( t
=PyDict_New())) return -1;
5728 if (!( r
=PyRun_String(
5729 "def __str__(self):\n"
5731 " a=a and type(a[0]) or '(what)'\n"
5732 " return 'Cannot pickle %s objects' % a\n"
5734 module_dict
, t
) )) return -1;
5737 if (!( UnpickleableError
= PyErr_NewException(
5738 "cPickle.UnpickleableError", PicklingError
, t
)))
5743 if (!( UnpicklingError
= PyErr_NewException("cPickle.UnpicklingError",
5744 PickleError
, NULL
)))
5747 if (!( BadPickleGet
= PyErr_NewException("cPickle.BadPickleGet",
5748 UnpicklingError
, NULL
)))
5751 if (PyDict_SetItemString(module_dict
, "PickleError",
5755 if (PyDict_SetItemString(module_dict
, "PicklingError",
5759 if (PyDict_SetItemString(module_dict
, "UnpicklingError",
5760 UnpicklingError
) < 0)
5763 if (PyDict_SetItemString(module_dict
, "UnpickleableError",
5764 UnpickleableError
) < 0)
5767 if (PyDict_SetItemString(module_dict
, "BadPickleGet",
5776 #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5777 #define PyMODINIT_FUNC void
5782 PyObject
*m
, *d
, *di
, *v
, *k
;
5784 char *rev
= "1.71"; /* XXX when does this change? */
5785 PyObject
*format_version
;
5786 PyObject
*compatible_formats
;
5788 /* XXX: Should mention that the pickle module will include the C
5789 XXX: optimized implementation automatically. */
5790 if (PyErr_WarnPy3k("the cPickle module has been removed in "
5791 "Python 3.0", 2) < 0)
5794 Py_TYPE(&Picklertype
) = &PyType_Type
;
5795 Py_TYPE(&Unpicklertype
) = &PyType_Type
;
5796 Py_TYPE(&PdataType
) = &PyType_Type
;
5798 /* Initialize some pieces. We need to do this before module creation,
5799 * so we're forced to use a temporary dictionary. :(
5803 if (init_stuff(di
) < 0) return;
5805 /* Create the module and add the functions */
5806 m
= Py_InitModule4("cPickle", cPickle_methods
,
5807 cPickle_module_documentation
,
5808 (PyObject
*)NULL
,PYTHON_API_VERSION
);
5812 /* Add some symbolic constants to the module */
5813 d
= PyModule_GetDict(m
);
5814 v
= PyString_FromString(rev
);
5815 PyDict_SetItemString(d
, "__version__", v
);
5818 /* Copy data from di. Waaa. */
5819 for (i
=0; PyDict_Next(di
, &i
, &k
, &v
); ) {
5820 if (PyObject_SetItem(d
, k
, v
) < 0) {
5827 i
= PyModule_AddIntConstant(m
, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL
);
5831 /* These are purely informational; no code uses them. */
5832 /* File format version we write. */
5833 format_version
= PyString_FromString("2.0");
5834 /* Format versions we can read. */
5835 compatible_formats
= Py_BuildValue("[sssss]",
5836 "1.0", /* Original protocol 0 */
5837 "1.1", /* Protocol 0 + INST */
5838 "1.2", /* Original protocol 1 */
5839 "1.3", /* Protocol 1 + BINFLOAT */
5840 "2.0"); /* Original protocol 2 */
5841 PyDict_SetItemString(d
, "format_version", format_version
);
5842 PyDict_SetItemString(d
, "compatible_formats", compatible_formats
);
5843 Py_XDECREF(format_version
);
5844 Py_XDECREF(compatible_formats
);