Mercurial > cpython-lru_cache-weakref
annotate Modules/cPickle.c @ 79675:c0a2294de787 2.7
Issue #16199: Backport 2to3 typo fix from 3.2.
| author | Chris Jerdonek <chris.jerdonek@gmail.com> |
|---|---|
| date | Thu, 11 Oct 2012 16:15:46 -0700 |
| parents | 64053bd79590 |
| children | 680959a3ae2e |
| rev | line source |
|---|---|
| 4907 | 1 #include "Python.h" |
| 2 #include "cStringIO.h" | |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3 #include "structmember.h" |
| 4907 | 4 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23332
diff
changeset
|
5 PyDoc_STRVAR(cPickle_module_documentation, |
|
27579
6ffb5c8e6538
The module docstring had an RCS ID from 1999 embedded in it. Enough
Tim Peters <tim.peters@gmail.com>
parents:
27578
diff
changeset
|
6 "C implementation and optimization of the Python pickle module."); |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23332
diff
changeset
|
7 |
|
5991
a5737dd96979
cPickle release 0.3 from Jim Fulton
Guido van Rossum <guido@python.org>
parents:
5544
diff
changeset
|
8 #ifndef Py_eval_input |
|
a5737dd96979
cPickle release 0.3 from Jim Fulton
Guido van Rossum <guido@python.org>
parents:
5544
diff
changeset
|
9 #include <graminit.h> |
|
a5737dd96979
cPickle release 0.3 from Jim Fulton
Guido van Rossum <guido@python.org>
parents:
5544
diff
changeset
|
10 #define Py_eval_input eval_input |
|
6130
2d9582eee112
Added /**/ around #end tags
Guido van Rossum <guido@python.org>
parents:
6120
diff
changeset
|
11 #endif /* Py_eval_input */ |
|
5991
a5737dd96979
cPickle release 0.3 from Jim Fulton
Guido van Rossum <guido@python.org>
parents:
5544
diff
changeset
|
12 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
13 #define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL)) |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
14 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
15 #define WRITE_BUF_SIZE 256 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
16 |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
17 /* Bump this when new opcodes are added to the pickle protocol. */ |
|
27864
b4eb34372bdb
Added a HIGHEST_PROTOCOL module attribute to pickle and cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27832
diff
changeset
|
18 #define HIGHEST_PROTOCOL 2 |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
19 |
|
27577
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
20 /* |
|
50522
ee9ced92843a
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50290
diff
changeset
|
21 * Note: The UNICODE macro controls the TCHAR meaning of the win32 API. Since |
|
ee9ced92843a
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50290
diff
changeset
|
22 * all headers have already been included here, we can safely redefine it. |
|
ee9ced92843a
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50290
diff
changeset
|
23 */ |
|
ee9ced92843a
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50290
diff
changeset
|
24 #ifdef UNICODE |
|
ee9ced92843a
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50290
diff
changeset
|
25 # undef UNICODE |
|
ee9ced92843a
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50290
diff
changeset
|
26 #endif |
|
ee9ced92843a
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50290
diff
changeset
|
27 |
|
ee9ced92843a
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50290
diff
changeset
|
28 /* |
|
27577
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
29 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
30 * docs are in pickletools.py. |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
31 */ |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
32 #define MARK '(' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
33 #define STOP '.' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
34 #define POP '0' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
35 #define POP_MARK '1' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
36 #define DUP '2' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
37 #define FLOAT 'F' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
38 #define BINFLOAT 'G' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
39 #define INT 'I' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
40 #define BININT 'J' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
41 #define BININT1 'K' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
42 #define LONG 'L' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
43 #define BININT2 'M' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
44 #define NONE 'N' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
45 #define PERSID 'P' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
46 #define BINPERSID 'Q' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
47 #define REDUCE 'R' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
48 #define STRING 'S' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
49 #define BINSTRING 'T' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
50 #define SHORT_BINSTRING 'U' |
|
11982
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
51 #define UNICODE 'V' |
|
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
52 #define BINUNICODE 'X' |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
53 #define APPEND 'a' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
54 #define BUILD 'b' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
55 #define GLOBAL 'c' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
56 #define DICT 'd' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
57 #define EMPTY_DICT '}' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
58 #define APPENDS 'e' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
59 #define GET 'g' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
60 #define BINGET 'h' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
61 #define INST 'i' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
62 #define LONG_BINGET 'j' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
63 #define LIST 'l' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
64 #define EMPTY_LIST ']' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
65 #define OBJ 'o' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
66 #define PUT 'p' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
67 #define BINPUT 'q' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
68 #define LONG_BINPUT 'r' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
69 #define SETITEM 's' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
70 #define TUPLE 't' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
71 #define EMPTY_TUPLE ')' |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
72 #define SETITEMS 'u' |
|
27577
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
73 |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
74 /* Protocol 2. */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
75 #define PROTO '\x80' /* identify pickle protocol */ |
|
27577
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
76 #define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */ |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
77 #define EXT1 '\x82' /* push object from extension registry; 1-byte index */ |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
78 #define EXT2 '\x83' /* ditto, but 2-byte index */ |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
79 #define EXT4 '\x84' /* ditto, but 4-byte index */ |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
80 #define TUPLE1 '\x85' /* build 1-tuple from stack top */ |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
81 #define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */ |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
82 #define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */ |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
83 #define NEWTRUE '\x88' /* push True */ |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
84 #define NEWFALSE '\x89' /* push False */ |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
85 #define LONG1 '\x8a' /* push long from < 256 bytes */ |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
86 #define LONG4 '\x8b' /* push really big long */ |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
87 |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
88 /* There aren't opcodes -- they're ways to pickle bools before protocol 2, |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
89 * so that unpicklers written before bools were introduced unpickle them |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
90 * as ints, but unpicklers after can recognize that bools were intended. |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
91 * Note that protocol 2 added direct ways to pickle bools. |
|
9bc1c84b23e6
Added #defines for proto 2 opcodes; gave the Pickler a proto member;
Tim Peters <tim.peters@gmail.com>
parents:
27573
diff
changeset
|
92 */ |
|
24014
2e5a1e8c0b48
Undefine TRUE and FALSE before redefining them.
Jack Jansen <jack.jansen@cwi.nl>
parents:
23832
diff
changeset
|
93 #undef TRUE |
|
22851
ed03806d88cd
Implement an idea by Paul Rubin:
Guido van Rossum <guido@python.org>
parents:
22805
diff
changeset
|
94 #define TRUE "I01\n" |
|
24014
2e5a1e8c0b48
Undefine TRUE and FALSE before redefining them.
Jack Jansen <jack.jansen@cwi.nl>
parents:
23832
diff
changeset
|
95 #undef FALSE |
|
22851
ed03806d88cd
Implement an idea by Paul Rubin:
Guido van Rossum <guido@python.org>
parents:
22805
diff
changeset
|
96 #define FALSE "I00\n" |
|
22785
aa8d59823add
Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents:
22732
diff
changeset
|
97 |
|
27822
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
98 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements |
|
27825
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
99 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
100 * break if this gets out of synch with pickle.py, but it's unclear that |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
101 * would help anything either. |
|
27822
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
102 */ |
|
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
103 #define BATCHSIZE 1000 |
|
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
104 |
| 4907 | 105 static char MARKv = MARK; |
| 106 | |
| 10946 | 107 static PyObject *PickleError; |
| 4907 | 108 static PyObject *PicklingError; |
| 10946 | 109 static PyObject *UnpickleableError; |
| 4907 | 110 static PyObject *UnpicklingError; |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
111 static PyObject *BadPickleGet; |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
112 |
|
27662
3a528aa222b6
Brought some module variables into synch with pickle.py's current values.
Tim Peters <tim.peters@gmail.com>
parents:
27656
diff
changeset
|
113 /* As the name says, an empty tuple. */ |
|
3a528aa222b6
Brought some module variables into synch with pickle.py's current values.
Tim Peters <tim.peters@gmail.com>
parents:
27656
diff
changeset
|
114 static PyObject *empty_tuple; |
|
3a528aa222b6
Brought some module variables into synch with pickle.py's current values.
Tim Peters <tim.peters@gmail.com>
parents:
27656
diff
changeset
|
115 |
|
3a528aa222b6
Brought some module variables into synch with pickle.py's current values.
Tim Peters <tim.peters@gmail.com>
parents:
27656
diff
changeset
|
116 /* copy_reg.dispatch_table, {type_object: pickling_function} */ |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
117 static PyObject *dispatch_table; |
|
27662
3a528aa222b6
Brought some module variables into synch with pickle.py's current values.
Tim Peters <tim.peters@gmail.com>
parents:
27656
diff
changeset
|
118 |
|
3a528aa222b6
Brought some module variables into synch with pickle.py's current values.
Tim Peters <tim.peters@gmail.com>
parents:
27656
diff
changeset
|
119 /* For EXT[124] opcodes. */ |
|
27665
d5eb12bccd1e
Rename the extension registry variables to have leading underscores --
Guido van Rossum <guido@python.org>
parents:
27663
diff
changeset
|
120 /* copy_reg._extension_registry, {(module_name, function_name): code} */ |
|
27662
3a528aa222b6
Brought some module variables into synch with pickle.py's current values.
Tim Peters <tim.peters@gmail.com>
parents:
27656
diff
changeset
|
121 static PyObject *extension_registry; |
|
27665
d5eb12bccd1e
Rename the extension registry variables to have leading underscores --
Guido van Rossum <guido@python.org>
parents:
27663
diff
changeset
|
122 /* copy_reg._inverted_registry, {code: (module_name, function_name)} */ |
|
27662
3a528aa222b6
Brought some module variables into synch with pickle.py's current values.
Tim Peters <tim.peters@gmail.com>
parents:
27656
diff
changeset
|
123 static PyObject *inverted_registry; |
|
27665
d5eb12bccd1e
Rename the extension registry variables to have leading underscores --
Guido van Rossum <guido@python.org>
parents:
27663
diff
changeset
|
124 /* copy_reg._extension_cache, {code: object} */ |
|
27662
3a528aa222b6
Brought some module variables into synch with pickle.py's current values.
Tim Peters <tim.peters@gmail.com>
parents:
27656
diff
changeset
|
125 static PyObject *extension_cache; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
126 |
|
27684
96fd004a58b0
cPickle now generates proto 2 EXT[124] when appropriate.
Tim Peters <tim.peters@gmail.com>
parents:
27667
diff
changeset
|
127 /* For looking up name pairs in copy_reg._extension_registry. */ |
|
96fd004a58b0
cPickle now generates proto 2 EXT[124] when appropriate.
Tim Peters <tim.peters@gmail.com>
parents:
27667
diff
changeset
|
128 static PyObject *two_tuple; |
|
96fd004a58b0
cPickle now generates proto 2 EXT[124] when appropriate.
Tim Peters <tim.peters@gmail.com>
parents:
27667
diff
changeset
|
129 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
130 static PyObject *__class___str, *__getinitargs___str, *__dict___str, |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
131 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str, |
| 27961 | 132 *__reduce_ex___str, |
|
27573
674f3eecffc5
Removed all uses of the out-of-favor __safe_for_unpickling__ magic
Tim Peters <tim.peters@gmail.com>
parents:
27566
diff
changeset
|
133 *write_str, *append_str, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
134 *read_str, *readline_str, *__main___str, |
|
57439
b51fda754f5a
Merged revisions 76499 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
55430
diff
changeset
|
135 *dispatch_table_str; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
136 |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
137 /************************************************************************* |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
138 Internal Data type for pickle data. */ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
139 |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
140 typedef struct { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
141 PyObject_HEAD |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
142 int length; /* number of initial slots in data currently used */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
143 int size; /* number of slots in data allocated */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
144 PyObject **data; |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
145 } Pdata; |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
146 |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
147 static void |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
148 Pdata_dealloc(Pdata *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
149 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
150 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
151 PyObject **p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
152 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
153 for (i = self->length, p = self->data; --i >= 0; p++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
154 Py_DECREF(*p); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
155 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
156 if (self->data) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
157 free(self->data); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
158 PyObject_Del(self); |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
159 } |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
160 |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
161 static PyTypeObject PdataType = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
162 PyVarObject_HEAD_INIT(NULL, 0) "cPickle.Pdata", sizeof(Pdata), 0, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
163 (destructor)Pdata_dealloc, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
164 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, "" |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
165 }; |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
166 |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43472
diff
changeset
|
167 #define Pdata_Check(O) (Py_TYPE(O) == &PdataType) |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
168 |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
169 static PyObject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
170 Pdata_New(void) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
171 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
172 Pdata *self; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
173 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
174 if (!(self = PyObject_New(Pdata, &PdataType))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
175 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
176 self->size = 8; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
177 self->length = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
178 self->data = malloc(self->size * sizeof(PyObject*)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
179 if (self->data) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
180 return (PyObject*)self; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
181 Py_DECREF(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
182 return PyErr_NoMemory(); |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
183 } |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
184 |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
185 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
186 stackUnderflow(void) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
187 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
188 PyErr_SetString(UnpicklingError, "unpickling stack underflow"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
189 return -1; |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
190 } |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
191 |
|
27615
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
192 /* Retain only the initial clearto items. If clearto >= the current |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
193 * number of items, this is a (non-erroneous) NOP. |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
194 */ |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
195 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
196 Pdata_clear(Pdata *self, int clearto) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
197 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
198 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
199 PyObject **p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
200 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
201 if (clearto < 0) return stackUnderflow(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
202 if (clearto >= self->length) return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
203 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
204 for (i = self->length, p = self->data + clearto; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
205 --i >= clearto; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
206 p++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
207 Py_CLEAR(*p); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
208 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
209 self->length = clearto; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
210 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
211 return 0; |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
212 } |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
213 |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
214 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
215 Pdata_grow(Pdata *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
216 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
217 int bigger; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
218 size_t nbytes; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
219 PyObject **tmp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
220 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
221 bigger = self->size << 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
222 if (bigger <= 0) /* was 0, or new value overflows */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
223 goto nomemory; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
224 if ((int)(size_t)bigger != bigger) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
225 goto nomemory; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
226 nbytes = (size_t)bigger * sizeof(PyObject *); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
227 if (nbytes / sizeof(PyObject *) != (size_t)bigger) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
228 goto nomemory; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
229 tmp = realloc(self->data, nbytes); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
230 if (tmp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
231 goto nomemory; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
232 self->data = tmp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
233 self->size = bigger; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
234 return 0; |
|
27615
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
235 |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
236 nomemory: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
237 PyErr_NoMemory(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
238 return -1; |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
239 } |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
240 |
|
27643
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
241 /* D is a Pdata*. Pop the topmost element and store it into V, which |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
242 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError |
|
27615
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
243 * is raised and V is set to NULL. D and V may be evaluated several times. |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
244 */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
245 #define PDATA_POP(D, V) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
246 if ((D)->length) \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
247 (V) = (D)->data[--((D)->length)]; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
248 else { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
249 PyErr_SetString(UnpicklingError, "bad pickle data"); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
250 (V) = NULL; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
251 } \ |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
252 } |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
253 |
|
27643
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
254 /* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata* |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
255 * D. If the Pdata stack can't be grown to hold the new value, both |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
256 * raise MemoryError and execute "return ER". The difference is in ownership |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
257 * of O after: _PUSH transfers ownership of O from the caller to the stack |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
258 * (no incref of O is done, and in case of error O is decrefed), while |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
259 * _APPEND pushes a new reference. |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
260 */ |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
261 |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
262 /* Push O on stack D, giving ownership of O to the stack. */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
263 #define PDATA_PUSH(D, O, ER) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
264 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
265 Pdata_grow((Pdata*)(D)) < 0) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
266 Py_DECREF(O); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
267 return ER; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
268 } \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
269 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \ |
|
27643
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
270 } |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
271 |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
272 /* Push O on stack D, pushing a new reference. */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
273 #define PDATA_APPEND(D, O, ER) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
274 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
275 Pdata_grow((Pdata*)(D)) < 0) \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
276 return ER; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
277 Py_INCREF(O); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
278 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \ |
|
27643
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
279 } |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
280 |
|
934a2b497d1d
PDATA_PUSH and PDATA_APPEND. documented, and reformatted for better
Tim Peters <tim.peters@gmail.com>
parents:
27615
diff
changeset
|
281 |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
282 static PyObject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
283 Pdata_popTuple(Pdata *self, int start) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
284 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
285 PyObject *r; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
286 int i, j, l; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
287 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
288 l = self->length-start; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
289 r = PyTuple_New(l); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
290 if (r == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
291 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
292 for (i = start, j = 0 ; j < l; i++, j++) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
293 PyTuple_SET_ITEM(r, j, self->data[i]); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
294 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
295 self->length = start; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
296 return r; |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
297 } |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
298 |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
299 static PyObject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
300 Pdata_popList(Pdata *self, int start) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
301 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
302 PyObject *r; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
303 int i, j, l; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
304 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
305 l=self->length-start; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
306 if (!( r=PyList_New(l))) return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
307 for (i=start, j=0 ; j < l; i++, j++) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
308 PyList_SET_ITEM(r, j, self->data[i]); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
309 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
310 self->length=start; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
311 return r; |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
312 } |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
313 |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
314 /*************************************************************************/ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
315 |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
316 #define ARG_TUP(self, o) { \ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
317 if (self->arg || (self->arg=PyTuple_New(1))) { \ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
318 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
319 PyTuple_SET_ITEM(self->arg,0,o); \ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
320 } \ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
321 else { \ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
322 Py_DECREF(o); \ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
323 } \ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
324 } |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
325 |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
326 #define FREE_ARG_TUP(self) { \ |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43472
diff
changeset
|
327 if (Py_REFCNT(self->arg) > 1) { \ |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
328 Py_DECREF(self->arg); \ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
329 self->arg=NULL; \ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
330 } \ |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
331 } |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
332 |
|
13666
36de7b6ab7eb
ANSIfication: add proper prototypes to function-pointers and declarations.
Thomas Wouters <thomas@python.org>
parents:
13576
diff
changeset
|
333 typedef struct Picklerobject { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
334 PyObject_HEAD |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
335 FILE *fp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
336 PyObject *write; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
337 PyObject *file; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
338 PyObject *memo; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
339 PyObject *arg; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
340 PyObject *pers_func; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
341 PyObject *inst_pers_func; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
342 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
343 /* pickle protocol number, >= 0 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
344 int proto; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
345 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
346 /* bool, true if proto > 0 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
347 int bin; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
348 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
349 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
350 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
351 char *write_buf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
352 int buf_size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
353 PyObject *dispatch_table; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
354 int fast_container; /* count nested container dumps */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
355 PyObject *fast_memo; |
| 4907 | 356 } Picklerobject; |
| 357 | |
|
21522
cb55f15b2730
Merge of the release22 branch changes back into the trunk.
Barry Warsaw <barry@python.org>
parents:
21486
diff
changeset
|
358 #ifndef PY_CPICKLE_FAST_LIMIT |
|
cb55f15b2730
Merge of the release22 branch changes back into the trunk.
Barry Warsaw <barry@python.org>
parents:
21486
diff
changeset
|
359 #define PY_CPICKLE_FAST_LIMIT 50 |
|
cb55f15b2730
Merge of the release22 branch changes back into the trunk.
Barry Warsaw <barry@python.org>
parents:
21486
diff
changeset
|
360 #endif |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
361 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24252
diff
changeset
|
362 static PyTypeObject Picklertype; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
363 |
|
13666
36de7b6ab7eb
ANSIfication: add proper prototypes to function-pointers and declarations.
Thomas Wouters <thomas@python.org>
parents:
13576
diff
changeset
|
364 typedef struct Unpicklerobject { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
365 PyObject_HEAD |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
366 FILE *fp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
367 PyObject *file; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
368 PyObject *readline; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
369 PyObject *read; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
370 PyObject *memo; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
371 PyObject *arg; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
372 Pdata *stack; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
373 PyObject *mark; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
374 PyObject *pers_func; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
375 PyObject *last_string; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
376 int *marks; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
377 int num_marks; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
378 int marks_size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
379 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
380 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
381 int buf_size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
382 char *buf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
383 PyObject *find_class; |
| 4907 | 384 } Unpicklerobject; |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
385 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24252
diff
changeset
|
386 static PyTypeObject Unpicklertype; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
387 |
|
13687
63832ede577f
... and yet more ANSIfications...
Thomas Wouters <thomas@python.org>
parents:
13666
diff
changeset
|
388 /* Forward decls that need the above structs */ |
|
63832ede577f
... and yet more ANSIfications...
Thomas Wouters <thomas@python.org>
parents:
13666
diff
changeset
|
389 static int save(Picklerobject *, PyObject *, int); |
|
63832ede577f
... and yet more ANSIfications...
Thomas Wouters <thomas@python.org>
parents:
13666
diff
changeset
|
390 static int put2(Picklerobject *, PyObject *); |
|
63832ede577f
... and yet more ANSIfications...
Thomas Wouters <thomas@python.org>
parents:
13666
diff
changeset
|
391 |
|
5283
82a3fbda3363
Give PyErr_Format a new name and make it static.
Guido van Rossum <guido@python.org>
parents:
5281
diff
changeset
|
392 static |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
393 PyObject * |
|
13666
36de7b6ab7eb
ANSIfication: add proper prototypes to function-pointers and declarations.
Thomas Wouters <thomas@python.org>
parents:
13576
diff
changeset
|
394 cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...) |
|
36de7b6ab7eb
ANSIfication: add proper prototypes to function-pointers and declarations.
Thomas Wouters <thomas@python.org>
parents:
13576
diff
changeset
|
395 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
396 va_list va; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
397 PyObject *args=0, *retval=0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
398 va_start(va, format); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
399 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
400 if (format) args = Py_VaBuildValue(format, va); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
401 va_end(va); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
402 if (format && ! args) return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
403 if (stringformat && !(retval=PyString_FromString(stringformat))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
404 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
405 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
406 if (retval) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
407 if (args) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
408 PyObject *v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
409 v=PyString_Format(retval, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
410 Py_DECREF(retval); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
411 Py_DECREF(args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
412 if (! v) return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
413 retval=v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
414 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
415 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
416 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
417 if (args) retval=args; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
418 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
419 PyErr_SetObject(ErrType,Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
420 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
421 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
422 PyErr_SetObject(ErrType,retval); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
423 Py_DECREF(retval); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
424 return NULL; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
425 } |
| 4907 | 426 |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
427 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
428 write_file(Picklerobject *self, const char *s, Py_ssize_t n) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
429 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
430 size_t nbyteswritten; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
431 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
432 if (s == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
433 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
434 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
435 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
436 if (n > INT_MAX) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
437 /* String too large */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
438 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
439 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
440 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
441 PyFile_IncUseCount((PyFileObject *)self->file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
442 Py_BEGIN_ALLOW_THREADS |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
443 nbyteswritten = fwrite(s, sizeof(char), n, self->fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
444 Py_END_ALLOW_THREADS |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
445 PyFile_DecUseCount((PyFileObject *)self->file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
446 if (nbyteswritten != (size_t)n) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
447 PyErr_SetFromErrno(PyExc_IOError); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
448 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
449 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
450 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
451 return (int)n; |
| 4907 | 452 } |
| 453 | |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
454 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
455 write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
456 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
457 if (s == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
458 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
459 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
460 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
461 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
462 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
463 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
464 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
465 return (int)n; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
466 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
467 |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
468 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
469 write_none(Picklerobject *self, const char *s, Py_ssize_t n) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
470 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
471 if (s == NULL) return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
472 if (n > INT_MAX) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
473 return (int)n; |
|
5991
a5737dd96979
cPickle release 0.3 from Jim Fulton
Guido van Rossum <guido@python.org>
parents:
5544
diff
changeset
|
474 } |
|
a5737dd96979
cPickle release 0.3 from Jim Fulton
Guido van Rossum <guido@python.org>
parents:
5544
diff
changeset
|
475 |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
476 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
477 write_other(Picklerobject *self, const char *s, Py_ssize_t _n) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
478 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
479 PyObject *py_str = 0, *junk = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
480 int n; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
481 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
482 if (_n > INT_MAX) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
483 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
484 n = (int)_n; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
485 if (s == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
486 if (!( self->buf_size )) return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
487 py_str = PyString_FromStringAndSize(self->write_buf, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
488 self->buf_size); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
489 if (!py_str) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
490 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
491 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
492 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
493 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
494 if (write_other(self, NULL, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
495 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
496 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
497 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
498 if (n > WRITE_BUF_SIZE) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
499 if (!( py_str = |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
500 PyString_FromStringAndSize(s, n))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
501 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
502 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
503 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
504 memcpy(self->write_buf + self->buf_size, s, n); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
505 self->buf_size += n; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
506 return n; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
507 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
508 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
509 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
510 if (self->write) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
511 /* object with write method */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
512 ARG_TUP(self, py_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
513 if (self->arg) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
514 junk = PyObject_Call(self->write, self->arg, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
515 FREE_ARG_TUP(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
516 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
517 if (junk) Py_DECREF(junk); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
518 else return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
519 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
520 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
521 PDATA_PUSH(self->file, py_str, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
522 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
523 self->buf_size = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
524 return n; |
| 4907 | 525 } |
| 526 | |
| 527 | |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
528 static Py_ssize_t |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
529 read_file(Unpicklerobject *self, char **s, Py_ssize_t n) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
530 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
531 size_t nbytesread; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
532 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
533 if (self->buf_size == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
534 int size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
535 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
536 size = ((n < 32) ? 32 : n); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
537 if (!( self->buf = (char *)malloc(size))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
538 PyErr_NoMemory(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
539 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
540 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
541 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
542 self->buf_size = size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
543 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
544 else if (n > self->buf_size) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
545 char *newbuf = (char *)realloc(self->buf, n); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
546 if (!newbuf) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
547 PyErr_NoMemory(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
548 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
549 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
550 self->buf = newbuf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
551 self->buf_size = n; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
552 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
553 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
554 PyFile_IncUseCount((PyFileObject *)self->file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
555 Py_BEGIN_ALLOW_THREADS |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
556 nbytesread = fread(self->buf, sizeof(char), n, self->fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
557 Py_END_ALLOW_THREADS |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
558 PyFile_DecUseCount((PyFileObject *)self->file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
559 if (nbytesread != (size_t)n) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
560 if (feof(self->fp)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
561 PyErr_SetNone(PyExc_EOFError); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
562 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
563 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
564 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
565 PyErr_SetFromErrno(PyExc_IOError); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
566 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
567 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
568 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
569 *s = self->buf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
570 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
571 return n; |
| 4907 | 572 } |
| 573 | |
| 574 | |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
575 static Py_ssize_t |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
576 readline_file(Unpicklerobject *self, char **s) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
577 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
578 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
579 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
580 if (self->buf_size == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
581 if (!( self->buf = (char *)malloc(40))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
582 PyErr_NoMemory(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
583 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
584 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
585 self->buf_size = 40; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
586 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
587 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
588 i = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
589 while (1) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
590 int bigger; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
591 char *newbuf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
592 for (; i < (self->buf_size - 1); i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
593 if (feof(self->fp) || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
594 (self->buf[i] = getc(self->fp)) == '\n') { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
595 self->buf[i + 1] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
596 *s = self->buf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
597 return i + 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
598 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
599 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
600 bigger = self->buf_size << 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
601 if (bigger <= 0) { /* overflow */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
602 PyErr_NoMemory(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
603 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
604 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
605 newbuf = (char *)realloc(self->buf, bigger); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
606 if (!newbuf) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
607 PyErr_NoMemory(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
608 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
609 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
610 self->buf = newbuf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
611 self->buf_size = bigger; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
612 } |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
613 } |
|
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
614 |
|
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
615 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
616 static Py_ssize_t |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
617 read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
618 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
619 char *ptr; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
620 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
621 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
622 PyErr_SetNone(PyExc_EOFError); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
623 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
624 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
625 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
626 *s = ptr; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
627 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
628 return n; |
| 4907 | 629 } |
| 630 | |
| 631 | |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
632 static Py_ssize_t |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
633 readline_cStringIO(Unpicklerobject *self, char **s) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
634 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
635 Py_ssize_t n; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
636 char *ptr; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
637 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
638 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
639 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
640 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
641 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
642 *s = ptr; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
643 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
644 return n; |
| 4907 | 645 } |
| 646 | |
| 647 | |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
648 static Py_ssize_t |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
649 read_other(Unpicklerobject *self, char **s, Py_ssize_t n) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
650 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
651 PyObject *bytes, *str=0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
652 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
653 if (!( bytes = PyInt_FromSsize_t(n))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
654 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
655 ARG_TUP(self, bytes); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
656 if (self->arg) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
657 str = PyObject_Call(self->read, self->arg, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
658 FREE_ARG_TUP(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
659 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
660 if (! str) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
661 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
662 Py_XDECREF(self->last_string); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
663 self->last_string = str; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
664 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
665 if (! (*s = PyString_AsString(str))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
666 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
667 if (PyString_GET_SIZE(str) != n) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
668 PyErr_SetNone(PyExc_EOFError); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
669 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
670 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
671 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
672 return n; |
| 4907 | 673 } |
| 674 | |
| 675 | |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
676 static Py_ssize_t |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
677 readline_other(Unpicklerobject *self, char **s) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
678 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
679 PyObject *str; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
680 Py_ssize_t str_size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
681 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
682 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
683 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
684 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
685 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
686 if ((str_size = PyString_Size(str)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
687 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
688 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
689 Py_XDECREF(self->last_string); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
690 self->last_string = str; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
691 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
692 if (! (*s = PyString_AsString(str))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
693 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
694 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
695 return str_size; |
| 4907 | 696 } |
| 697 | |
|
27585
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
698 /* Copy the first n bytes from s into newly malloc'ed memory, plus a |
|
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
699 * trailing 0 byte. Return a pointer to that, or NULL if out of memory. |
|
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
700 * The caller is responsible for free()'ing the return value. |
|
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
701 */ |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
702 static char * |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
34126
diff
changeset
|
703 pystrndup(const char *s, int n) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
704 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
705 char *r = (char *)malloc(n+1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
706 if (r == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
707 return (char*)PyErr_NoMemory(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
708 memcpy(r, s, n); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
709 r[n] = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
710 return r; |
| 4907 | 711 } |
| 712 | |
| 713 | |
| 714 static int | |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
715 get(Picklerobject *self, PyObject *id) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
716 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
717 PyObject *value, *mv; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
718 long c_value; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
719 char s[30]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
720 size_t len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
721 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
722 if (!( mv = PyDict_GetItem(self->memo, id))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
723 PyErr_SetObject(PyExc_KeyError, id); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
724 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
725 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
726 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
727 if (!( value = PyTuple_GetItem(mv, 0))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
728 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
729 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
730 if (!( PyInt_Check(value))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
731 PyErr_SetString(PicklingError, "no int where int expected in memo"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
732 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
733 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
734 c_value = PyInt_AS_LONG((PyIntObject*)value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
735 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
736 if (!self->bin) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
737 s[0] = GET; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
738 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
739 len = strlen(s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
740 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
741 else if (Pdata_Check(self->file)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
742 if (write_other(self, NULL, 0) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
743 PDATA_APPEND(self->file, mv, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
744 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
745 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
746 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
747 if (c_value < 256) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
748 s[0] = BINGET; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
749 s[1] = (int)(c_value & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
750 len = 2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
751 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
752 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
753 s[0] = LONG_BINGET; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
754 s[1] = (int)(c_value & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
755 s[2] = (int)((c_value >> 8) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
756 s[3] = (int)((c_value >> 16) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
757 s[4] = (int)((c_value >> 24) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
758 len = 5; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
759 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
760 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
761 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
762 if (self->write_func(self, s, len) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
763 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
764 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
765 return 0; |
| 4907 | 766 } |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
767 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
768 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
769 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
770 put(Picklerobject *self, PyObject *ob) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
771 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
772 if (Py_REFCNT(ob) < 2 || self->fast) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
773 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
774 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
775 return put2(self, ob); |
| 4907 | 776 } |
| 777 | |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
778 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
779 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
780 put2(Picklerobject *self, PyObject *ob) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
781 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
782 char c_str[30]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
783 int p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
784 size_t len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
785 int res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
786 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
787 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
788 if (self->fast) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
789 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
790 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
791 if ((p = PyDict_Size(self->memo)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
792 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
793 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
794 /* Make sure memo keys are positive! */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
795 /* XXX Why? |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
796 * XXX And does "positive" really mean non-negative? |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
797 * XXX pickle.py starts with PUT index 0, not 1. This makes for |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
798 * XXX gratuitous differences between the pickling modules. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
799 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
800 p++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
801 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
802 if (!( py_ob_id = PyLong_FromVoidPtr(ob))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
803 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
804 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
805 if (!( memo_len = PyInt_FromLong(p))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
806 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
807 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
808 if (!( t = PyTuple_New(2))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
809 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
810 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
811 PyTuple_SET_ITEM(t, 0, memo_len); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
812 Py_INCREF(memo_len); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
813 PyTuple_SET_ITEM(t, 1, ob); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
814 Py_INCREF(ob); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
815 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
816 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
817 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
818 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
819 if (!self->bin) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
820 c_str[0] = PUT; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
821 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
822 len = strlen(c_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
823 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
824 else if (Pdata_Check(self->file)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
825 if (write_other(self, NULL, 0) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
826 PDATA_APPEND(self->file, memo_len, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
827 res=0; /* Job well done ;) */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
828 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
829 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
830 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
831 if (p >= 256) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
832 c_str[0] = LONG_BINPUT; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
833 c_str[1] = (int)(p & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
834 c_str[2] = (int)((p >> 8) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
835 c_str[3] = (int)((p >> 16) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
836 c_str[4] = (int)((p >> 24) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
837 len = 5; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
838 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
839 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
840 c_str[0] = BINPUT; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
841 c_str[1] = p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
842 len = 2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
843 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
844 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
845 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
846 if (self->write_func(self, c_str, len) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
847 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
848 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
849 res = 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
850 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
851 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
852 Py_XDECREF(py_ob_id); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
853 Py_XDECREF(memo_len); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
854 Py_XDECREF(t); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
855 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
856 return res; |
| 4907 | 857 } |
| 858 | |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
859 static PyObject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
860 whichmodule(PyObject *global, PyObject *global_name) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
861 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
862 Py_ssize_t i, j; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
863 PyObject *module = 0, *modules_dict = 0, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
864 *global_name_attr = 0, *name = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
865 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
866 module = PyObject_GetAttrString(global, "__module__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
867 if (module) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
868 return module; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
869 if (PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
870 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
871 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
872 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
873 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
874 if (!( modules_dict = PySys_GetObject("modules"))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
875 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
876 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
877 i = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
878 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
879 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
880 if (PyObject_Compare(name, __main___str)==0) continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
881 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
882 global_name_attr = PyObject_GetAttr(module, global_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
883 if (!global_name_attr) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
884 if (PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
885 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
886 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
887 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
888 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
889 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
890 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
891 if (global_name_attr != global) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
892 Py_DECREF(global_name_attr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
893 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
894 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
895 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
896 Py_DECREF(global_name_attr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
897 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
898 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
899 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
900 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
901 /* The following implements the rule in pickle.py added in 1.5 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
902 that used __main__ if no module is found. I don't actually |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
903 like this rule. jlf |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
904 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
905 if (!j) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
906 name=__main___str; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
907 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
908 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
909 Py_INCREF(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
910 return name; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
911 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
912 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
913 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
914 static int |
|
20443
03624d7484fa
Better fix for core dumps on recursive objects in fast mode.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20385
diff
changeset
|
915 fast_save_enter(Picklerobject *self, PyObject *obj) |
|
03624d7484fa
Better fix for core dumps on recursive objects in fast mode.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20385
diff
changeset
|
916 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
917 /* if fast_container < 0, we're doing an error exit. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
918 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
919 PyObject *key = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
920 if (self->fast_memo == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
921 self->fast_memo = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
922 if (self->fast_memo == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
923 self->fast_container = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
924 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
925 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
926 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
927 key = PyLong_FromVoidPtr(obj); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
928 if (key == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
929 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
930 if (PyDict_GetItem(self->fast_memo, key)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
931 Py_DECREF(key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
932 PyErr_Format(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
933 "fast mode: can't pickle cyclic objects " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
934 "including object type %s at %p", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
935 Py_TYPE(obj)->tp_name, obj); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
936 self->fast_container = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
937 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
938 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
939 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
940 Py_DECREF(key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
941 self->fast_container = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
942 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
943 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
944 Py_DECREF(key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
945 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
946 return 1; |
|
20443
03624d7484fa
Better fix for core dumps on recursive objects in fast mode.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20385
diff
changeset
|
947 } |
|
03624d7484fa
Better fix for core dumps on recursive objects in fast mode.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20385
diff
changeset
|
948 |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
949 int |
|
20443
03624d7484fa
Better fix for core dumps on recursive objects in fast mode.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20385
diff
changeset
|
950 fast_save_leave(Picklerobject *self, PyObject *obj) |
|
03624d7484fa
Better fix for core dumps on recursive objects in fast mode.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20385
diff
changeset
|
951 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
952 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
953 PyObject *key = PyLong_FromVoidPtr(obj); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
954 if (key == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
955 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
956 if (PyDict_DelItem(self->fast_memo, key) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
957 Py_DECREF(key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
958 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
959 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
960 Py_DECREF(key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
961 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
962 return 1; |
|
20443
03624d7484fa
Better fix for core dumps on recursive objects in fast mode.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20385
diff
changeset
|
963 } |
|
03624d7484fa
Better fix for core dumps on recursive objects in fast mode.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20385
diff
changeset
|
964 |
|
03624d7484fa
Better fix for core dumps on recursive objects in fast mode.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20385
diff
changeset
|
965 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
966 save_none(Picklerobject *self, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
967 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
968 static char none = NONE; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
969 if (self->write_func(self, &none, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
970 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
971 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
972 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
973 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
974 |
|
22785
aa8d59823add
Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents:
22732
diff
changeset
|
975 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
976 save_bool(Picklerobject *self, PyObject *args) |
|
22785
aa8d59823add
Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents:
22732
diff
changeset
|
977 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
978 static const char *buf[2] = {FALSE, TRUE}; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
979 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1}; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
980 long l = PyInt_AS_LONG((PyIntObject *)args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
981 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
982 if (self->proto >= 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
983 char opcode = l ? NEWTRUE : NEWFALSE; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
984 if (self->write_func(self, &opcode, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
985 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
986 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
987 else if (self->write_func(self, buf[l], len[l]) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
988 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
989 return 0; |
|
22785
aa8d59823add
Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents:
22732
diff
changeset
|
990 } |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
991 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
992 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
993 save_int(Picklerobject *self, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
994 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
995 char c_str[32]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
996 long l = PyInt_AS_LONG((PyIntObject *)args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
997 int len = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
998 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
999 if (!self->bin |
|
5498
9a1225923918
Use compile-time test for 64-bit hardware instead of run-time test.
Guido van Rossum <guido@python.org>
parents:
5438
diff
changeset
|
1000 #if SIZEOF_LONG > 4 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1001 || l > 0x7fffffffL |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1002 || l < -0x80000000L |
|
5498
9a1225923918
Use compile-time test for 64-bit hardware instead of run-time test.
Guido van Rossum <guido@python.org>
parents:
5438
diff
changeset
|
1003 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1004 ) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1005 /* Text-mode pickle, or long too big to fit in the 4-byte |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1006 * signed BININT format: store as a string. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1007 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1008 c_str[0] = INT; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1009 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1010 if (self->write_func(self, c_str, strlen(c_str)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1011 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1012 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1013 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1014 /* Binary pickle and l fits in a signed 4-byte int. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1015 c_str[1] = (int)( l & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1016 c_str[2] = (int)((l >> 8) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1017 c_str[3] = (int)((l >> 16) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1018 c_str[4] = (int)((l >> 24) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1019 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1020 if ((c_str[4] == 0) && (c_str[3] == 0)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1021 if (c_str[2] == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1022 c_str[0] = BININT1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1023 len = 2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1024 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1025 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1026 c_str[0] = BININT2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1027 len = 3; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1028 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1029 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1030 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1031 c_str[0] = BININT; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1032 len = 5; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1033 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1034 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1035 if (self->write_func(self, c_str, len) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1036 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1037 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1038 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1039 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1040 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1041 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1042 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1043 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
1044 save_long(Picklerobject *self, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1045 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1046 Py_ssize_t size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1047 int res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1048 PyObject *repr = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1049 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1050 static char l = LONG; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1051 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1052 if (self->proto >= 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1053 /* Linear-time pickling. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1054 size_t nbits; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1055 size_t nbytes; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1056 unsigned char *pdata; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1057 char c_str[5]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1058 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1059 int sign = _PyLong_Sign(args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1060 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1061 if (sign == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1062 /* It's 0 -- an empty bytestring. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1063 c_str[0] = LONG1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1064 c_str[1] = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1065 i = self->write_func(self, c_str, 2); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1066 if (i < 0) goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1067 res = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1068 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1069 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1070 nbits = _PyLong_NumBits(args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1071 if (nbits == (size_t)-1 && PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1072 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1073 /* How many bytes do we need? There are nbits >> 3 full |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1074 * bytes of data, and nbits & 7 leftover bits. If there |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1075 * are any leftover bits, then we clearly need another |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1076 * byte. Wnat's not so obvious is that we *probably* |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1077 * need another byte even if there aren't any leftovers: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1078 * the most-significant bit of the most-significant byte |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1079 * acts like a sign bit, and it's usually got a sense |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1080 * opposite of the one we need. The exception is longs |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1081 * of the form -(2**(8*j-1)) for j > 0. Such a long is |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1082 * its own 256's-complement, so has the right sign bit |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1083 * even without the extra byte. That's a pain to check |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1084 * for in advance, though, so we always grab an extra |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1085 * byte at the start, and cut it back later if possible. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1086 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1087 nbytes = (nbits >> 3) + 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1088 if (nbytes > INT_MAX) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1089 PyErr_SetString(PyExc_OverflowError, "long too large " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1090 "to pickle"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1091 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1092 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1093 repr = PyString_FromStringAndSize(NULL, (int)nbytes); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1094 if (repr == NULL) goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1095 pdata = (unsigned char *)PyString_AS_STRING(repr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1096 i = _PyLong_AsByteArray((PyLongObject *)args, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1097 pdata, nbytes, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1098 1 /* little endian */, 1 /* signed */); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1099 if (i < 0) goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1100 /* If the long is negative, this may be a byte more than |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1101 * needed. This is so iff the MSB is all redundant sign |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1102 * bits. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1103 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1104 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1105 (pdata[nbytes - 2] & 0x80) != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1106 --nbytes; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1107 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1108 if (nbytes < 256) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1109 c_str[0] = LONG1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1110 c_str[1] = (char)nbytes; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1111 size = 2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1112 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1113 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1114 c_str[0] = LONG4; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1115 size = (int)nbytes; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1116 for (i = 1; i < 5; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1117 c_str[i] = (char)(size & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1118 size >>= 8; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1119 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1120 size = 5; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1121 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1122 i = self->write_func(self, c_str, size); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1123 if (i < 0) goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1124 i = self->write_func(self, (char *)pdata, (int)nbytes); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1125 if (i < 0) goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1126 res = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1127 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1128 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1129 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1130 /* proto < 2: write the repr and newline. This is quadratic-time |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1131 * (in the number of digits), in both directions. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1132 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1133 if (!( repr = PyObject_Repr(args))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1134 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1135 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1136 if ((size = PyString_Size(repr)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1137 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1138 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1139 if (self->write_func(self, &l, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1140 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1141 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1142 if (self->write_func(self, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1143 PyString_AS_STRING((PyStringObject *)repr), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1144 size) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1145 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1146 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1147 if (self->write_func(self, "\n", 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1148 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1149 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1150 res = 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1151 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1152 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1153 Py_XDECREF(repr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1154 return res; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1155 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1156 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1157 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1158 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
1159 save_float(Picklerobject *self, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1160 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1161 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1162 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1163 if (self->bin) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1164 char str[9]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1165 str[0] = BINFLOAT; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1166 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1167 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1168 if (self->write_func(self, str, 9) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1169 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1170 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1171 else { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1172 int result = -1; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1173 char *buf = NULL; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1174 char op = FLOAT; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1175 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1176 if (self->write_func(self, &op, 1) < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1177 goto done; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1178 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1179 buf = PyOS_double_to_string(x, 'g', 17, 0, NULL); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1180 if (!buf) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1181 PyErr_NoMemory(); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1182 goto done; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1183 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1184 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1185 if (self->write_func(self, buf, strlen(buf)) < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1186 goto done; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1187 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1188 if (self->write_func(self, "\n", 1) < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1189 goto done; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1190 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1191 result = 0; |
|
56754
38a5754b3037
Continue removing _PyOS_double_to_string, as mentioned in issue 7117.
Eric Smith <eric@trueblade.com>
parents:
56532
diff
changeset
|
1192 done: |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1193 PyMem_Free(buf); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1194 return result; |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1195 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1196 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1197 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1198 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1199 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1200 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1201 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
1202 save_string(Picklerobject *self, PyObject *args, int doput) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1203 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1204 int size, len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1205 PyObject *repr=0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1206 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1207 if ((size = PyString_Size(args)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1208 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1209 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1210 if (!self->bin) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1211 char *repr_str; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1212 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1213 static char string = STRING; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1214 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1215 if (!( repr = PyObject_Repr(args))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1216 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1217 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1218 if ((len = PyString_Size(repr)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1219 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1220 repr_str = PyString_AS_STRING((PyStringObject *)repr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1221 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1222 if (self->write_func(self, &string, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1223 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1224 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1225 if (self->write_func(self, repr_str, len) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1226 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1227 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1228 if (self->write_func(self, "\n", 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1229 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1230 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1231 Py_XDECREF(repr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1232 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1233 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1234 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1235 char c_str[5]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1236 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1237 if (size < 256) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1238 c_str[0] = SHORT_BINSTRING; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1239 c_str[1] = size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1240 len = 2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1241 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1242 else if (size <= INT_MAX) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1243 c_str[0] = BINSTRING; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1244 for (i = 1; i < 5; i++) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1245 c_str[i] = (int)(size >> ((i - 1) * 8)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1246 len = 5; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1247 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1248 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1249 return -1; /* string too large */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1250 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1251 if (self->write_func(self, c_str, len) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1252 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1253 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1254 if (size > 128 && Pdata_Check(self->file)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1255 if (write_other(self, NULL, 0) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1256 PDATA_APPEND(self->file, args, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1257 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1258 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1259 if (self->write_func(self, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1260 PyString_AS_STRING( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1261 (PyStringObject *)args), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1262 size) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1263 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1264 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1265 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1266 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1267 if (doput) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1268 if (put(self, args) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1269 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1270 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1271 return 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1272 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1273 err: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1274 Py_XDECREF(repr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1275 return -1; |
| 4907 | 1276 } |
| 1277 | |
| 1278 | |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
1279 #ifdef Py_USING_UNICODE |
|
15607
59bfbbe581c2
Minimal fix for the complaints about pickling Unicode objects. (SF
Guido van Rossum <guido@python.org>
parents:
15011
diff
changeset
|
1280 /* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates |
|
59bfbbe581c2
Minimal fix for the complaints about pickling Unicode objects. (SF
Guido van Rossum <guido@python.org>
parents:
15011
diff
changeset
|
1281 backslash and newline characters to \uXXXX escapes. */ |
|
59bfbbe581c2
Minimal fix for the complaints about pickling Unicode objects. (SF
Guido van Rossum <guido@python.org>
parents:
15011
diff
changeset
|
1282 static PyObject * |
|
50290
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1283 modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size) |
|
15607
59bfbbe581c2
Minimal fix for the complaints about pickling Unicode objects. (SF
Guido van Rossum <guido@python.org>
parents:
15011
diff
changeset
|
1284 { |
|
50290
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1285 PyObject *repr; |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1286 char *p; |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1287 char *q; |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1288 |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1289 static const char *hexdigit = "0123456789abcdef"; |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1290 #ifdef Py_UNICODE_WIDE |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1291 const Py_ssize_t expandsize = 10; |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1292 #else |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1293 const Py_ssize_t expandsize = 6; |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1294 #endif |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1295 |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1296 if (size > PY_SSIZE_T_MAX / expandsize) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1297 return PyErr_NoMemory(); |
|
50290
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1298 |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1299 repr = PyString_FromStringAndSize(NULL, expandsize * size); |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1300 if (repr == NULL) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1301 return NULL; |
|
50290
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1302 if (size == 0) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1303 return repr; |
|
50290
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1304 |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1305 p = q = PyString_AS_STRING(repr); |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1306 while (size-- > 0) { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1307 Py_UNICODE ch = *s++; |
|
50290
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1308 #ifdef Py_UNICODE_WIDE |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1309 /* Map 32-bit characters to '\Uxxxxxxxx' */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1310 if (ch >= 0x10000) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1311 *p++ = '\\'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1312 *p++ = 'U'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1313 *p++ = hexdigit[(ch >> 28) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1314 *p++ = hexdigit[(ch >> 24) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1315 *p++ = hexdigit[(ch >> 20) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1316 *p++ = hexdigit[(ch >> 16) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1317 *p++ = hexdigit[(ch >> 12) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1318 *p++ = hexdigit[(ch >> 8) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1319 *p++ = hexdigit[(ch >> 4) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1320 *p++ = hexdigit[ch & 15]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1321 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1322 else |
|
50290
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1323 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1324 /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1325 if (ch >= 0xD800 && ch < 0xDC00) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1326 Py_UNICODE ch2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1327 Py_UCS4 ucs; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1328 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1329 ch2 = *s++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1330 size--; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1331 if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1332 ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1333 *p++ = '\\'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1334 *p++ = 'U'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1335 *p++ = hexdigit[(ucs >> 28) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1336 *p++ = hexdigit[(ucs >> 24) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1337 *p++ = hexdigit[(ucs >> 20) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1338 *p++ = hexdigit[(ucs >> 16) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1339 *p++ = hexdigit[(ucs >> 12) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1340 *p++ = hexdigit[(ucs >> 8) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1341 *p++ = hexdigit[(ucs >> 4) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1342 *p++ = hexdigit[ucs & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1343 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1344 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1345 /* Fall through: isolated surrogates are copied as-is */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1346 s--; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1347 size++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1348 } |
|
50290
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1349 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1350 /* Map 16-bit characters to '\uxxxx' */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1351 if (ch >= 256 || ch == '\\' || ch == '\n') { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1352 *p++ = '\\'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1353 *p++ = 'u'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1354 *p++ = hexdigit[(ch >> 12) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1355 *p++ = hexdigit[(ch >> 8) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1356 *p++ = hexdigit[(ch >> 4) & 0xf]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1357 *p++ = hexdigit[ch & 15]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1358 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1359 /* Copy everything else as-is */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1360 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1361 *p++ = (char) ch; |
|
50290
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1362 } |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1363 *p = '\0'; |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1364 _PyString_Resize(&repr, p - q); |
|
d27024755593
Merged revisions 67934-67935 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
49609
diff
changeset
|
1365 return repr; |
|
15607
59bfbbe581c2
Minimal fix for the complaints about pickling Unicode objects. (SF
Guido van Rossum <guido@python.org>
parents:
15011
diff
changeset
|
1366 } |
|
59bfbbe581c2
Minimal fix for the complaints about pickling Unicode objects. (SF
Guido van Rossum <guido@python.org>
parents:
15011
diff
changeset
|
1367 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1368 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
1369 save_unicode(Picklerobject *self, PyObject *args, int doput) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1370 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1371 Py_ssize_t size, len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1372 PyObject *repr=0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1373 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1374 if (!PyUnicode_Check(args)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1375 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1376 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1377 if (!self->bin) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1378 char *repr_str; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1379 static char string = UNICODE; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1380 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1381 repr = modified_EncodeRawUnicodeEscape( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1382 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1383 if (!repr) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1384 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1385 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1386 if ((len = PyString_Size(repr)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1387 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1388 repr_str = PyString_AS_STRING((PyStringObject *)repr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1389 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1390 if (self->write_func(self, &string, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1391 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1392 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1393 if (self->write_func(self, repr_str, len) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1394 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1395 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1396 if (self->write_func(self, "\n", 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1397 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1398 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1399 Py_XDECREF(repr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1400 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1401 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1402 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1403 char c_str[5]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1404 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1405 if (!( repr = PyUnicode_AsUTF8String(args))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1406 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1407 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1408 if ((size = PyString_Size(repr)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1409 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1410 if (size > INT_MAX) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1411 return -1; /* string too large */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1412 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1413 c_str[0] = BINUNICODE; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1414 for (i = 1; i < 5; i++) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1415 c_str[i] = (int)(size >> ((i - 1) * 8)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1416 len = 5; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1417 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1418 if (self->write_func(self, c_str, len) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1419 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1420 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1421 if (size > 128 && Pdata_Check(self->file)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1422 if (write_other(self, NULL, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1423 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1424 PDATA_APPEND(self->file, repr, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1425 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1426 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1427 if (self->write_func(self, PyString_AS_STRING(repr), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1428 size) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1429 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1430 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1431 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1432 Py_DECREF(repr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1433 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1434 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1435 if (doput) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1436 if (put(self, args) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1437 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1438 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1439 return 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1440 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1441 err: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1442 Py_XDECREF(repr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1443 return -1; |
|
11982
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
1444 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
1445 #endif |
|
11982
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
1446 |
|
27615
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1447 /* A helper for save_tuple. Push the len elements in tuple t on the stack. */ |
|
11982
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
1448 static int |
| 27687 | 1449 store_tuple_elements(Picklerobject *self, PyObject *t, int len) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1450 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1451 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1452 int res = -1; /* guilty until proved innocent */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1453 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1454 assert(PyTuple_Size(t) == len); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1455 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1456 for (i = 0; i < len; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1457 PyObject *element = PyTuple_GET_ITEM(t, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1458 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1459 if (element == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1460 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1461 if (save(self, element, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1462 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1463 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1464 res = 0; |
|
27615
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1465 |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1466 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1467 return res; |
|
27615
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1468 } |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1469 |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1470 /* Tuples are ubiquitous in the pickle protocols, so many techniques are |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1471 * used across protocols to minimize the space needed to pickle them. |
| 27687 | 1472 * Tuples are also the only builtin immutable type that can be recursive |
|
27615
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1473 * (a tuple can be reached from itself), and that requires some subtle |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1474 * magic so that it works in all cases. IOW, this is a long routine. |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1475 */ |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1476 static int |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1477 save_tuple(Picklerobject *self, PyObject *args) |
|
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1478 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1479 PyObject *py_tuple_id = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1480 int len, i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1481 int res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1482 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1483 static char tuple = TUPLE; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1484 static char pop = POP; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1485 static char pop_mark = POP_MARK; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1486 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3}; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1487 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1488 if ((len = PyTuple_Size(args)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1489 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1490 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1491 if (len == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1492 char c_str[2]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1493 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1494 if (self->proto) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1495 c_str[0] = EMPTY_TUPLE; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1496 len = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1497 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1498 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1499 c_str[0] = MARK; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1500 c_str[1] = TUPLE; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1501 len = 2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1502 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1503 if (self->write_func(self, c_str, len) >= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1504 res = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1505 /* Don't memoize an empty tuple. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1506 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1507 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1508 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1509 /* A non-empty tuple. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1510 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1511 /* id(tuple) isn't in the memo now. If it shows up there after |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1512 * saving the tuple elements, the tuple must be recursive, in |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1513 * which case we'll pop everything we put on the stack, and fetch |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1514 * its value from the memo. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1515 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1516 py_tuple_id = PyLong_FromVoidPtr(args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1517 if (py_tuple_id == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1518 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1519 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1520 if (len <= 3 && self->proto >= 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1521 /* Use TUPLE{1,2,3} opcodes. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1522 if (store_tuple_elements(self, args, len) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1523 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1524 if (PyDict_GetItem(self->memo, py_tuple_id)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1525 /* pop the len elements */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1526 for (i = 0; i < len; ++i) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1527 if (self->write_func(self, &pop, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1528 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1529 /* fetch from memo */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1530 if (get(self, py_tuple_id) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1531 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1532 res = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1533 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1534 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1535 /* Not recursive. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1536 if (self->write_func(self, len2opcode + len, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1537 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1538 goto memoize; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1539 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1540 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1541 /* proto < 2 and len > 0, or proto >= 2 and len > 3. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1542 * Generate MARK elt1 elt2 ... TUPLE |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1543 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1544 if (self->write_func(self, &MARKv, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1545 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1546 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1547 if (store_tuple_elements(self, args, len) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1548 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1549 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1550 if (PyDict_GetItem(self->memo, py_tuple_id)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1551 /* pop the stack stuff we pushed */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1552 if (self->bin) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1553 if (self->write_func(self, &pop_mark, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1554 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1555 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1556 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1557 /* Note that we pop one more than len, to remove |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1558 * the MARK too. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1559 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1560 for (i = 0; i <= len; i++) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1561 if (self->write_func(self, &pop, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1562 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1563 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1564 /* fetch from memo */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1565 if (get(self, py_tuple_id) >= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1566 res = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1567 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1568 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1569 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1570 /* Not recursive. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1571 if (self->write_func(self, &tuple, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1572 goto finally; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1573 |
|
27615
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
1574 memoize: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1575 if (put(self, args) >= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1576 res = 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1577 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1578 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1579 Py_XDECREF(py_tuple_id); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1580 return res; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1581 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1582 |
|
27822
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1583 /* iter is an iterator giving items, and we batch up chunks of |
|
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1584 * MARK item item ... item APPENDS |
|
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1585 * opcode sequences. Calling code should have arranged to first create an |
|
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1586 * empty list, or list-like object, for the APPENDS to operate on. |
|
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1587 * Returns 0 on success, <0 on error. |
|
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1588 */ |
|
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1589 static int |
|
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1590 batch_list(Picklerobject *self, PyObject *iter) |
|
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1591 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1592 PyObject *obj = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1593 PyObject *firstitem = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1594 int i, n; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1595 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1596 static char append = APPEND; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1597 static char appends = APPENDS; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1598 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1599 assert(iter != NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1600 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1601 if (self->proto == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1602 /* APPENDS isn't available; do one at a time. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1603 for (;;) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1604 obj = PyIter_Next(iter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1605 if (obj == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1606 if (PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1607 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1608 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1609 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1610 i = save(self, obj, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1611 Py_DECREF(obj); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1612 if (i < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1613 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1614 if (self->write_func(self, &append, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1615 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1616 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1617 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1618 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1619 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1620 /* proto > 0: write in batches of BATCHSIZE. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1621 do { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1622 /* Get first item */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1623 firstitem = PyIter_Next(iter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1624 if (firstitem == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1625 if (PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1626 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1627 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1628 /* nothing more to add */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1629 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1630 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1631 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1632 /* Try to get a second item */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1633 obj = PyIter_Next(iter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1634 if (obj == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1635 if (PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1636 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1637 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1638 /* Only one item to write */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1639 if (save(self, firstitem, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1640 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1641 if (self->write_func(self, &append, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1642 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1643 Py_CLEAR(firstitem); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1644 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1645 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1646 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1647 /* More than one item to write */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1648 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1649 /* Pump out MARK, items, APPENDS. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1650 if (self->write_func(self, &MARKv, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1651 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1652 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1653 if (save(self, firstitem, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1654 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1655 Py_CLEAR(firstitem); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1656 n = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1657 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1658 /* Fetch and save up to BATCHSIZE items */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1659 while (obj) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1660 if (save(self, obj, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1661 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1662 Py_CLEAR(obj); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1663 n += 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1664 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1665 if (n == BATCHSIZE) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1666 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1667 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1668 obj = PyIter_Next(iter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1669 if (obj == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1670 if (PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1671 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1672 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1673 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1674 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1675 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1676 if (self->write_func(self, &appends, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1677 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1678 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1679 } while (n == BATCHSIZE); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1680 return 0; |
|
27822
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1681 |
|
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1682 BatchFailed: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1683 Py_XDECREF(firstitem); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1684 Py_XDECREF(obj); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1685 return -1; |
|
27822
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1686 } |
|
19ac12ac8041
Implemented list batching in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27688
diff
changeset
|
1687 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1688 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
1689 save_list(Picklerobject *self, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1690 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1691 int res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1692 char s[3]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1693 int len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1694 PyObject *iter; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1695 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1696 if (self->fast && !fast_save_enter(self, args)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1697 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1698 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1699 /* Create an empty list. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1700 if (self->bin) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1701 s[0] = EMPTY_LIST; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1702 len = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1703 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1704 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1705 s[0] = MARK; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1706 s[1] = LIST; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1707 len = 2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1708 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1709 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1710 if (self->write_func(self, s, len) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1711 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1712 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1713 /* Get list length, and bow out early if empty. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1714 if ((len = PyList_Size(args)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1715 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1716 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1717 /* Memoize. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1718 if (len == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1719 if (put(self, args) >= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1720 res = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1721 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1722 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1723 if (put2(self, args) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1724 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1725 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1726 /* Materialize the list elements. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1727 iter = PyObject_GetIter(args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1728 if (iter == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1729 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1730 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1731 if (Py_EnterRecursiveCall(" while pickling an object") == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1732 { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1733 res = batch_list(self, iter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1734 Py_LeaveRecursiveCall(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1735 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1736 Py_DECREF(iter); |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1737 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1738 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1739 if (self->fast && !fast_save_leave(self, args)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1740 res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1741 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1742 return res; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1743 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1744 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1745 |
|
27825
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1746 /* iter is an iterator giving (key, value) pairs, and we batch up chunks of |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1747 * MARK key value ... key value SETITEMS |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1748 * opcode sequences. Calling code should have arranged to first create an |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1749 * empty dict, or dict-like object, for the SETITEMS to operate on. |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1750 * Returns 0 on success, <0 on error. |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1751 * |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1752 * This is very much like batch_list(). The difference between saving |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1753 * elements directly, and picking apart two-tuples, is so long-winded at |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1754 * the C level, though, that attempts to combine these routines were too |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1755 * ugly to bear. |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1756 */ |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1757 static int |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1758 batch_dict(Picklerobject *self, PyObject *iter) |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1759 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1760 PyObject *p = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1761 PyObject *firstitem = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1762 int i, n; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1763 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1764 static char setitem = SETITEM; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1765 static char setitems = SETITEMS; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1766 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1767 assert(iter != NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1768 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1769 if (self->proto == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1770 /* SETITEMS isn't available; do one at a time. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1771 for (;;) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1772 p = PyIter_Next(iter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1773 if (p == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1774 if (PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1775 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1776 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1777 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1778 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1779 PyErr_SetString(PyExc_TypeError, "dict items " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1780 "iterator must return 2-tuples"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1781 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1782 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1783 i = save(self, PyTuple_GET_ITEM(p, 0), 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1784 if (i >= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1785 i = save(self, PyTuple_GET_ITEM(p, 1), 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1786 Py_DECREF(p); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1787 if (i < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1788 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1789 if (self->write_func(self, &setitem, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1790 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1791 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1792 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1793 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1794 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1795 /* proto > 0: write in batches of BATCHSIZE. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1796 do { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1797 /* Get first item */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1798 firstitem = PyIter_Next(iter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1799 if (firstitem == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1800 if (PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1801 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1802 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1803 /* nothing more to add */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1804 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1805 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1806 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1807 PyErr_SetString(PyExc_TypeError, "dict items " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1808 "iterator must return 2-tuples"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1809 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1810 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1811 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1812 /* Try to get a second item */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1813 p = PyIter_Next(iter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1814 if (p == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1815 if (PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1816 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1817 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1818 /* Only one item to write */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1819 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1820 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1821 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1822 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1823 if (self->write_func(self, &setitem, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1824 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1825 Py_CLEAR(firstitem); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1826 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1827 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1828 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1829 /* More than one item to write */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1830 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1831 /* Pump out MARK, items, SETITEMS. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1832 if (self->write_func(self, &MARKv, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1833 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1834 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1835 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1836 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1837 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1838 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1839 Py_CLEAR(firstitem); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1840 n = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1841 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1842 /* Fetch and save up to BATCHSIZE items */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1843 while (p) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1844 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1845 PyErr_SetString(PyExc_TypeError, "dict items " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1846 "iterator must return 2-tuples"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1847 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1848 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1849 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1850 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1851 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1852 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1853 Py_CLEAR(p); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1854 n += 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1855 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1856 if (n == BATCHSIZE) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1857 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1858 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1859 p = PyIter_Next(iter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1860 if (p == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1861 if (PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1862 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1863 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1864 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1865 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1866 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1867 if (self->write_func(self, &setitems, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1868 goto BatchFailed; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1869 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1870 } while (n == BATCHSIZE); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1871 return 0; |
|
27825
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1872 |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1873 BatchFailed: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1874 Py_XDECREF(firstitem); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1875 Py_XDECREF(p); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1876 return -1; |
|
27825
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1877 } |
|
011f734258db
Implemented batching for dicts in cPickle. This is after two failed
Tim Peters <tim.peters@gmail.com>
parents:
27822
diff
changeset
|
1878 |
|
54327
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1879 /* This is a variant of batch_dict() above that specializes for dicts, with no |
|
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1880 * support for dict subclasses. Like batch_dict(), we batch up chunks of |
|
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1881 * MARK key value ... key value SETITEMS |
|
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1882 * opcode sequences. Calling code should have arranged to first create an |
|
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1883 * empty dict, or dict-like object, for the SETITEMS to operate on. |
|
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1884 * Returns 0 on success, -1 on error. |
|
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1885 * |
|
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1886 * Note that this currently doesn't work for protocol 0. |
|
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1887 */ |
|
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1888 static int |
|
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1889 batch_dict_exact(Picklerobject *self, PyObject *obj) |
|
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1890 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1891 PyObject *key = NULL, *value = NULL; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1892 int i; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1893 Py_ssize_t dict_size, ppos = 0; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1894 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1895 static char setitem = SETITEM; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1896 static char setitems = SETITEMS; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1897 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1898 assert(obj != NULL); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1899 assert(self->proto > 0); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1900 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1901 dict_size = PyDict_Size(obj); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1902 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1903 /* Special-case len(d) == 1 to save space. */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1904 if (dict_size == 1) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1905 PyDict_Next(obj, &ppos, &key, &value); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1906 if (save(self, key, 0) < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1907 return -1; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1908 if (save(self, value, 0) < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1909 return -1; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1910 if (self->write_func(self, &setitem, 1) < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1911 return -1; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1912 return 0; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1913 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1914 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1915 /* Write in batches of BATCHSIZE. */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1916 do { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1917 i = 0; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1918 if (self->write_func(self, &MARKv, 1) < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1919 return -1; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1920 while (PyDict_Next(obj, &ppos, &key, &value)) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1921 if (save(self, key, 0) < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1922 return -1; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1923 if (save(self, value, 0) < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1924 return -1; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1925 if (++i == BATCHSIZE) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1926 break; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1927 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1928 if (self->write_func(self, &setitems, 1) < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1929 return -1; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1930 if (PyDict_Size(obj) != dict_size) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1931 PyErr_Format( |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1932 PyExc_RuntimeError, |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1933 "dictionary changed size during iteration"); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1934 return -1; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1935 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1936 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1937 } while (i == BATCHSIZE); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1938 return 0; |
|
54327
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1939 } |
|
c74967feb021
Issue 5670: special-case pickling of dicts. This nearly doubles the performance of dict pickling in cPickle.
Collin Winter <collinw@gmail.com>
parents:
53693
diff
changeset
|
1940 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
1941 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
1942 save_dict(Picklerobject *self, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1943 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1944 int res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1945 char s[3]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1946 int len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1947 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1948 if (self->fast && !fast_save_enter(self, args)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1949 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1950 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1951 /* Create an empty dict. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1952 if (self->bin) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1953 s[0] = EMPTY_DICT; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1954 len = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1955 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1956 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1957 s[0] = MARK; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1958 s[1] = DICT; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1959 len = 2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1960 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1961 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1962 if (self->write_func(self, s, len) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1963 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1964 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1965 /* Get dict size, and bow out early if empty. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1966 if ((len = PyDict_Size(args)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1967 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1968 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1969 if (len == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1970 if (put(self, args) >= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1971 res = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1972 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1973 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1974 if (put2(self, args) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1975 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1976 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1977 /* Materialize the dict items. */ |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1978 if (PyDict_CheckExact(args) && self->proto > 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1979 /* We can take certain shortcuts if we know this is a dict and |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1980 not a dict subclass. */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1981 if (Py_EnterRecursiveCall(" while pickling an object") == 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1982 res = batch_dict_exact(self, args); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1983 Py_LeaveRecursiveCall(); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1984 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1985 } else { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1986 PyObject *iter = PyObject_CallMethod(args, "iteritems", "()"); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1987 if (iter == NULL) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1988 goto finally; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1989 if (Py_EnterRecursiveCall(" while pickling an object") == 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1990 res = batch_dict(self, iter); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1991 Py_LeaveRecursiveCall(); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1992 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1993 Py_DECREF(iter); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
1994 } |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1995 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
1996 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1997 if (self->fast && !fast_save_leave(self, args)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1998 res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
1999 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2000 return res; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2001 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2002 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2003 |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
2004 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
2005 save_inst(Picklerobject *self, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2006 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2007 PyObject *class = 0, *module = 0, *name = 0, *state = 0, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2008 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2009 char *module_str, *name_str; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2010 int module_size, name_size, res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2011 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2012 static char inst = INST, obj = OBJ, build = BUILD; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2013 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2014 if (self->fast && !fast_save_enter(self, args)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2015 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2016 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2017 if (self->write_func(self, &MARKv, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2018 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2019 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2020 if (!( class = PyObject_GetAttr(args, __class___str))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2021 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2022 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2023 if (self->bin) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2024 if (save(self, class, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2025 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2026 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2027 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2028 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2029 PyObject *element = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2030 int i, len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2031 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2032 if (!( class_args = |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2033 PyObject_Call(getinitargs_func, empty_tuple, NULL))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2034 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2035 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2036 if ((len = PyObject_Size(class_args)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2037 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2038 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2039 for (i = 0; i < len; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2040 if (!( element = PySequence_GetItem(class_args, i))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2041 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2042 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2043 if (save(self, element, 0) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2044 Py_DECREF(element); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2045 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2046 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2047 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2048 Py_DECREF(element); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2049 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2050 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2051 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2052 if (PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2053 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2054 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2055 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2056 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2057 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2058 if (!self->bin) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2059 if (!( name = ((PyClassObject *)class)->cl_name )) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2060 PyErr_SetString(PicklingError, "class has no name"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2061 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2062 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2063 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2064 if (!( module = whichmodule(class, name))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2065 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2066 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2067 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2068 if ((module_size = PyString_Size(module)) < 0 || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2069 (name_size = PyString_Size(name)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2070 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2071 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2072 module_str = PyString_AS_STRING((PyStringObject *)module); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2073 name_str = PyString_AS_STRING((PyStringObject *)name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2074 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2075 if (self->write_func(self, &inst, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2076 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2077 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2078 if (self->write_func(self, module_str, module_size) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2079 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2080 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2081 if (self->write_func(self, "\n", 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2082 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2083 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2084 if (self->write_func(self, name_str, name_size) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2085 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2086 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2087 if (self->write_func(self, "\n", 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2088 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2089 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2090 else if (self->write_func(self, &obj, 1) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2091 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2092 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2093 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2094 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2095 state = PyObject_Call(getstate_func, empty_tuple, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2096 if (!state) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2097 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2098 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2099 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2100 if (PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2101 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2102 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2103 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2104 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2105 if (!( state = PyObject_GetAttr(args, __dict___str))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2106 if (PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2107 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2108 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2109 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2110 res = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2111 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2112 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2113 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2114 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2115 if (!PyDict_Check(state)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2116 if (put2(self, args) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2117 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2118 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2119 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2120 if (put(self, args) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2121 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2122 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2123 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2124 if (save(self, state, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2125 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2126 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2127 if (self->write_func(self, &build, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2128 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2129 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2130 res = 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2131 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2132 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2133 if (self->fast && !fast_save_leave(self, args)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2134 res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2135 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2136 Py_XDECREF(module); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2137 Py_XDECREF(class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2138 Py_XDECREF(state); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2139 Py_XDECREF(getinitargs_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2140 Py_XDECREF(getstate_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2141 Py_XDECREF(class_args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2142 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2143 return res; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2144 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2145 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2146 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2147 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
2148 save_global(Picklerobject *self, PyObject *args, PyObject *name) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2149 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2150 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2151 char *name_str, *module_str; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2152 int module_size, name_size, res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2153 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2154 static char global = GLOBAL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2155 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2156 if (name) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2157 global_name = name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2158 Py_INCREF(global_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2159 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2160 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2161 if (!( global_name = PyObject_GetAttr(args, __name___str))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2162 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2163 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2164 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2165 if (!( module = whichmodule(args, global_name))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2166 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2167 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2168 if ((module_size = PyString_Size(module)) < 0 || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2169 (name_size = PyString_Size(global_name)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2170 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2171 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2172 module_str = PyString_AS_STRING((PyStringObject *)module); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2173 name_str = PyString_AS_STRING((PyStringObject *)global_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2174 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2175 /* XXX This can be doing a relative import. Clearly it shouldn't, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2176 but I don't know how to stop it. :-( */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2177 mod = PyImport_ImportModule(module_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2178 if (mod == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2179 cPickle_ErrFormat(PicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2180 "Can't pickle %s: import of module %s " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2181 "failed", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2182 "OS", args, module); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2183 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2184 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2185 klass = PyObject_GetAttrString(mod, name_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2186 if (klass == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2187 cPickle_ErrFormat(PicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2188 "Can't pickle %s: attribute lookup %s.%s " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2189 "failed", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2190 "OSS", args, module, global_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2191 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2192 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2193 if (klass != args) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2194 Py_DECREF(klass); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2195 cPickle_ErrFormat(PicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2196 "Can't pickle %s: it's not the same object " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2197 "as %s.%s", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2198 "OSS", args, module, global_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2199 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2200 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2201 Py_DECREF(klass); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2202 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2203 if (self->proto >= 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2204 /* See whether this is in the extension registry, and if |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2205 * so generate an EXT opcode. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2206 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2207 PyObject *py_code; /* extension code as Python object */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2208 long code; /* extension code as C value */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2209 char c_str[5]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2210 int n; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2211 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2212 PyTuple_SET_ITEM(two_tuple, 0, module); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2213 PyTuple_SET_ITEM(two_tuple, 1, global_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2214 py_code = PyDict_GetItem(extension_registry, two_tuple); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2215 if (py_code == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2216 goto gen_global; /* not registered */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2217 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2218 /* Verify py_code has the right type and value. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2219 if (!PyInt_Check(py_code)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2220 cPickle_ErrFormat(PicklingError, "Can't pickle %s: " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2221 "extension code %s isn't an integer", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2222 "OO", args, py_code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2223 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2224 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2225 code = PyInt_AS_LONG(py_code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2226 if (code <= 0 || code > 0x7fffffffL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2227 cPickle_ErrFormat(PicklingError, "Can't pickle %s: " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2228 "extension code %ld is out of range", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2229 "Ol", args, code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2230 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2231 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2232 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2233 /* Generate an EXT opcode. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2234 if (code <= 0xff) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2235 c_str[0] = EXT1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2236 c_str[1] = (char)code; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2237 n = 2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2238 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2239 else if (code <= 0xffff) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2240 c_str[0] = EXT2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2241 c_str[1] = (char)(code & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2242 c_str[2] = (char)((code >> 8) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2243 n = 3; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2244 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2245 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2246 c_str[0] = EXT4; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2247 c_str[1] = (char)(code & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2248 c_str[2] = (char)((code >> 8) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2249 c_str[3] = (char)((code >> 16) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2250 c_str[4] = (char)((code >> 24) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2251 n = 5; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2252 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2253 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2254 if (self->write_func(self, c_str, n) >= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2255 res = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2256 goto finally; /* and don't memoize */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2257 } |
|
27684
96fd004a58b0
cPickle now generates proto 2 EXT[124] when appropriate.
Tim Peters <tim.peters@gmail.com>
parents:
27667
diff
changeset
|
2258 |
|
96fd004a58b0
cPickle now generates proto 2 EXT[124] when appropriate.
Tim Peters <tim.peters@gmail.com>
parents:
27667
diff
changeset
|
2259 gen_global: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2260 if (self->write_func(self, &global, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2261 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2262 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2263 if (self->write_func(self, module_str, module_size) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2264 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2265 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2266 if (self->write_func(self, "\n", 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2267 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2268 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2269 if (self->write_func(self, name_str, name_size) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2270 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2271 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2272 if (self->write_func(self, "\n", 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2273 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2274 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2275 if (put(self, args) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2276 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2277 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2278 res = 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2279 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2280 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2281 Py_XDECREF(module); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2282 Py_XDECREF(global_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2283 Py_XDECREF(mod); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2284 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2285 return res; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2286 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2287 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2288 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
2289 save_pers(Picklerobject *self, PyObject *args, PyObject *f) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2290 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2291 PyObject *pid = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2292 int size, res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2293 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2294 static char persid = PERSID, binpersid = BINPERSID; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2295 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2296 Py_INCREF(args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2297 ARG_TUP(self, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2298 if (self->arg) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2299 pid = PyObject_Call(f, self->arg, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2300 FREE_ARG_TUP(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2301 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2302 if (! pid) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2303 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2304 if (pid != Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2305 if (!self->bin) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2306 if (!PyString_Check(pid)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2307 PyErr_SetString(PicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2308 "persistent id must be string"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2309 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2310 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2311 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2312 if (self->write_func(self, &persid, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2313 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2314 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2315 if ((size = PyString_Size(pid)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2316 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2317 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2318 if (self->write_func(self, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2319 PyString_AS_STRING( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2320 (PyStringObject *)pid), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2321 size) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2322 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2323 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2324 if (self->write_func(self, "\n", 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2325 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2326 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2327 res = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2328 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2329 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2330 else if (save(self, pid, 1) >= 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2331 if (self->write_func(self, &binpersid, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2332 res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2333 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2334 res = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2335 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2336 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2337 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2338 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2339 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2340 res = 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2341 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2342 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2343 Py_XDECREF(pid); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2344 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2345 return res; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2346 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2347 |
|
27899
d0f4f3cd4fe4
cPickle produces NEWOBJ appropriately now. It still doesn't know
Tim Peters <tim.peters@gmail.com>
parents:
27882
diff
changeset
|
2348 /* We're saving ob, and args is the 2-thru-5 tuple returned by the |
|
d0f4f3cd4fe4
cPickle produces NEWOBJ appropriately now. It still doesn't know
Tim Peters <tim.peters@gmail.com>
parents:
27882
diff
changeset
|
2349 * appropriate __reduce__ method for ob. |
|
d0f4f3cd4fe4
cPickle produces NEWOBJ appropriately now. It still doesn't know
Tim Peters <tim.peters@gmail.com>
parents:
27882
diff
changeset
|
2350 */ |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
2351 static int |
|
49612
e8c0a5a646ca
Issue #4176: Pickle would crash the interpreter when a __reduce__ function
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45337
diff
changeset
|
2352 save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2353 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2354 PyObject *callable; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2355 PyObject *argtup; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2356 PyObject *state = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2357 PyObject *listitems = Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2358 PyObject *dictitems = Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2359 Py_ssize_t size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2360 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2361 int use_newobj = self->proto >= 2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2362 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2363 static char reduce = REDUCE; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2364 static char build = BUILD; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2365 static char newobj = NEWOBJ; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2366 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2367 size = PyTuple_Size(args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2368 if (size < 2 || size > 5) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2369 cPickle_ErrFormat(PicklingError, "tuple returned by " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2370 "%s must contain 2 through 5 elements", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2371 "O", fn); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2372 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2373 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2374 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2375 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2376 &callable, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2377 &argtup, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2378 &state, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2379 &listitems, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2380 &dictitems)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2381 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2382 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2383 if (!PyTuple_Check(argtup)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2384 cPickle_ErrFormat(PicklingError, "Second element of " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2385 "tuple returned by %s must be a tuple", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2386 "O", fn); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2387 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2388 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2389 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2390 if (state == Py_None) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2391 state = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2392 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2393 if (listitems == Py_None) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2394 listitems = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2395 else if (!PyIter_Check(listitems)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2396 cPickle_ErrFormat(PicklingError, "Fourth element of " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2397 "tuple returned by %s must be an iterator, not %s", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2398 "Os", fn, Py_TYPE(listitems)->tp_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2399 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2400 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2401 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2402 if (dictitems == Py_None) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2403 dictitems = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2404 else if (!PyIter_Check(dictitems)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2405 cPickle_ErrFormat(PicklingError, "Fifth element of " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2406 "tuple returned by %s must be an iterator, not %s", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2407 "Os", fn, Py_TYPE(dictitems)->tp_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2408 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2409 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2410 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2411 /* Protocol 2 special case: if callable's name is __newobj__, use |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2412 * NEWOBJ. This consumes a lot of code. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2413 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2414 if (use_newobj) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2415 PyObject *temp = PyObject_GetAttr(callable, __name___str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2416 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2417 if (temp == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2418 if (PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2419 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2420 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2421 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2422 use_newobj = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2423 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2424 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2425 use_newobj = PyString_Check(temp) && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2426 strcmp(PyString_AS_STRING(temp), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2427 "__newobj__") == 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2428 Py_DECREF(temp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2429 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2430 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2431 if (use_newobj) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2432 PyObject *cls; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2433 PyObject *newargtup; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2434 int n, i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2435 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2436 /* Sanity checks. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2437 n = PyTuple_Size(argtup); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2438 if (n < 1) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2439 PyErr_SetString(PicklingError, "__newobj__ arglist " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2440 "is empty"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2441 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2442 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2443 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2444 cls = PyTuple_GET_ITEM(argtup, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2445 if (! PyObject_HasAttrString(cls, "__new__")) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2446 PyErr_SetString(PicklingError, "args[0] from " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2447 "__newobj__ args has no __new__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2448 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2449 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2450 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2451 /* XXX How could ob be NULL? */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2452 if (ob != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2453 PyObject *ob_dot_class; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2454 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2455 ob_dot_class = PyObject_GetAttr(ob, __class___str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2456 if (ob_dot_class == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2457 if (PyErr_ExceptionMatches( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2458 PyExc_AttributeError)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2459 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2460 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2461 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2462 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2463 i = ob_dot_class != cls; /* true iff a problem */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2464 Py_XDECREF(ob_dot_class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2465 if (i) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2466 PyErr_SetString(PicklingError, "args[0] from " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2467 "__newobj__ args has the wrong class"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2468 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2469 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2470 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2471 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2472 /* Save the class and its __new__ arguments. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2473 if (save(self, cls, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2474 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2475 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2476 newargtup = PyTuple_New(n-1); /* argtup[1:] */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2477 if (newargtup == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2478 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2479 for (i = 1; i < n; ++i) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2480 PyObject *temp = PyTuple_GET_ITEM(argtup, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2481 Py_INCREF(temp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2482 PyTuple_SET_ITEM(newargtup, i-1, temp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2483 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2484 i = save(self, newargtup, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2485 Py_DECREF(newargtup); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2486 if (i < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2487 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2488 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2489 /* Add NEWOBJ opcode. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2490 if (self->write_func(self, &newobj, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2491 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2492 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2493 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2494 /* Not using NEWOBJ. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2495 if (save(self, callable, 0) < 0 || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2496 save(self, argtup, 0) < 0 || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2497 self->write_func(self, &reduce, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2498 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2499 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2500 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2501 /* Memoize. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2502 /* XXX How can ob be NULL? */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2503 if (ob != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2504 if (state && !PyDict_Check(state)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2505 if (put2(self, ob) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2506 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2507 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2508 else if (put(self, ob) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2509 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2510 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2511 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2512 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2513 if (listitems && batch_list(self, listitems) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2514 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2515 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2516 if (dictitems && batch_dict(self, dictitems) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2517 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2518 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2519 if (state) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2520 if (save(self, state, 0) < 0 || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2521 self->write_func(self, &build, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2522 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2523 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2524 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2525 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2526 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2527 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2528 static int |
|
27615
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
2529 save(Picklerobject *self, PyObject *args, int pers_save) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2530 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2531 PyTypeObject *type; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2532 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2533 int res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2534 int tmp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2535 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2536 if (Py_EnterRecursiveCall(" while pickling an object")) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2537 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2538 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2539 if (!pers_save && self->pers_func) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2540 if ((tmp = save_pers(self, args, self->pers_func)) != 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2541 res = tmp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2542 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2543 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2544 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2545 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2546 if (args == Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2547 res = save_none(self, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2548 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2549 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2550 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2551 type = Py_TYPE(args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2552 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2553 switch (type->tp_name[0]) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2554 case 'b': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2555 if (args == Py_False || args == Py_True) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2556 res = save_bool(self, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2557 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2558 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2559 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2560 case 'i': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2561 if (type == &PyInt_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2562 res = save_int(self, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2563 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2564 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2565 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2566 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2567 case 'l': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2568 if (type == &PyLong_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2569 res = save_long(self, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2570 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2571 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2572 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2573 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2574 case 'f': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2575 if (type == &PyFloat_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2576 res = save_float(self, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2577 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2578 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2579 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2580 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2581 case 't': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2582 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2583 res = save_tuple(self, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2584 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2585 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2586 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2587 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2588 case 's': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2589 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2590 res = save_string(self, args, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2591 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2592 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2593 break; |
|
11982
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
2594 |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
2595 #ifdef Py_USING_UNICODE |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2596 case 'u': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2597 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2598 res = save_unicode(self, args, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2599 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2600 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2601 break; |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
2602 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2603 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2604 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2605 if (Py_REFCNT(args) > 1) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2606 if (!( py_ob_id = PyLong_FromVoidPtr(args))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2607 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2608 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2609 if (PyDict_GetItem(self->memo, py_ob_id)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2610 if (get(self, py_ob_id) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2611 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2612 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2613 res = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2614 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2615 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2616 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2617 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2618 switch (type->tp_name[0]) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2619 case 's': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2620 if (type == &PyString_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2621 res = save_string(self, args, 1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2622 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2623 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2624 break; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2625 |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
2626 #ifdef Py_USING_UNICODE |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2627 case 'u': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2628 if (type == &PyUnicode_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2629 res = save_unicode(self, args, 1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2630 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2631 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2632 break; |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
2633 #endif |
|
11982
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
2634 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2635 case 't': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2636 if (type == &PyTuple_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2637 res = save_tuple(self, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2638 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2639 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2640 if (type == &PyType_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2641 res = save_global(self, args, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2642 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2643 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2644 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2645 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2646 case 'l': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2647 if (type == &PyList_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2648 res = save_list(self, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2649 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2650 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2651 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2652 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2653 case 'd': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2654 if (type == &PyDict_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2655 res = save_dict(self, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2656 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2657 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2658 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2659 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2660 case 'i': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2661 if (type == &PyInstance_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2662 res = save_inst(self, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2663 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2664 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2665 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2666 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2667 case 'c': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2668 if (type == &PyClass_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2669 res = save_global(self, args, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2670 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2671 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2672 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2673 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2674 case 'f': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2675 if (type == &PyFunction_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2676 res = save_global(self, args, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2677 if (res && PyErr_ExceptionMatches(PickleError)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2678 /* fall back to reduce */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2679 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2680 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2681 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2682 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2683 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2684 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2685 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2686 case 'b': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2687 if (type == &PyCFunction_Type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2688 res = save_global(self, args, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2689 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2690 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2691 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2692 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2693 if (!pers_save && self->inst_pers_func) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2694 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2695 res = tmp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2696 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2697 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2698 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2699 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2700 /* Get a reduction callable, and call it. This may come from |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2701 * copy_reg.dispatch_table, the object's __reduce_ex__ method, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2702 * or the object's __reduce__ method. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2703 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2704 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2705 if (__reduce__ != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2706 Py_INCREF(__reduce__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2707 Py_INCREF(args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2708 ARG_TUP(self, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2709 if (self->arg) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2710 t = PyObject_Call(__reduce__, self->arg, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2711 FREE_ARG_TUP(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2712 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2713 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2714 else { |
|
72641
64053bd79590
Issue #7689: Allow pickling of dynamically created classes when their
Antoine Pitrou <solipsis@pitrou.net>
parents:
68256
diff
changeset
|
2715 if (PyType_IsSubtype(type, &PyType_Type)) { |
|
64053bd79590
Issue #7689: Allow pickling of dynamically created classes when their
Antoine Pitrou <solipsis@pitrou.net>
parents:
68256
diff
changeset
|
2716 res = save_global(self, args, NULL); |
|
64053bd79590
Issue #7689: Allow pickling of dynamically created classes when their
Antoine Pitrou <solipsis@pitrou.net>
parents:
68256
diff
changeset
|
2717 goto finally; |
|
64053bd79590
Issue #7689: Allow pickling of dynamically created classes when their
Antoine Pitrou <solipsis@pitrou.net>
parents:
68256
diff
changeset
|
2718 } |
|
64053bd79590
Issue #7689: Allow pickling of dynamically created classes when their
Antoine Pitrou <solipsis@pitrou.net>
parents:
68256
diff
changeset
|
2719 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2720 /* Check for a __reduce_ex__ method. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2721 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2722 if (__reduce__ != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2723 t = PyInt_FromLong(self->proto); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2724 if (t != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2725 ARG_TUP(self, t); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2726 t = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2727 if (self->arg) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2728 t = PyObject_Call(__reduce__, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2729 self->arg, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2730 FREE_ARG_TUP(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2731 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2732 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2733 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2734 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2735 if (PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2736 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2737 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2738 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2739 /* Check for a __reduce__ method. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2740 __reduce__ = PyObject_GetAttr(args, __reduce___str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2741 if (__reduce__ != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2742 t = PyObject_Call(__reduce__, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2743 empty_tuple, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2744 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2745 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2746 PyErr_SetObject(UnpickleableError, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2747 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2748 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2749 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2750 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2751 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2752 if (t == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2753 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2754 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2755 if (PyString_Check(t)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2756 res = save_global(self, args, t); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2757 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2758 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2759 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2760 if (!PyTuple_Check(t)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2761 cPickle_ErrFormat(PicklingError, "Value returned by " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2762 "%s must be string or tuple", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2763 "O", __reduce__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2764 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2765 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2766 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2767 res = save_reduce(self, t, __reduce__, args); |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2768 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2769 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2770 Py_LeaveRecursiveCall(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2771 Py_XDECREF(py_ob_id); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2772 Py_XDECREF(__reduce__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2773 Py_XDECREF(t); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2774 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2775 return res; |
| 4907 | 2776 } |
| 2777 | |
| 2778 | |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2779 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
2780 dump(Picklerobject *self, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2781 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2782 static char stop = STOP; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2783 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2784 if (self->proto >= 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2785 char bytes[2]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2786 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2787 bytes[0] = PROTO; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2788 assert(self->proto >= 0 && self->proto < 256); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2789 bytes[1] = (char)self->proto; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2790 if (self->write_func(self, bytes, 2) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2791 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2792 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2793 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2794 if (save(self, args, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2795 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2796 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2797 if (self->write_func(self, &stop, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2798 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2799 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2800 if (self->write_func(self, NULL, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2801 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2802 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2803 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2804 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2805 |
| 4907 | 2806 static PyObject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
2807 Pickle_clear_memo(Picklerobject *self, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2808 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2809 if (self->memo) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2810 PyDict_Clear(self->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2811 Py_INCREF(Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2812 return Py_None; |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
2813 } |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
2814 |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
2815 static PyObject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
2816 Pickle_getvalue(Picklerobject *self, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2817 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2818 int l, i, rsize, ssize, clear=1, lm; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2819 long ik; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2820 PyObject *k, *r; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2821 char *s, *p, *have_get; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2822 Pdata *data; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2823 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2824 /* Can be called by Python code or C code */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2825 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2826 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2827 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2828 /* Check to make sure we are based on a list */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2829 if (! Pdata_Check(self->file)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2830 PyErr_SetString(PicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2831 "Attempt to getvalue() a non-list-based pickler"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2832 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2833 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2834 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2835 /* flush write buffer */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2836 if (write_other(self, NULL, 0) < 0) return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2837 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2838 data=(Pdata*)self->file; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2839 l=data->length; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2840 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2841 /* set up an array to hold get/put status */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2842 lm = PyDict_Size(self->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2843 if (lm < 0) return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2844 lm++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2845 have_get = malloc(lm); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2846 if (have_get == NULL) return PyErr_NoMemory(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2847 memset(have_get, 0, lm); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2848 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2849 /* Scan for gets. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2850 for (rsize = 0, i = l; --i >= 0; ) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2851 k = data->data[i]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2852 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2853 if (PyString_Check(k)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2854 rsize += PyString_GET_SIZE(k); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2855 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2856 else if (PyInt_Check(k)) { /* put */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2857 ik = PyInt_AS_LONG((PyIntObject*)k); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2858 if (ik >= lm || ik == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2859 PyErr_SetString(PicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2860 "Invalid get data"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2861 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2862 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2863 if (have_get[ik]) /* with matching get */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2864 rsize += ik < 256 ? 2 : 5; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2865 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2866 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2867 else if (! (PyTuple_Check(k) && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2868 PyTuple_GET_SIZE(k) == 2 && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2869 PyInt_Check((k = PyTuple_GET_ITEM(k, 0)))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2870 ) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2871 PyErr_SetString(PicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2872 "Unexpected data in internal list"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2873 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2874 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2875 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2876 else { /* put */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2877 ik = PyInt_AS_LONG((PyIntObject *)k); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2878 if (ik >= lm || ik == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2879 PyErr_SetString(PicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2880 "Invalid get data"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2881 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2882 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2883 have_get[ik] = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2884 rsize += ik < 256 ? 2 : 5; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2885 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2886 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2887 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2888 /* Now generate the result */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2889 r = PyString_FromStringAndSize(NULL, rsize); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2890 if (r == NULL) goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2891 s = PyString_AS_STRING((PyStringObject *)r); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2892 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2893 for (i = 0; i < l; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2894 k = data->data[i]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2895 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2896 if (PyString_Check(k)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2897 ssize = PyString_GET_SIZE(k); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2898 if (ssize) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2899 p=PyString_AS_STRING((PyStringObject *)k); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2900 while (--ssize >= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2901 *s++ = *p++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2902 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2903 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2904 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2905 else if (PyTuple_Check(k)) { /* get */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2906 ik = PyInt_AS_LONG((PyIntObject *) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2907 PyTuple_GET_ITEM(k, 0)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2908 if (ik < 256) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2909 *s++ = BINGET; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2910 *s++ = (int)(ik & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2911 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2912 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2913 *s++ = LONG_BINGET; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2914 *s++ = (int)(ik & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2915 *s++ = (int)((ik >> 8) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2916 *s++ = (int)((ik >> 16) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2917 *s++ = (int)((ik >> 24) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2918 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2919 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2920 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2921 else { /* put */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2922 ik = PyInt_AS_LONG((PyIntObject*)k); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2923 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2924 if (have_get[ik]) { /* with matching get */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2925 if (ik < 256) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2926 *s++ = BINPUT; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2927 *s++ = (int)(ik & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2928 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2929 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2930 *s++ = LONG_BINPUT; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2931 *s++ = (int)(ik & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2932 *s++ = (int)((ik >> 8) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2933 *s++ = (int)((ik >> 16) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2934 *s++ = (int)((ik >> 24) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2935 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2936 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2937 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2938 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2939 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2940 if (clear) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2941 PyDict_Clear(self->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2942 Pdata_clear(data, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2943 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2944 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2945 free(have_get); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2946 return r; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2947 err: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2948 free(have_get); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2949 return NULL; |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
2950 } |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
2951 |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
2952 static PyObject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
2953 Pickler_dump(Picklerobject *self, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2954 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2955 PyObject *ob; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2956 int get=0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2957 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2958 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2959 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2960 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2961 if (dump(self, ob) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2962 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2963 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2964 if (get) return Pickle_getvalue(self, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2965 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2966 /* XXX Why does dump() return self? */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2967 Py_INCREF(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2968 return (PyObject*)self; |
| 4907 | 2969 } |
| 2970 | |
| 2971 | |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
2972 static struct PyMethodDef Pickler_methods[] = |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2973 { |
|
22706
14ebd7610902
Use symbolic METH_VARARGS/METH_OLDARGS instead of 1/0 for ml_flags
Neal Norwitz <nnorwitz@gmail.com>
parents:
22464
diff
changeset
|
2974 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS, |
|
24796
de71e6fe64b0
Allow more docstrings to be removed during compilation in some modules
Neal Norwitz <nnorwitz@gmail.com>
parents:
24532
diff
changeset
|
2975 PyDoc_STR("dump(object) -- " |
|
de71e6fe64b0
Allow more docstrings to be removed during compilation in some modules
Neal Norwitz <nnorwitz@gmail.com>
parents:
24532
diff
changeset
|
2976 "Write an object in pickle format to the object's pickle stream")}, |
|
23332
c1d1ae15de92
Pickler_clear_memo(): convert to METH_NOARGS.
Fred Drake <fdrake@acm.org>
parents:
23295
diff
changeset
|
2977 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS, |
|
24796
de71e6fe64b0
Allow more docstrings to be removed during compilation in some modules
Neal Norwitz <nnorwitz@gmail.com>
parents:
24532
diff
changeset
|
2978 PyDoc_STR("clear_memo() -- Clear the picklers memo")}, |
|
22706
14ebd7610902
Use symbolic METH_VARARGS/METH_OLDARGS instead of 1/0 for ml_flags
Neal Norwitz <nnorwitz@gmail.com>
parents:
22464
diff
changeset
|
2979 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS, |
|
24796
de71e6fe64b0
Allow more docstrings to be removed during compilation in some modules
Neal Norwitz <nnorwitz@gmail.com>
parents:
24532
diff
changeset
|
2980 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")}, |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2981 {NULL, NULL} /* sentinel */ |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2982 }; |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2983 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2984 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
2985 static Picklerobject * |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
2986 newPicklerobject(PyObject *file, int proto) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
2987 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2988 Picklerobject *self; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2989 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2990 if (proto < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2991 proto = HIGHEST_PROTOCOL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2992 if (proto > HIGHEST_PROTOCOL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2993 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2994 "the highest available protocol is %d", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2995 proto, HIGHEST_PROTOCOL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2996 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2997 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2998 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
2999 self = PyObject_GC_New(Picklerobject, &Picklertype); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3000 if (self == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3001 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3002 self->proto = proto; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3003 self->bin = proto > 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3004 self->fp = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3005 self->write = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3006 self->memo = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3007 self->arg = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3008 self->pers_func = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3009 self->inst_pers_func = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3010 self->write_buf = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3011 self->fast = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3012 self->fast_container = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3013 self->fast_memo = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3014 self->buf_size = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3015 self->dispatch_table = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3016 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3017 self->file = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3018 if (file) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3019 Py_INCREF(file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3020 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3021 file = Pdata_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3022 if (file == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3023 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3024 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3025 self->file = file; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3026 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3027 if (!( self->memo = PyDict_New())) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3028 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3029 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3030 if (PyFile_Check(file)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3031 self->fp = PyFile_AsFile(file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3032 if (self->fp == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3033 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3034 "I/O operation on closed file"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3035 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3036 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3037 self->write_func = write_file; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3038 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3039 else if (PycStringIO_OutputCheck(file)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3040 self->write_func = write_cStringIO; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3041 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3042 else if (file == Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3043 self->write_func = write_none; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3044 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3045 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3046 self->write_func = write_other; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3047 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3048 if (! Pdata_Check(file)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3049 self->write = PyObject_GetAttr(file, write_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3050 if (!self->write) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3051 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3052 PyErr_SetString(PyExc_TypeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3053 "argument must have 'write' " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3054 "attribute"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3055 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3056 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3057 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3058 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3059 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3060 if (self->write_buf == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3061 PyErr_NoMemory(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3062 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3063 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3064 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3065 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3066 if (PyEval_GetRestricted()) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3067 /* Restricted execution, get private tables */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3068 PyObject *m = PyImport_ImportModule("copy_reg"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3069 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3070 if (m == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3071 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3072 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3073 Py_DECREF(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3074 if (self->dispatch_table == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3075 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3076 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3077 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3078 self->dispatch_table = dispatch_table; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3079 Py_INCREF(dispatch_table); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3080 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3081 PyObject_GC_Track(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3082 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3083 return self; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3084 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3085 err: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3086 Py_DECREF(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3087 return NULL; |
| 4907 | 3088 } |
| 3089 | |
| 3090 | |
| 3091 static PyObject * | |
|
32829
cbd4ae74890d
Patch #995766: Keyword argument support in cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
32305
diff
changeset
|
3092 get_Pickler(PyObject *self, PyObject *args, PyObject *kwds) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3093 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3094 static char *kwlist[] = {"file", "protocol", NULL}; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3095 PyObject *file = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3096 int proto = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3097 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3098 /* XXX |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3099 * The documented signature is Pickler(file, protocol=0), but this |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3100 * accepts Pickler() and Pickler(integer) too. The meaning then |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3101 * is clear as mud, undocumented, and not supported by pickle.py. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3102 * I'm told Zope uses this, but I haven't traced into this code |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3103 * far enough to figure out what it means. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3104 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3105 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3106 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3107 proto = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3108 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3109 kwlist, &file, &proto)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3110 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3111 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3112 return (PyObject *)newPicklerobject(file, proto); |
| 4907 | 3113 } |
| 3114 | |
| 3115 | |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3116 static void |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3117 Pickler_dealloc(Picklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3118 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3119 PyObject_GC_UnTrack(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3120 Py_XDECREF(self->write); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3121 Py_XDECREF(self->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3122 Py_XDECREF(self->fast_memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3123 Py_XDECREF(self->arg); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3124 Py_XDECREF(self->file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3125 Py_XDECREF(self->pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3126 Py_XDECREF(self->inst_pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3127 Py_XDECREF(self->dispatch_table); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3128 PyMem_Free(self->write_buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3129 Py_TYPE(self)->tp_free((PyObject *)self); |
|
28567
bc8923fdd83b
Make Picklers collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28335
diff
changeset
|
3130 } |
|
bc8923fdd83b
Make Picklers collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28335
diff
changeset
|
3131 |
|
bc8923fdd83b
Make Picklers collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28335
diff
changeset
|
3132 static int |
|
bc8923fdd83b
Make Picklers collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28335
diff
changeset
|
3133 Pickler_traverse(Picklerobject *self, visitproc visit, void *arg) |
|
bc8923fdd83b
Make Picklers collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28335
diff
changeset
|
3134 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3135 Py_VISIT(self->write); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3136 Py_VISIT(self->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3137 Py_VISIT(self->fast_memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3138 Py_VISIT(self->arg); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3139 Py_VISIT(self->file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3140 Py_VISIT(self->pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3141 Py_VISIT(self->inst_pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3142 Py_VISIT(self->dispatch_table); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3143 return 0; |
|
28567
bc8923fdd83b
Make Picklers collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28335
diff
changeset
|
3144 } |
|
bc8923fdd83b
Make Picklers collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28335
diff
changeset
|
3145 |
|
bc8923fdd83b
Make Picklers collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28335
diff
changeset
|
3146 static int |
|
bc8923fdd83b
Make Picklers collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28335
diff
changeset
|
3147 Pickler_clear(Picklerobject *self) |
|
bc8923fdd83b
Make Picklers collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28335
diff
changeset
|
3148 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3149 Py_CLEAR(self->write); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3150 Py_CLEAR(self->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3151 Py_CLEAR(self->fast_memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3152 Py_CLEAR(self->arg); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3153 Py_CLEAR(self->file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3154 Py_CLEAR(self->pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3155 Py_CLEAR(self->inst_pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3156 Py_CLEAR(self->dispatch_table); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3157 return 0; |
| 4907 | 3158 } |
| 3159 | |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3160 static PyObject * |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3161 Pickler_get_pers_func(Picklerobject *p) |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3162 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3163 if (p->pers_func == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3164 PyErr_SetString(PyExc_AttributeError, "persistent_id"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3165 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3166 Py_INCREF(p->pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3167 return p->pers_func; |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3168 } |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3169 |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3170 static int |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3171 Pickler_set_pers_func(Picklerobject *p, PyObject *v) |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3172 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3173 if (v == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3174 PyErr_SetString(PyExc_TypeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3175 "attribute deletion is not supported"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3176 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3177 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3178 Py_XDECREF(p->pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3179 Py_INCREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3180 p->pers_func = v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3181 return 0; |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3182 } |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3183 |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3184 static int |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3185 Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v) |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3186 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3187 if (v == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3188 PyErr_SetString(PyExc_TypeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3189 "attribute deletion is not supported"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3190 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3191 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3192 Py_XDECREF(p->inst_pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3193 Py_INCREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3194 p->inst_pers_func = v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3195 return 0; |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3196 } |
| 4907 | 3197 |
| 3198 static PyObject * | |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3199 Pickler_get_memo(Picklerobject *p) |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3200 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3201 if (p->memo == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3202 PyErr_SetString(PyExc_AttributeError, "memo"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3203 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3204 Py_INCREF(p->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3205 return p->memo; |
| 4907 | 3206 } |
| 3207 | |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3208 static int |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3209 Pickler_set_memo(Picklerobject *p, PyObject *v) |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3210 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3211 if (v == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3212 PyErr_SetString(PyExc_TypeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3213 "attribute deletion is not supported"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3214 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3215 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3216 if (!PyDict_Check(v)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3217 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3218 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3219 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3220 Py_XDECREF(p->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3221 Py_INCREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3222 p->memo = v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3223 return 0; |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3224 } |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3225 |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3226 static PyObject * |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3227 Pickler_get_error(Picklerobject *p) |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3228 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3229 /* why is this an attribute on the Pickler? */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3230 Py_INCREF(PicklingError); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3231 return PicklingError; |
| 4907 | 3232 } |
| 3233 | |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3234 static PyMemberDef Pickler_members[] = { |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3235 {"binary", T_INT, offsetof(Picklerobject, bin)}, |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3236 {"fast", T_INT, offsetof(Picklerobject, fast)}, |
|
20458
a96235b2ca62
Must terminate the Pickler_members[] and Pickler_getsets with NULL.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20443
diff
changeset
|
3237 {NULL} |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3238 }; |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3239 |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3240 static PyGetSetDef Pickler_getsets[] = { |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3241 {"persistent_id", (getter)Pickler_get_pers_func, |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3242 (setter)Pickler_set_pers_func}, |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3243 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func}, |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3244 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo}, |
|
20458
a96235b2ca62
Must terminate the Pickler_members[] and Pickler_getsets with NULL.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20443
diff
changeset
|
3245 {"PicklingError", (getter)Pickler_get_error, NULL}, |
|
a96235b2ca62
Must terminate the Pickler_members[] and Pickler_getsets with NULL.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20443
diff
changeset
|
3246 {NULL} |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3247 }; |
| 4907 | 3248 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23332
diff
changeset
|
3249 PyDoc_STRVAR(Picklertype__doc__, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23332
diff
changeset
|
3250 "Objects that know how to pickle objects\n"); |
| 4907 | 3251 |
| 6774 | 3252 static PyTypeObject Picklertype = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41525
diff
changeset
|
3253 PyVarObject_HEAD_INIT(NULL, 0) |
|
21313
91dd223829c6
Patch supplied by Burton Radons for his own SF bug #487390: Modifying
Guido van Rossum <guido@python.org>
parents:
21093
diff
changeset
|
3254 "cPickle.Pickler", /*tp_name*/ |
|
20385
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3255 sizeof(Picklerobject), /*tp_basicsize*/ |
|
be58eee69a94
Progress on SF bug #466175 and general cleanup.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19543
diff
changeset
|
3256 0, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3257 (destructor)Pickler_dealloc, /* tp_dealloc */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3258 0, /* tp_print */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3259 0, /* tp_getattr */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3260 0, /* tp_setattr */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3261 0, /* tp_compare */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3262 0, /* tp_repr */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3263 0, /* tp_as_number */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3264 0, /* tp_as_sequence */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3265 0, /* tp_as_mapping */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3266 0, /* tp_hash */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3267 0, /* tp_call */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3268 0, /* tp_str */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3269 PyObject_GenericGetAttr, /* tp_getattro */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3270 PyObject_GenericSetAttr, /* tp_setattro */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3271 0, /* tp_as_buffer */ |
|
28567
bc8923fdd83b
Make Picklers collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28335
diff
changeset
|
3272 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3273 Picklertype__doc__, /* tp_doc */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3274 (traverseproc)Pickler_traverse, /* tp_traverse */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3275 (inquiry)Pickler_clear, /* tp_clear */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3276 0, /* tp_richcompare */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3277 0, /* tp_weaklistoffset */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3278 0, /* tp_iter */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3279 0, /* tp_iternext */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3280 Pickler_methods, /* tp_methods */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3281 Pickler_members, /* tp_members */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3282 Pickler_getsets, /* tp_getset */ |
| 6774 | 3283 }; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3284 |
| 4907 | 3285 static PyObject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3286 find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3287 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3288 PyObject *global = 0, *module; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3289 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3290 if (fc) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3291 if (fc==Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3292 PyErr_SetString(UnpicklingError, "Global and instance " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3293 "pickles are not supported."); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3294 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3295 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3296 return PyObject_CallFunctionObjArgs(fc, py_module_name, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3297 py_global_name, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3298 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3299 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3300 module = PySys_GetObject("modules"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3301 if (module == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3302 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3303 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3304 module = PyDict_GetItem(module, py_module_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3305 if (module == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3306 module = PyImport_Import(py_module_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3307 if (!module) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3308 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3309 global = PyObject_GetAttr(module, py_global_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3310 Py_DECREF(module); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3311 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3312 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3313 global = PyObject_GetAttr(module, py_global_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3314 return global; |
| 4907 | 3315 } |
| 3316 | |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3317 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3318 marker(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3319 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3320 if (self->num_marks < 1) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3321 PyErr_SetString(UnpicklingError, "could not find MARK"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3322 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3323 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3324 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3325 return self->marks[--self->num_marks]; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3326 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3327 |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
3328 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3329 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3330 load_none(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3331 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3332 PDATA_APPEND(self->stack, Py_None, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3333 return 0; |
| 4907 | 3334 } |
| 3335 | |
|
10097
f5f1b5e9814a
Jim Fulton: this fixes seg faults with bad pickles like "c".
Guido van Rossum <guido@python.org>
parents:
9948
diff
changeset
|
3336 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3337 bad_readline(void) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3338 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3339 PyErr_SetString(UnpicklingError, "pickle data was truncated"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3340 return -1; |
|
10097
f5f1b5e9814a
Jim Fulton: this fixes seg faults with bad pickles like "c".
Guido van Rossum <guido@python.org>
parents:
9948
diff
changeset
|
3341 } |
| 4907 | 3342 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3343 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3344 load_int(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3345 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3346 PyObject *py_int = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3347 char *endptr, *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3348 int len, res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3349 long l; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3350 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3351 if ((len = self->readline_func(self, &s)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3352 if (len < 2) return bad_readline(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3353 if (!( s=pystrndup(s,len))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3354 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3355 errno = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3356 l = strtol(s, &endptr, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3357 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3358 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3359 /* Hm, maybe we've got something long. Let's try reading |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3360 it as a Python long object. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3361 errno = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3362 py_int = PyLong_FromString(s, NULL, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3363 if (py_int == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3364 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3365 "could not convert string to int"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3366 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3367 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3368 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3369 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3370 if (len == 3 && (l == 0 || l == 1)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3371 if (!( py_int = PyBool_FromLong(l))) goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3372 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3373 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3374 if (!( py_int = PyInt_FromLong(l))) goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3375 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3376 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3377 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3378 free(s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3379 PDATA_PUSH(self->stack, py_int, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3380 return 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3381 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3382 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3383 free(s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3384 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3385 return res; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3386 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3387 |
|
27599
d158d10ef4ae
Implemented proto 2 NEWTRUE and NEWFALSE in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27596
diff
changeset
|
3388 static int |
|
d158d10ef4ae
Implemented proto 2 NEWTRUE and NEWFALSE in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27596
diff
changeset
|
3389 load_bool(Unpicklerobject *self, PyObject *boolean) |
|
d158d10ef4ae
Implemented proto 2 NEWTRUE and NEWFALSE in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27596
diff
changeset
|
3390 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3391 assert(boolean == Py_True || boolean == Py_False); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3392 PDATA_APPEND(self->stack, boolean, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3393 return 0; |
|
27599
d158d10ef4ae
Implemented proto 2 NEWTRUE and NEWFALSE in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27596
diff
changeset
|
3394 } |
|
d158d10ef4ae
Implemented proto 2 NEWTRUE and NEWFALSE in cPickle.
Tim Peters <tim.peters@gmail.com>
parents:
27596
diff
changeset
|
3395 |
|
27585
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3396 /* s contains x bytes of a little-endian integer. Return its value as a |
|
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3397 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian |
|
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3398 * int, but when x is 4 it's a signed one. This is an historical source |
|
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3399 * of x-platform bugs. |
|
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3400 */ |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
3401 static long |
|
27585
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3402 calc_binint(char *s, int x) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3403 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3404 unsigned char c; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3405 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3406 long l; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3407 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3408 for (i = 0, l = 0L; i < x; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3409 c = (unsigned char)s[i]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3410 l |= (long)c << (i * 8); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3411 } |
|
17361
ca565e3d3cc5
Critical fix: if cPickle on a sizeof(long)==8 box is used to read a
Tim Peters <tim.peters@gmail.com>
parents:
17152
diff
changeset
|
3412 #if SIZEOF_LONG > 4 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3413 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3414 * is signed, so on a box with longs bigger than 4 bytes we need |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3415 * to extend a BININT's sign bit to the full width. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3416 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3417 if (x == 4 && l & (1L << 31)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3418 l |= (~0L) << 32; |
|
17361
ca565e3d3cc5
Critical fix: if cPickle on a sizeof(long)==8 box is used to read a
Tim Peters <tim.peters@gmail.com>
parents:
17152
diff
changeset
|
3419 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3420 return l; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3421 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3422 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3423 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3424 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3425 load_binintx(Unpicklerobject *self, char *s, int x) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3426 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3427 PyObject *py_int = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3428 long l; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3429 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3430 l = calc_binint(s, x); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3431 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3432 if (!( py_int = PyInt_FromLong(l))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3433 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3434 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3435 PDATA_PUSH(self->stack, py_int, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3436 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3437 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3438 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3439 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3440 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3441 load_binint(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3442 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3443 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3444 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3445 if (self->read_func(self, &s, 4) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3446 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3447 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3448 return load_binintx(self, s, 4); |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3449 } |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
3450 |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3451 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3452 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3453 load_binint1(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3454 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3455 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3456 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3457 if (self->read_func(self, &s, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3458 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3459 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3460 return load_binintx(self, s, 1); |
| 4907 | 3461 } |
| 3462 | |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
3463 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3464 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3465 load_binint2(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3466 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3467 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3468 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3469 if (self->read_func(self, &s, 2) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3470 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3471 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3472 return load_binintx(self, s, 2); |
| 4907 | 3473 } |
| 3474 | |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3475 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3476 load_long(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3477 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3478 PyObject *l = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3479 char *end, *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3480 int len, res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3481 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3482 if ((len = self->readline_func(self, &s)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3483 if (len < 2) return bad_readline(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3484 if (!( s=pystrndup(s,len))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3485 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3486 if (!( l = PyLong_FromString(s, &end, 0))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3487 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3488 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3489 free(s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3490 PDATA_PUSH(self->stack, l, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3491 return 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3492 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3493 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3494 free(s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3495 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3496 return res; |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
3497 } |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3498 |
|
27585
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3499 /* 'size' bytes contain the # of bytes of little-endian 256's-complement |
|
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3500 * data following. |
|
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3501 */ |
|
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3502 static int |
|
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3503 load_counted_long(Unpicklerobject *self, int size) |
|
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3504 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3505 Py_ssize_t i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3506 char *nbytes; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3507 unsigned char *pdata; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3508 PyObject *along; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3509 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3510 assert(size == 1 || size == 4); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3511 i = self->read_func(self, &nbytes, size); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3512 if (i < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3513 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3514 size = calc_binint(nbytes, size); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3515 if (size < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3516 /* Corrupt or hostile pickle -- we never write one like |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3517 * this. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3518 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3519 PyErr_SetString(UnpicklingError, "LONG pickle has negative " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3520 "byte count"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3521 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3522 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3523 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3524 if (size == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3525 along = PyLong_FromLong(0L); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3526 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3527 /* Read the raw little-endian bytes & convert. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3528 i = self->read_func(self, (char **)&pdata, size); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3529 if (i < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3530 along = _PyLong_FromByteArray(pdata, (size_t)size, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3531 1 /* little endian */, 1 /* signed */); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3532 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3533 if (along == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3534 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3535 PDATA_PUSH(self->stack, along, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3536 return 0; |
|
27585
a05814184e8c
cPickle.c: Full support for the new LONG1 and LONG4. Added comments.
Tim Peters <tim.peters@gmail.com>
parents:
27584
diff
changeset
|
3537 } |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3538 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3539 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3540 load_float(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3541 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3542 PyObject *py_float = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3543 char *endptr, *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3544 int len, res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3545 double d; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3546 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3547 if ((len = self->readline_func(self, &s)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3548 if (len < 2) return bad_readline(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3549 if (!( s=pystrndup(s,len))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3550 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
3551 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
3552 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
3553 if (d == -1.0 && PyErr_Occurred()) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
3554 goto finally; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
3555 } else if ((endptr[0] != '\n') || (endptr[1] != '\0')) { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3556 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3557 "could not convert string to float"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3558 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3559 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3560 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3561 if (!( py_float = PyFloat_FromDouble(d))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3562 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3563 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3564 free(s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3565 PDATA_PUSH(self->stack, py_float, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3566 return 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3567 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3568 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3569 free(s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3570 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3571 return res; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3572 } |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3573 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3574 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3575 load_binfloat(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3576 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3577 PyObject *py_float; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3578 double x; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3579 char *p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3580 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3581 if (self->read_func(self, &p, 8) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3582 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3583 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3584 x = _PyFloat_Unpack8((unsigned char *)p, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3585 if (x == -1.0 && PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3586 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3587 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3588 py_float = PyFloat_FromDouble(x); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3589 if (py_float == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3590 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3591 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3592 PDATA_PUSH(self->stack, py_float, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3593 return 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3594 } |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3595 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3596 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3597 load_string(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3598 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3599 PyObject *str = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3600 int len, res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3601 char *s, *p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3602 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3603 if ((len = self->readline_func(self, &s)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3604 if (len < 2) return bad_readline(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3605 if (!( s=pystrndup(s,len))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3606 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3607 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3608 /* Strip outermost quotes */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3609 while (s[len-1] <= ' ') |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3610 len--; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3611 if(s[0]=='"' && s[len-1]=='"'){ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3612 s[len-1] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3613 p = s + 1 ; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3614 len -= 2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3615 } else if(s[0]=='\'' && s[len-1]=='\''){ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3616 s[len-1] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3617 p = s + 1 ; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3618 len -= 2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3619 } else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3620 goto insecure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3621 /********************************************/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3622 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3623 str = PyString_DecodeEscape(p, len, NULL, 0, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3624 free(s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3625 if (str) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3626 PDATA_PUSH(self->stack, str, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3627 res = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3628 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3629 return res; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3630 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3631 insecure: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3632 free(s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3633 PyErr_SetString(PyExc_ValueError,"insecure string pickle"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3634 return -1; |
| 4907 | 3635 } |
| 3636 | |
| 3637 | |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3638 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3639 load_binstring(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3640 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3641 PyObject *py_string = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3642 long l; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3643 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3644 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3645 if (self->read_func(self, &s, 4) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3646 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3647 l = calc_binint(s, 4); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3648 if (l < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3649 /* Corrupt or hostile pickle -- we never write one like |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3650 * this. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3651 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3652 PyErr_SetString(UnpicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3653 "BINSTRING pickle has negative byte count"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3654 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3655 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3656 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3657 if (self->read_func(self, &s, l) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3658 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3659 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3660 if (!( py_string = PyString_FromStringAndSize(s, l))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3661 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3662 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3663 PDATA_PUSH(self->stack, py_string, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3664 return 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3665 } |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3666 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3667 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3668 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3669 load_short_binstring(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3670 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3671 PyObject *py_string = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3672 unsigned char l; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3673 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3674 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3675 if (self->read_func(self, &s, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3676 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3677 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3678 l = (unsigned char)s[0]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3679 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3680 if (self->read_func(self, &s, l) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3681 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3682 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3683 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3684 PDATA_PUSH(self->stack, py_string, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3685 return 0; |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
3686 } |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3687 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3688 |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
3689 #ifdef Py_USING_UNICODE |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3690 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3691 load_unicode(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3692 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3693 PyObject *str = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3694 int len, res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3695 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3696 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3697 if ((len = self->readline_func(self, &s)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3698 if (len < 1) return bad_readline(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3699 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3700 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3701 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3702 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3703 PDATA_PUSH(self->stack, str, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3704 return 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3705 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3706 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3707 return res; |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
3708 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
3709 #endif |
|
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
3710 |
|
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
3711 |
|
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
3712 #ifdef Py_USING_UNICODE |
|
11982
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
3713 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3714 load_binunicode(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3715 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3716 PyObject *unicode; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3717 long l; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3718 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3719 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3720 if (self->read_func(self, &s, 4) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3721 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3722 l = calc_binint(s, 4); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3723 if (l < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3724 /* Corrupt or hostile pickle -- we never write one like |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3725 * this. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3726 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3727 PyErr_SetString(UnpicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3728 "BINUNICODE pickle has negative byte count"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3729 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3730 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3731 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3732 if (self->read_func(self, &s, l) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3733 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3734 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3735 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3736 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3737 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3738 PDATA_PUSH(self->stack, unicode, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3739 return 0; |
|
11982
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
3740 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
3741 #endif |
|
11982
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
3742 |
|
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
3743 |
|
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
3744 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3745 load_tuple(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3746 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3747 PyObject *tup; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3748 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3749 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3750 if ((i = marker(self)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3751 if (!( tup=Pdata_popTuple(self->stack, i))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3752 PDATA_PUSH(self->stack, tup, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3753 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3754 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3755 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3756 static int |
|
27615
45ad77a43d87
cPickle support for TUPLE[123]. Incidentally plugged several undetected
Tim Peters <tim.peters@gmail.com>
parents:
27601
diff
changeset
|
3757 load_counted_tuple(Unpicklerobject *self, int len) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3758 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3759 PyObject *tup = PyTuple_New(len); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3760 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3761 if (tup == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3762 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3763 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3764 while (--len >= 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3765 PyObject *element; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3766 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3767 PDATA_POP(self->stack, element); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3768 if (element == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3769 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3770 PyTuple_SET_ITEM(tup, len, element); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3771 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3772 PDATA_PUSH(self->stack, tup, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3773 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3774 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3775 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3776 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3777 load_empty_list(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3778 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3779 PyObject *list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3780 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3781 if (!( list=PyList_New(0))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3782 PDATA_PUSH(self->stack, list, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3783 return 0; |
| 4907 | 3784 } |
| 3785 | |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3786 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3787 load_empty_dict(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3788 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3789 PyObject *dict; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3790 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3791 if (!( dict=PyDict_New())) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3792 PDATA_PUSH(self->stack, dict, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3793 return 0; |
| 4907 | 3794 } |
| 3795 | |
| 3796 | |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3797 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3798 load_list(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3799 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3800 PyObject *list = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3801 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3802 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3803 if ((i = marker(self)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3804 if (!( list=Pdata_popList(self->stack, i))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3805 PDATA_PUSH(self->stack, list, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3806 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3807 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3808 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3809 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3810 load_dict(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3811 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3812 PyObject *dict, *key, *value; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3813 int i, j, k; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3814 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3815 if ((i = marker(self)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3816 j=self->stack->length; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3817 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3818 if (!( dict = PyDict_New())) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3819 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3820 for (k = i+1; k < j; k += 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3821 key =self->stack->data[k-1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3822 value=self->stack->data[k ]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3823 if (PyDict_SetItem(dict, key, value) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3824 Py_DECREF(dict); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3825 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3826 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3827 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3828 Pdata_clear(self->stack, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3829 PDATA_PUSH(self->stack, dict, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3830 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3831 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3832 |
| 4907 | 3833 static PyObject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3834 Instance_New(PyObject *cls, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3835 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3836 PyObject *r = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3837 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3838 if (PyClass_Check(cls)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3839 int l; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3840 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3841 if ((l=PyObject_Size(args)) < 0) goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3842 if (!( l )) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3843 PyObject *__getinitargs__; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3844 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3845 __getinitargs__ = PyObject_GetAttr(cls, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3846 __getinitargs___str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3847 if (!__getinitargs__) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3848 /* We have a class with no __getinitargs__, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3849 so bypass usual construction */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3850 PyObject *inst; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3851 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3852 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3853 if (!( inst=PyInstance_NewRaw(cls, NULL))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3854 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3855 return inst; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3856 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3857 Py_DECREF(__getinitargs__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3858 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3859 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3860 if ((r=PyInstance_New(cls, args, NULL))) return r; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3861 else goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3862 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3863 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3864 if ((r=PyObject_CallObject(cls, args))) return r; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3865 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3866 err: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3867 { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3868 PyObject *tp, *v, *tb, *tmp_value; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3869 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3870 PyErr_Fetch(&tp, &v, &tb); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3871 tmp_value = v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3872 /* NULL occurs when there was a KeyboardInterrupt */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3873 if (tmp_value == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3874 tmp_value = Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3875 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3876 Py_XDECREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3877 v=r; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3878 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3879 PyErr_Restore(tp,v,tb); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3880 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3881 return NULL; |
| 4907 | 3882 } |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
3883 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3884 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3885 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3886 load_obj(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3887 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3888 PyObject *class, *tup, *obj=0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3889 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3890 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3891 if ((i = marker(self)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3892 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3893 PDATA_POP(self->stack, class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3894 if (class) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3895 obj = Instance_New(class, tup); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3896 Py_DECREF(class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3897 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3898 Py_DECREF(tup); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3899 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3900 if (! obj) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3901 PDATA_PUSH(self->stack, obj, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3902 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3903 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3904 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3905 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3906 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3907 load_inst(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3908 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3909 PyObject *tup, *class=0, *obj=0, *module_name, *class_name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3910 int i, len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3911 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3912 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3913 if ((i = marker(self)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3914 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3915 if ((len = self->readline_func(self, &s)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3916 if (len < 2) return bad_readline(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3917 module_name = PyString_FromStringAndSize(s, len - 1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3918 if (!module_name) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3919 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3920 if ((len = self->readline_func(self, &s)) >= 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3921 if (len < 2) return bad_readline(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3922 if ((class_name = PyString_FromStringAndSize(s, len - 1))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3923 class = find_class(module_name, class_name, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3924 self->find_class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3925 Py_DECREF(class_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3926 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3927 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3928 Py_DECREF(module_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3929 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3930 if (! class) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3931 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3932 if ((tup=Pdata_popTuple(self->stack, i))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3933 obj = Instance_New(class, tup); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3934 Py_DECREF(tup); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3935 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3936 Py_DECREF(class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3937 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3938 if (! obj) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3939 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3940 PDATA_PUSH(self->stack, obj, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3941 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3942 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3943 |
|
27869
870cf14add2a
Taught cPickle how to read pickles containing NEWOBJ. This won't get
Tim Peters <tim.peters@gmail.com>
parents:
27864
diff
changeset
|
3944 static int |
|
870cf14add2a
Taught cPickle how to read pickles containing NEWOBJ. This won't get
Tim Peters <tim.peters@gmail.com>
parents:
27864
diff
changeset
|
3945 load_newobj(Unpicklerobject *self) |
|
870cf14add2a
Taught cPickle how to read pickles containing NEWOBJ. This won't get
Tim Peters <tim.peters@gmail.com>
parents:
27864
diff
changeset
|
3946 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3947 PyObject *args = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3948 PyObject *clsraw = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3949 PyTypeObject *cls; /* clsraw cast to its true type */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3950 PyObject *obj; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3951 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3952 /* Stack is ... cls argtuple, and we want to call |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3953 * cls.__new__(cls, *argtuple). |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3954 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3955 PDATA_POP(self->stack, args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3956 if (args == NULL) goto Fail; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3957 if (! PyTuple_Check(args)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3958 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3959 "tuple."); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3960 goto Fail; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3961 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3962 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3963 PDATA_POP(self->stack, clsraw); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3964 cls = (PyTypeObject *)clsraw; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3965 if (cls == NULL) goto Fail; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3966 if (! PyType_Check(cls)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3967 PyErr_SetString(UnpicklingError, "NEWOBJ class argument " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3968 "isn't a type object"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3969 goto Fail; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3970 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3971 if (cls->tp_new == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3972 PyErr_SetString(UnpicklingError, "NEWOBJ class argument " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3973 "has NULL tp_new"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3974 goto Fail; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3975 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3976 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3977 /* Call __new__. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3978 obj = cls->tp_new(cls, args, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3979 if (obj == NULL) goto Fail; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3980 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3981 Py_DECREF(args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3982 Py_DECREF(clsraw); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3983 PDATA_PUSH(self->stack, obj, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3984 return 0; |
|
27869
870cf14add2a
Taught cPickle how to read pickles containing NEWOBJ. This won't get
Tim Peters <tim.peters@gmail.com>
parents:
27864
diff
changeset
|
3985 |
|
870cf14add2a
Taught cPickle how to read pickles containing NEWOBJ. This won't get
Tim Peters <tim.peters@gmail.com>
parents:
27864
diff
changeset
|
3986 Fail: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3987 Py_XDECREF(args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3988 Py_XDECREF(clsraw); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3989 return -1; |
|
27869
870cf14add2a
Taught cPickle how to read pickles containing NEWOBJ. This won't get
Tim Peters <tim.peters@gmail.com>
parents:
27864
diff
changeset
|
3990 } |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3991 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
3992 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
3993 load_global(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
3994 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3995 PyObject *class = 0, *module_name = 0, *class_name = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3996 int len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3997 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3998 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
3999 if ((len = self->readline_func(self, &s)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4000 if (len < 2) return bad_readline(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4001 module_name = PyString_FromStringAndSize(s, len - 1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4002 if (!module_name) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4003 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4004 if ((len = self->readline_func(self, &s)) >= 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4005 if (len < 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4006 Py_DECREF(module_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4007 return bad_readline(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4008 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4009 if ((class_name = PyString_FromStringAndSize(s, len - 1))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4010 class = find_class(module_name, class_name, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4011 self->find_class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4012 Py_DECREF(class_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4013 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4014 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4015 Py_DECREF(module_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4016 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4017 if (! class) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4018 PDATA_PUSH(self->stack, class, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4019 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4020 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4021 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4022 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4023 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4024 load_persid(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4025 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4026 PyObject *pid = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4027 int len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4028 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4029 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4030 if (self->pers_func) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4031 if ((len = self->readline_func(self, &s)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4032 if (len < 2) return bad_readline(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4033 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4034 pid = PyString_FromStringAndSize(s, len - 1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4035 if (!pid) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4036 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4037 if (PyList_Check(self->pers_func)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4038 if (PyList_Append(self->pers_func, pid) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4039 Py_DECREF(pid); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4040 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4041 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4042 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4043 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4044 ARG_TUP(self, pid); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4045 if (self->arg) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4046 pid = PyObject_Call(self->pers_func, self->arg, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4047 NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4048 FREE_ARG_TUP(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4049 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4050 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4051 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4052 if (! pid) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4053 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4054 PDATA_PUSH(self->stack, pid, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4055 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4056 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4057 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4058 PyErr_SetString(UnpicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4059 "A load persistent id instruction was encountered,\n" |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4060 "but no persistent_load function was specified."); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4061 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4062 } |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4063 } |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4064 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4065 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4066 load_binpersid(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4067 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4068 PyObject *pid = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4069 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4070 if (self->pers_func) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4071 PDATA_POP(self->stack, pid); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4072 if (! pid) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4073 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4074 if (PyList_Check(self->pers_func)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4075 if (PyList_Append(self->pers_func, pid) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4076 Py_DECREF(pid); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4077 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4078 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4079 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4080 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4081 ARG_TUP(self, pid); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4082 if (self->arg) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4083 pid = PyObject_Call(self->pers_func, self->arg, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4084 NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4085 FREE_ARG_TUP(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4086 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4087 if (! pid) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4088 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4089 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4090 PDATA_PUSH(self->stack, pid, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4091 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4092 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4093 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4094 PyErr_SetString(UnpicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4095 "A load persistent id instruction was encountered,\n" |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4096 "but no persistent_load function was specified."); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4097 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4098 } |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4099 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4100 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4101 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4102 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4103 load_pop(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4104 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4105 int len = self->stack->length; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4106 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4107 /* Note that we split the (pickle.py) stack into two stacks, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4108 an object stack and a mark stack. We have to be clever and |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4109 pop the right one. We do this by looking at the top of the |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4110 mark stack first, and only signalling a stack underflow if |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4111 the object stack is empty and the mark stack doesn't match |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4112 our expectations. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4113 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4114 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4115 self->num_marks--; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4116 } else if (len > 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4117 len--; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4118 Py_DECREF(self->stack->data[len]); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4119 self->stack->length = len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4120 } else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4121 return stackUnderflow(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4122 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4123 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4124 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4125 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4126 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4127 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4128 load_pop_mark(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4129 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4130 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4131 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4132 if ((i = marker(self)) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4133 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4134 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4135 Pdata_clear(self->stack, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4136 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4137 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4138 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4139 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4140 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4141 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4142 load_dup(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4143 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4144 PyObject *last; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4145 int len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4146 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4147 if ((len = self->stack->length) <= 0) return stackUnderflow(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4148 last=self->stack->data[len-1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4149 Py_INCREF(last); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4150 PDATA_PUSH(self->stack, last, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4151 return 0; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4152 } |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4153 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4154 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4155 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4156 load_get(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4157 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4158 PyObject *py_str = 0, *value = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4159 int len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4160 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4161 int rc; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4162 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4163 if ((len = self->readline_func(self, &s)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4164 if (len < 2) return bad_readline(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4165 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4166 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4167 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4168 value = PyDict_GetItem(self->memo, py_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4169 if (! value) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4170 PyErr_SetObject(BadPickleGet, py_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4171 rc = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4172 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4173 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4174 PDATA_APPEND(self->stack, value, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4175 rc = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4176 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4177 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4178 Py_DECREF(py_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4179 return rc; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4180 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4181 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4182 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4183 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4184 load_binget(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4185 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4186 PyObject *py_key = 0, *value = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4187 unsigned char key; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4188 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4189 int rc; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4190 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4191 if (self->read_func(self, &s, 1) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4192 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4193 key = (unsigned char)s[0]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4194 if (!( py_key = PyInt_FromLong((long)key))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4195 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4196 value = PyDict_GetItem(self->memo, py_key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4197 if (! value) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4198 PyErr_SetObject(BadPickleGet, py_key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4199 rc = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4200 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4201 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4202 PDATA_APPEND(self->stack, value, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4203 rc = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4204 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4205 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4206 Py_DECREF(py_key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4207 return rc; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4208 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4209 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4210 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4211 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4212 load_long_binget(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4213 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4214 PyObject *py_key = 0, *value = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4215 unsigned char c; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4216 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4217 long key; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4218 int rc; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4219 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4220 if (self->read_func(self, &s, 4) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4221 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4222 c = (unsigned char)s[0]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4223 key = (long)c; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4224 c = (unsigned char)s[1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4225 key |= (long)c << 8; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4226 c = (unsigned char)s[2]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4227 key |= (long)c << 16; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4228 c = (unsigned char)s[3]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4229 key |= (long)c << 24; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4230 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4231 if (!( py_key = PyInt_FromLong((long)key))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4232 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4233 value = PyDict_GetItem(self->memo, py_key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4234 if (! value) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4235 PyErr_SetObject(BadPickleGet, py_key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4236 rc = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4237 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4238 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4239 PDATA_APPEND(self->stack, value, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4240 rc = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4241 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4242 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4243 Py_DECREF(py_key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4244 return rc; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4245 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4246 |
|
27666
5d7888fbea00
cPickle can load pickles using proto 2 EXT[124] now, but can't yet
Tim Peters <tim.peters@gmail.com>
parents:
27665
diff
changeset
|
4247 /* Push an object from the extension registry (EXT[124]). nbytes is |
|
5d7888fbea00
cPickle can load pickles using proto 2 EXT[124] now, but can't yet
Tim Peters <tim.peters@gmail.com>
parents:
27665
diff
changeset
|
4248 * the number of bytes following the opcode, holding the index (code) value. |
|
5d7888fbea00
cPickle can load pickles using proto 2 EXT[124] now, but can't yet
Tim Peters <tim.peters@gmail.com>
parents:
27665
diff
changeset
|
4249 */ |
|
5d7888fbea00
cPickle can load pickles using proto 2 EXT[124] now, but can't yet
Tim Peters <tim.peters@gmail.com>
parents:
27665
diff
changeset
|
4250 static int |
|
5d7888fbea00
cPickle can load pickles using proto 2 EXT[124] now, but can't yet
Tim Peters <tim.peters@gmail.com>
parents:
27665
diff
changeset
|
4251 load_extension(Unpicklerobject *self, int nbytes) |
|
5d7888fbea00
cPickle can load pickles using proto 2 EXT[124] now, but can't yet
Tim Peters <tim.peters@gmail.com>
parents:
27665
diff
changeset
|
4252 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4253 char *codebytes; /* the nbytes bytes after the opcode */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4254 long code; /* calc_binint returns long */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4255 PyObject *py_code; /* code as a Python int */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4256 PyObject *obj; /* the object to push */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4257 PyObject *pair; /* (module_name, class_name) */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4258 PyObject *module_name, *class_name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4259 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4260 assert(nbytes == 1 || nbytes == 2 || nbytes == 4); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4261 if (self->read_func(self, &codebytes, nbytes) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4262 code = calc_binint(codebytes, nbytes); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4263 if (code <= 0) { /* note that 0 is forbidden */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4264 /* Corrupt or hostile pickle. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4265 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4266 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4267 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4268 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4269 /* Look for the code in the cache. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4270 py_code = PyInt_FromLong(code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4271 if (py_code == NULL) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4272 obj = PyDict_GetItem(extension_cache, py_code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4273 if (obj != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4274 /* Bingo. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4275 Py_DECREF(py_code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4276 PDATA_APPEND(self->stack, obj, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4277 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4278 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4279 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4280 /* Look up the (module_name, class_name) pair. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4281 pair = PyDict_GetItem(inverted_registry, py_code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4282 if (pair == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4283 Py_DECREF(py_code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4284 PyErr_Format(PyExc_ValueError, "unregistered extension " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4285 "code %ld", code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4286 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4287 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4288 /* Since the extension registry is manipulable via Python code, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4289 * confirm that pair is really a 2-tuple of strings. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4290 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4291 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4292 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4293 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4294 Py_DECREF(py_code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4295 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4296 "isn't a 2-tuple of strings", code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4297 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4298 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4299 /* Load the object. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4300 obj = find_class(module_name, class_name, self->find_class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4301 if (obj == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4302 Py_DECREF(py_code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4303 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4304 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4305 /* Cache code -> obj. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4306 code = PyDict_SetItem(extension_cache, py_code, obj); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4307 Py_DECREF(py_code); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4308 if (code < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4309 Py_DECREF(obj); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4310 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4311 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4312 PDATA_PUSH(self->stack, obj, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4313 return 0; |
|
27666
5d7888fbea00
cPickle can load pickles using proto 2 EXT[124] now, but can't yet
Tim Peters <tim.peters@gmail.com>
parents:
27665
diff
changeset
|
4314 } |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4315 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4316 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4317 load_put(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4318 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4319 PyObject *py_str = 0, *value = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4320 int len, l; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4321 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4322 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4323 if ((l = self->readline_func(self, &s)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4324 if (l < 2) return bad_readline(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4325 if (!( len=self->stack->length )) return stackUnderflow(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4326 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4327 value=self->stack->data[len-1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4328 l=PyDict_SetItem(self->memo, py_str, value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4329 Py_DECREF(py_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4330 return l; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4331 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4332 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4333 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4334 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4335 load_binput(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4336 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4337 PyObject *py_key = 0, *value = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4338 unsigned char key; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4339 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4340 int len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4341 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4342 if (self->read_func(self, &s, 1) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4343 if (!( (len=self->stack->length) > 0 )) return stackUnderflow(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4344 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4345 key = (unsigned char)s[0]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4346 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4347 if (!( py_key = PyInt_FromLong((long)key))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4348 value=self->stack->data[len-1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4349 len=PyDict_SetItem(self->memo, py_key, value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4350 Py_DECREF(py_key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4351 return len; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4352 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4353 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4354 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4355 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4356 load_long_binput(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4357 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4358 PyObject *py_key = 0, *value = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4359 long key; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4360 unsigned char c; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4361 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4362 int len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4363 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4364 if (self->read_func(self, &s, 4) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4365 if (!( len=self->stack->length )) return stackUnderflow(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4366 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4367 c = (unsigned char)s[0]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4368 key = (long)c; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4369 c = (unsigned char)s[1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4370 key |= (long)c << 8; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4371 c = (unsigned char)s[2]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4372 key |= (long)c << 16; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4373 c = (unsigned char)s[3]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4374 key |= (long)c << 24; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4375 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4376 if (!( py_key = PyInt_FromLong(key))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4377 value=self->stack->data[len-1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4378 len=PyDict_SetItem(self->memo, py_key, value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4379 Py_DECREF(py_key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4380 return len; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4381 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4382 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4383 |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
4384 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4385 do_append(Unpicklerobject *self, int x) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4386 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4387 PyObject *value = 0, *list = 0, *append_method = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4388 int len, i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4389 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4390 len=self->stack->length; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4391 if (!( len >= x && x > 0 )) return stackUnderflow(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4392 /* nothing to do */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4393 if (len==x) return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4394 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4395 list=self->stack->data[x-1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4396 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4397 if (PyList_Check(list)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4398 PyObject *slice; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4399 int list_len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4400 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4401 slice=Pdata_popList(self->stack, x); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4402 if (! slice) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4403 list_len = PyList_GET_SIZE(list); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4404 i=PyList_SetSlice(list, list_len, list_len, slice); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4405 Py_DECREF(slice); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4406 return i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4407 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4408 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4409 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4410 if (!( append_method = PyObject_GetAttr(list, append_str))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4411 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4412 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4413 for (i = x; i < len; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4414 PyObject *junk; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4415 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4416 value=self->stack->data[i]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4417 junk=0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4418 ARG_TUP(self, value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4419 if (self->arg) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4420 junk = PyObject_Call(append_method, self->arg, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4421 NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4422 FREE_ARG_TUP(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4423 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4424 if (! junk) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4425 Pdata_clear(self->stack, i+1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4426 self->stack->length=x; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4427 Py_DECREF(append_method); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4428 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4429 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4430 Py_DECREF(junk); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4431 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4432 self->stack->length=x; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4433 Py_DECREF(append_method); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4434 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4435 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4436 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4437 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4438 |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
4439 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4440 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4441 load_append(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4442 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4443 return do_append(self, self->stack->length - 1); |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4444 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4445 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4446 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4447 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4448 load_appends(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4449 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4450 return do_append(self, marker(self)); |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4451 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4452 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4453 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4454 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4455 do_setitems(Unpicklerobject *self, int x) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4456 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4457 PyObject *value = 0, *key = 0, *dict = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4458 int len, i, r=0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4459 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4460 if (!( (len=self->stack->length) >= x |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4461 && x > 0 )) return stackUnderflow(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4462 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4463 dict=self->stack->data[x-1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4464 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4465 for (i = x+1; i < len; i += 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4466 key =self->stack->data[i-1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4467 value=self->stack->data[i ]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4468 if (PyObject_SetItem(dict, key, value) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4469 r=-1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4470 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4471 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4472 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4473 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4474 Pdata_clear(self->stack, x); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4475 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4476 return r; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4477 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4478 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4479 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4480 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4481 load_setitem(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4482 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4483 return do_setitems(self, self->stack->length - 2); |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4484 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4485 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4486 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4487 load_setitems(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4488 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4489 return do_setitems(self, marker(self)); |
| 4907 | 4490 } |
| 4491 | |
| 4492 | |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4493 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4494 load_build(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4495 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4496 PyObject *state, *inst, *slotstate; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4497 PyObject *__setstate__; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4498 PyObject *d_key, *d_value; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4499 Py_ssize_t i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4500 int res = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4501 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4502 /* Stack is ... instance, state. We want to leave instance at |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4503 * the stack top, possibly mutated via instance.__setstate__(state). |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4504 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4505 if (self->stack->length < 2) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4506 return stackUnderflow(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4507 PDATA_POP(self->stack, state); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4508 if (state == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4509 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4510 inst = self->stack->data[self->stack->length - 1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4511 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4512 __setstate__ = PyObject_GetAttr(inst, __setstate___str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4513 if (__setstate__ != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4514 PyObject *junk = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4515 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4516 /* The explicit __setstate__ is responsible for everything. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4517 ARG_TUP(self, state); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4518 if (self->arg) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4519 junk = PyObject_Call(__setstate__, self->arg, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4520 FREE_ARG_TUP(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4521 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4522 Py_DECREF(__setstate__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4523 if (junk == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4524 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4525 Py_DECREF(junk); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4526 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4527 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4528 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4529 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4530 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4531 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4532 /* A default __setstate__. First see whether state embeds a |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4533 * slot state dict too (a proto 2 addition). |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4534 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4535 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4536 PyObject *temp = state; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4537 state = PyTuple_GET_ITEM(temp, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4538 slotstate = PyTuple_GET_ITEM(temp, 1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4539 Py_INCREF(state); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4540 Py_INCREF(slotstate); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4541 Py_DECREF(temp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4542 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4543 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4544 slotstate = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4545 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4546 /* Set inst.__dict__ from the state dict (if any). */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4547 if (state != Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4548 PyObject *dict; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4549 if (! PyDict_Check(state)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4550 PyErr_SetString(UnpicklingError, "state is not a " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4551 "dictionary"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4552 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4553 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4554 dict = PyObject_GetAttr(inst, __dict___str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4555 if (dict == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4556 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4557 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4558 i = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4559 while (PyDict_Next(state, &i, &d_key, &d_value)) { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
4560 /* normally the keys for instance attributes are |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
4561 interned. we should try to do that here. */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
4562 Py_INCREF(d_key); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
4563 if (PyString_CheckExact(d_key)) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
4564 PyString_InternInPlace(&d_key); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
4565 if (PyObject_SetItem(dict, d_key, d_value) < 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
4566 Py_DECREF(d_key); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4567 goto finally; |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
4568 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
4569 Py_DECREF(d_key); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4570 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4571 Py_DECREF(dict); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4572 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4573 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4574 /* Also set instance attributes from the slotstate dict (if any). */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4575 if (slotstate != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4576 if (! PyDict_Check(slotstate)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4577 PyErr_SetString(UnpicklingError, "slot state is not " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4578 "a dictionary"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4579 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4580 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4581 i = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4582 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4583 if (PyObject_SetAttr(inst, d_key, d_value) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4584 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4585 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4586 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4587 res = 0; |
|
27901
55adf08a213a
cPickle.c, load_build(): Taught cPickle how to pick apart
Tim Peters <tim.peters@gmail.com>
parents:
27899
diff
changeset
|
4588 |
|
55adf08a213a
cPickle.c, load_build(): Taught cPickle how to pick apart
Tim Peters <tim.peters@gmail.com>
parents:
27899
diff
changeset
|
4589 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4590 Py_DECREF(state); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4591 Py_XDECREF(slotstate); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4592 return res; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4593 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4594 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4595 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4596 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4597 load_mark(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4598 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4599 int s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4600 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4601 /* Note that we split the (pickle.py) stack into two stacks, an |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4602 object stack and a mark stack. Here we push a mark onto the |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4603 mark stack. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4604 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4605 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4606 if ((self->num_marks + 1) >= self->marks_size) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4607 int *marks; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4608 s=self->marks_size+20; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4609 if (s <= self->num_marks) s=self->num_marks + 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4610 if (self->marks == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4611 marks=(int *)malloc(s * sizeof(int)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4612 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4613 marks=(int *)realloc(self->marks, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4614 s * sizeof(int)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4615 if (!marks) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4616 PyErr_NoMemory(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4617 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4618 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4619 self->marks = marks; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4620 self->marks_size = s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4621 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4622 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4623 self->marks[self->num_marks++] = self->stack->length; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4624 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4625 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4626 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4627 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4628 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4629 load_reduce(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4630 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4631 PyObject *callable = 0, *arg_tup = 0, *ob = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4632 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4633 PDATA_POP(self->stack, arg_tup); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4634 if (! arg_tup) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4635 PDATA_POP(self->stack, callable); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4636 if (callable) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4637 ob = Instance_New(callable, arg_tup); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4638 Py_DECREF(callable); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4639 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4640 Py_DECREF(arg_tup); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4641 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4642 if (! ob) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4643 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4644 PDATA_PUSH(self->stack, ob, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4645 return 0; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4646 } |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
4647 |
|
27591
d6b65e3855a2
Add cPickle support for PROTO. Duplicated PROTO/LONG1/LONG4 code in
Tim Peters <tim.peters@gmail.com>
parents:
27585
diff
changeset
|
4648 /* Just raises an error if we don't know the protocol specified. PROTO |
|
d6b65e3855a2
Add cPickle support for PROTO. Duplicated PROTO/LONG1/LONG4 code in
Tim Peters <tim.peters@gmail.com>
parents:
27585
diff
changeset
|
4649 * is the first opcode for protocols >= 2. |
|
d6b65e3855a2
Add cPickle support for PROTO. Duplicated PROTO/LONG1/LONG4 code in
Tim Peters <tim.peters@gmail.com>
parents:
27585
diff
changeset
|
4650 */ |
|
d6b65e3855a2
Add cPickle support for PROTO. Duplicated PROTO/LONG1/LONG4 code in
Tim Peters <tim.peters@gmail.com>
parents:
27585
diff
changeset
|
4651 static int |
|
d6b65e3855a2
Add cPickle support for PROTO. Duplicated PROTO/LONG1/LONG4 code in
Tim Peters <tim.peters@gmail.com>
parents:
27585
diff
changeset
|
4652 load_proto(Unpicklerobject *self) |
|
d6b65e3855a2
Add cPickle support for PROTO. Duplicated PROTO/LONG1/LONG4 code in
Tim Peters <tim.peters@gmail.com>
parents:
27585
diff
changeset
|
4653 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4654 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4655 char *protobyte; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4656 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4657 i = self->read_func(self, &protobyte, 1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4658 if (i < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4659 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4660 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4661 i = calc_binint(protobyte, 1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4662 /* No point checking for < 0, since calc_binint returns an unsigned |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4663 * int when chewing on 1 byte. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4664 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4665 assert(i >= 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4666 if (i <= HIGHEST_PROTOCOL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4667 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4668 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4669 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4670 return -1; |
|
27591
d6b65e3855a2
Add cPickle support for PROTO. Duplicated PROTO/LONG1/LONG4 code in
Tim Peters <tim.peters@gmail.com>
parents:
27585
diff
changeset
|
4671 } |
|
d6b65e3855a2
Add cPickle support for PROTO. Duplicated PROTO/LONG1/LONG4 code in
Tim Peters <tim.peters@gmail.com>
parents:
27585
diff
changeset
|
4672 |
| 4907 | 4673 static PyObject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4674 load(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4675 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4676 PyObject *err = 0, *val = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4677 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4678 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4679 self->num_marks = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4680 if (self->stack->length) Pdata_clear(self->stack, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4681 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4682 while (1) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4683 if (self->read_func(self, &s, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4684 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4685 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4686 switch (s[0]) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4687 case NONE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4688 if (load_none(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4689 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4690 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4691 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4692 case BININT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4693 if (load_binint(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4694 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4695 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4696 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4697 case BININT1: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4698 if (load_binint1(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4699 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4700 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4701 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4702 case BININT2: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4703 if (load_binint2(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4704 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4705 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4706 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4707 case INT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4708 if (load_int(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4709 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4710 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4711 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4712 case LONG: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4713 if (load_long(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4714 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4715 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4716 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4717 case LONG1: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4718 if (load_counted_long(self, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4719 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4720 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4721 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4722 case LONG4: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4723 if (load_counted_long(self, 4) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4724 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4725 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4726 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4727 case FLOAT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4728 if (load_float(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4729 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4730 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4731 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4732 case BINFLOAT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4733 if (load_binfloat(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4734 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4735 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4736 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4737 case BINSTRING: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4738 if (load_binstring(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4739 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4740 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4741 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4742 case SHORT_BINSTRING: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4743 if (load_short_binstring(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4744 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4745 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4746 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4747 case STRING: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4748 if (load_string(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4749 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4750 continue; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
4751 |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
4752 #ifdef Py_USING_UNICODE |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4753 case UNICODE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4754 if (load_unicode(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4755 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4756 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4757 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4758 case BINUNICODE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4759 if (load_binunicode(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4760 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4761 continue; |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
4762 #endif |
|
11982
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
4763 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4764 case EMPTY_TUPLE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4765 if (load_counted_tuple(self, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4766 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4767 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4768 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4769 case TUPLE1: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4770 if (load_counted_tuple(self, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4771 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4772 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4773 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4774 case TUPLE2: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4775 if (load_counted_tuple(self, 2) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4776 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4777 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4778 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4779 case TUPLE3: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4780 if (load_counted_tuple(self, 3) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4781 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4782 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4783 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4784 case TUPLE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4785 if (load_tuple(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4786 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4787 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4788 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4789 case EMPTY_LIST: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4790 if (load_empty_list(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4791 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4792 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4793 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4794 case LIST: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4795 if (load_list(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4796 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4797 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4798 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4799 case EMPTY_DICT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4800 if (load_empty_dict(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4801 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4802 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4803 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4804 case DICT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4805 if (load_dict(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4806 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4807 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4808 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4809 case OBJ: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4810 if (load_obj(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4811 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4812 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4813 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4814 case INST: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4815 if (load_inst(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4816 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4817 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4818 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4819 case NEWOBJ: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4820 if (load_newobj(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4821 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4822 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4823 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4824 case GLOBAL: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4825 if (load_global(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4826 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4827 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4828 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4829 case APPEND: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4830 if (load_append(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4831 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4832 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4833 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4834 case APPENDS: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4835 if (load_appends(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4836 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4837 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4838 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4839 case BUILD: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4840 if (load_build(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4841 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4842 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4843 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4844 case DUP: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4845 if (load_dup(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4846 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4847 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4848 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4849 case BINGET: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4850 if (load_binget(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4851 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4852 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4853 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4854 case LONG_BINGET: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4855 if (load_long_binget(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4856 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4857 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4858 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4859 case GET: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4860 if (load_get(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4861 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4862 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4863 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4864 case EXT1: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4865 if (load_extension(self, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4866 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4867 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4868 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4869 case EXT2: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4870 if (load_extension(self, 2) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4871 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4872 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4873 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4874 case EXT4: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4875 if (load_extension(self, 4) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4876 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4877 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4878 case MARK: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4879 if (load_mark(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4880 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4881 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4882 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4883 case BINPUT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4884 if (load_binput(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4885 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4886 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4887 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4888 case LONG_BINPUT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4889 if (load_long_binput(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4890 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4891 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4892 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4893 case PUT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4894 if (load_put(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4895 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4896 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4897 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4898 case POP: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4899 if (load_pop(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4900 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4901 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4902 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4903 case POP_MARK: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4904 if (load_pop_mark(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4905 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4906 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4907 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4908 case SETITEM: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4909 if (load_setitem(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4910 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4911 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4912 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4913 case SETITEMS: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4914 if (load_setitems(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4915 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4916 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4917 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4918 case STOP: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4919 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4920 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4921 case PERSID: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4922 if (load_persid(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4923 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4924 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4925 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4926 case BINPERSID: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4927 if (load_binpersid(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4928 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4929 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4930 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4931 case REDUCE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4932 if (load_reduce(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4933 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4934 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4935 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4936 case PROTO: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4937 if (load_proto(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4938 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4939 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4940 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4941 case NEWTRUE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4942 if (load_bool(self, Py_True) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4943 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4944 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4945 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4946 case NEWFALSE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4947 if (load_bool(self, Py_False) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4948 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4949 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4950 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4951 case '\0': |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4952 /* end of file */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4953 PyErr_SetNone(PyExc_EOFError); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4954 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4955 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4956 default: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4957 cPickle_ErrFormat(UnpicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4958 "invalid load key, '%s'.", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4959 "c", s[0]); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4960 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4961 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4962 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4963 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4964 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4965 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4966 if ((err = PyErr_Occurred())) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4967 if (err == PyExc_EOFError) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4968 PyErr_SetNone(PyExc_EOFError); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4969 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4970 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4971 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4972 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4973 PDATA_POP(self->stack, val); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4974 return val; |
| 4907 | 4975 } |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
4976 |
| 4907 | 4977 |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
4978 /* No-load functions to support noload, which is used to |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
4979 find persistent references. */ |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
4980 |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
4981 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4982 noload_obj(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4983 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4984 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4985 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4986 if ((i = marker(self)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4987 return Pdata_clear(self->stack, i+1); |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
4988 } |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
4989 |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
4990 |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
4991 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
4992 noload_inst(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
4993 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4994 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4995 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4996 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4997 if ((i = marker(self)) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4998 Pdata_clear(self->stack, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
4999 if (self->readline_func(self, &s) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5000 if (self->readline_func(self, &s) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5001 PDATA_APPEND(self->stack, Py_None, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5002 return 0; |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5003 } |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5004 |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5005 static int |
|
27869
870cf14add2a
Taught cPickle how to read pickles containing NEWOBJ. This won't get
Tim Peters <tim.peters@gmail.com>
parents:
27864
diff
changeset
|
5006 noload_newobj(Unpicklerobject *self) |
|
870cf14add2a
Taught cPickle how to read pickles containing NEWOBJ. This won't get
Tim Peters <tim.peters@gmail.com>
parents:
27864
diff
changeset
|
5007 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5008 PyObject *obj; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5009 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5010 PDATA_POP(self->stack, obj); /* pop argtuple */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5011 if (obj == NULL) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5012 Py_DECREF(obj); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5013 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5014 PDATA_POP(self->stack, obj); /* pop cls */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5015 if (obj == NULL) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5016 Py_DECREF(obj); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5017 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5018 PDATA_APPEND(self->stack, Py_None, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5019 return 0; |
|
27869
870cf14add2a
Taught cPickle how to read pickles containing NEWOBJ. This won't get
Tim Peters <tim.peters@gmail.com>
parents:
27864
diff
changeset
|
5020 } |
|
870cf14add2a
Taught cPickle how to read pickles containing NEWOBJ. This won't get
Tim Peters <tim.peters@gmail.com>
parents:
27864
diff
changeset
|
5021 |
|
870cf14add2a
Taught cPickle how to read pickles containing NEWOBJ. This won't get
Tim Peters <tim.peters@gmail.com>
parents:
27864
diff
changeset
|
5022 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
5023 noload_global(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5024 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5025 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5026 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5027 if (self->readline_func(self, &s) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5028 if (self->readline_func(self, &s) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5029 PDATA_APPEND(self->stack, Py_None,-1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5030 return 0; |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5031 } |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5032 |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5033 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
5034 noload_reduce(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5035 { |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5036 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5037 if (self->stack->length < 2) return stackUnderflow(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5038 Pdata_clear(self->stack, self->stack->length-2); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5039 PDATA_APPEND(self->stack, Py_None,-1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5040 return 0; |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5041 } |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5042 |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5043 static int |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5044 noload_build(Unpicklerobject *self) { |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5045 |
|
9522
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
5046 if (self->stack->length < 1) return stackUnderflow(); |
|
a1a8df73bfff
New version from Jim Fulton:
Guido van Rossum <guido@python.org>
parents:
8999
diff
changeset
|
5047 Pdata_clear(self->stack, self->stack->length-1); |
|
9587
5a9ca2e937b5
Fix two small bugs; add DL_EXPORT() to initcPickle decl.
Guido van Rossum <guido@python.org>
parents:
9522
diff
changeset
|
5048 return 0; |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5049 } |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5050 |
|
27666
5d7888fbea00
cPickle can load pickles using proto 2 EXT[124] now, but can't yet
Tim Peters <tim.peters@gmail.com>
parents:
27665
diff
changeset
|
5051 static int |
|
5d7888fbea00
cPickle can load pickles using proto 2 EXT[124] now, but can't yet
Tim Peters <tim.peters@gmail.com>
parents:
27665
diff
changeset
|
5052 noload_extension(Unpicklerobject *self, int nbytes) |
|
5d7888fbea00
cPickle can load pickles using proto 2 EXT[124] now, but can't yet
Tim Peters <tim.peters@gmail.com>
parents:
27665
diff
changeset
|
5053 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5054 char *codebytes; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5055 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5056 assert(nbytes == 1 || nbytes == 2 || nbytes == 4); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5057 if (self->read_func(self, &codebytes, nbytes) < 0) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5058 PDATA_APPEND(self->stack, Py_None, -1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5059 return 0; |
|
27666
5d7888fbea00
cPickle can load pickles using proto 2 EXT[124] now, but can't yet
Tim Peters <tim.peters@gmail.com>
parents:
27665
diff
changeset
|
5060 } |
|
5d7888fbea00
cPickle can load pickles using proto 2 EXT[124] now, but can't yet
Tim Peters <tim.peters@gmail.com>
parents:
27665
diff
changeset
|
5061 |
|
56532
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5062 static int |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5063 noload_append(Unpicklerobject *self) |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5064 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
5065 return Pdata_clear(self->stack, self->stack->length - 1); |
|
56532
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5066 } |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5067 |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5068 static int |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5069 noload_appends(Unpicklerobject *self) |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5070 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
5071 int i; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
5072 if ((i = marker(self)) < 0) return -1; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
5073 return Pdata_clear(self->stack, i); |
|
56532
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5074 } |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5075 |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5076 static int |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5077 noload_setitem(Unpicklerobject *self) |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5078 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
5079 return Pdata_clear(self->stack, self->stack->length - 2); |
|
56532
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5080 } |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5081 |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5082 static int |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5083 noload_setitems(Unpicklerobject *self) |
|
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5084 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
5085 int i; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
5086 if ((i = marker(self)) < 0) return -1; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
5087 return Pdata_clear(self->stack, i); |
|
56532
d0f005e6fadd
Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
55429
diff
changeset
|
5088 } |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5089 |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5090 static PyObject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
5091 noload(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5092 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5093 PyObject *err = 0, *val = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5094 char *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5095 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5096 self->num_marks = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5097 Pdata_clear(self->stack, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5098 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5099 while (1) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5100 if (self->read_func(self, &s, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5101 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5102 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5103 switch (s[0]) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5104 case NONE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5105 if (load_none(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5106 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5107 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5108 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5109 case BININT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5110 if (load_binint(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5111 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5112 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5113 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5114 case BININT1: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5115 if (load_binint1(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5116 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5117 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5118 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5119 case BININT2: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5120 if (load_binint2(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5121 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5122 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5123 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5124 case INT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5125 if (load_int(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5126 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5127 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5128 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5129 case LONG: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5130 if (load_long(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5131 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5132 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5133 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5134 case LONG1: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5135 if (load_counted_long(self, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5136 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5137 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5138 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5139 case LONG4: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5140 if (load_counted_long(self, 4) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5141 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5142 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5143 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5144 case FLOAT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5145 if (load_float(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5146 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5147 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5148 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5149 case BINFLOAT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5150 if (load_binfloat(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5151 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5152 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5153 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5154 case BINSTRING: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5155 if (load_binstring(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5156 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5157 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5158 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5159 case SHORT_BINSTRING: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5160 if (load_short_binstring(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5161 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5162 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5163 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5164 case STRING: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5165 if (load_string(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5166 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5167 continue; |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5168 |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
5169 #ifdef Py_USING_UNICODE |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5170 case UNICODE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5171 if (load_unicode(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5172 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5173 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5174 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5175 case BINUNICODE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5176 if (load_binunicode(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5177 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5178 continue; |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18933
diff
changeset
|
5179 #endif |
|
11982
a13294aef02e
Marc-Andre Lemburg: support pickling Unicode objects, both in text
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
5180 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5181 case EMPTY_TUPLE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5182 if (load_counted_tuple(self, 0) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5183 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5184 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5185 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5186 case TUPLE1: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5187 if (load_counted_tuple(self, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5188 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5189 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5190 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5191 case TUPLE2: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5192 if (load_counted_tuple(self, 2) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5193 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5194 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5195 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5196 case TUPLE3: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5197 if (load_counted_tuple(self, 3) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5198 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5199 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5200 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5201 case TUPLE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5202 if (load_tuple(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5203 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5204 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5205 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5206 case EMPTY_LIST: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5207 if (load_empty_list(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5208 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5209 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5210 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5211 case LIST: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5212 if (load_list(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5213 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5214 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5215 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5216 case EMPTY_DICT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5217 if (load_empty_dict(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5218 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5219 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5220 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5221 case DICT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5222 if (load_dict(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5223 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5224 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5225 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5226 case OBJ: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5227 if (noload_obj(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5228 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5229 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5230 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5231 case INST: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5232 if (noload_inst(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5233 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5234 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5235 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5236 case NEWOBJ: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5237 if (noload_newobj(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5238 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5239 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5240 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5241 case GLOBAL: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5242 if (noload_global(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5243 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5244 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5245 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5246 case APPEND: |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
5247 if (noload_append(self) < 0) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5248 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5249 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5250 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5251 case APPENDS: |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
5252 if (noload_appends(self) < 0) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5253 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5254 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5255 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5256 case BUILD: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5257 if (noload_build(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5258 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5259 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5260 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5261 case DUP: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5262 if (load_dup(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5263 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5264 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5265 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5266 case BINGET: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5267 if (load_binget(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5268 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5269 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5270 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5271 case LONG_BINGET: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5272 if (load_long_binget(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5273 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5274 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5275 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5276 case GET: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5277 if (load_get(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5278 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5279 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5280 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5281 case EXT1: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5282 if (noload_extension(self, 1) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5283 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5284 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5285 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5286 case EXT2: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5287 if (noload_extension(self, 2) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5288 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5289 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5290 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5291 case EXT4: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5292 if (noload_extension(self, 4) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5293 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5294 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5295 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5296 case MARK: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5297 if (load_mark(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5298 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5299 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5300 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5301 case BINPUT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5302 if (load_binput(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5303 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5304 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5305 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5306 case LONG_BINPUT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5307 if (load_long_binput(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5308 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5309 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5310 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5311 case PUT: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5312 if (load_put(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5313 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5314 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5315 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5316 case POP: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5317 if (load_pop(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5318 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5319 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5320 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5321 case POP_MARK: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5322 if (load_pop_mark(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5323 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5324 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5325 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5326 case SETITEM: |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
5327 if (noload_setitem(self) < 0) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5328 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5329 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5330 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5331 case SETITEMS: |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61196
diff
changeset
|
5332 if (noload_setitems(self) < 0) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5333 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5334 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5335 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5336 case STOP: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5337 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5338 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5339 case PERSID: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5340 if (load_persid(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5341 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5342 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5343 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5344 case BINPERSID: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5345 if (load_binpersid(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5346 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5347 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5348 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5349 case REDUCE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5350 if (noload_reduce(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5351 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5352 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5353 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5354 case PROTO: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5355 if (load_proto(self) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5356 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5357 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5358 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5359 case NEWTRUE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5360 if (load_bool(self, Py_True) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5361 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5362 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5363 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5364 case NEWFALSE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5365 if (load_bool(self, Py_False) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5366 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5367 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5368 default: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5369 cPickle_ErrFormat(UnpicklingError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5370 "invalid load key, '%s'.", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5371 "c", s[0]); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5372 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5373 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5374 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5375 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5376 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5377 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5378 if ((err = PyErr_Occurred())) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5379 if (err == PyExc_EOFError) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5380 PyErr_SetNone(PyExc_EOFError); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5381 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5382 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5383 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5384 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5385 PDATA_POP(self->stack, val); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5386 return val; |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5387 } |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
5388 |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5389 |
| 4907 | 5390 static PyObject * |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
38431
diff
changeset
|
5391 Unpickler_load(Unpicklerobject *self, PyObject *unused) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5392 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5393 return load(self); |
| 4907 | 5394 } |
| 5395 | |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5396 static PyObject * |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
38431
diff
changeset
|
5397 Unpickler_noload(Unpicklerobject *self, PyObject *unused) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5398 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5399 return noload(self); |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5400 } |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5401 |
| 4907 | 5402 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5403 static struct PyMethodDef Unpickler_methods[] = { |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
38431
diff
changeset
|
5404 {"load", (PyCFunction)Unpickler_load, METH_NOARGS, |
|
24796
de71e6fe64b0
Allow more docstrings to be removed during compilation in some modules
Neal Norwitz <nnorwitz@gmail.com>
parents:
24532
diff
changeset
|
5405 PyDoc_STR("load() -- Load a pickle") |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5406 }, |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
38431
diff
changeset
|
5407 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS, |
|
24796
de71e6fe64b0
Allow more docstrings to be removed during compilation in some modules
Neal Norwitz <nnorwitz@gmail.com>
parents:
24532
diff
changeset
|
5408 PyDoc_STR( |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5409 "noload() -- not load a pickle, but go through most of the motions\n" |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5410 "\n" |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5411 "This function can be used to read past a pickle without instantiating\n" |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5412 "any objects or importing any modules. It can also be used to find all\n" |
|
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5413 "persistent references without instantiating any objects or importing\n" |
|
24796
de71e6fe64b0
Allow more docstrings to be removed during compilation in some modules
Neal Norwitz <nnorwitz@gmail.com>
parents:
24532
diff
changeset
|
5414 "any modules.\n") |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5415 }, |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5416 {NULL, NULL} /* sentinel */ |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5417 }; |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5418 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5419 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5420 static Unpicklerobject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
5421 newUnpicklerobject(PyObject *f) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5422 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5423 Unpicklerobject *self; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5424 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5425 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5426 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5427 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5428 self->file = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5429 self->arg = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5430 self->stack = (Pdata*)Pdata_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5431 self->pers_func = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5432 self->last_string = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5433 self->marks = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5434 self->num_marks = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5435 self->marks_size = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5436 self->buf_size = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5437 self->read = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5438 self->readline = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5439 self->find_class = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5440 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5441 if (!( self->memo = PyDict_New())) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5442 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5443 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5444 if (!self->stack) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5445 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5446 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5447 Py_INCREF(f); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5448 self->file = f; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5449 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5450 /* Set read, readline based on type of f */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5451 if (PyFile_Check(f)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5452 self->fp = PyFile_AsFile(f); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5453 if (self->fp == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5454 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5455 "I/O operation on closed file"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5456 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5457 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5458 self->read_func = read_file; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5459 self->readline_func = readline_file; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5460 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5461 else if (PycStringIO_InputCheck(f)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5462 self->fp = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5463 self->read_func = read_cStringIO; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5464 self->readline_func = readline_cStringIO; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5465 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5466 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5467 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5468 self->fp = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5469 self->read_func = read_other; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5470 self->readline_func = readline_other; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5471 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5472 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5473 (self->read = PyObject_GetAttr(f, read_str)))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5474 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5475 PyErr_SetString( PyExc_TypeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5476 "argument must have 'read' and " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5477 "'readline' attributes" ); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5478 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5479 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5480 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5481 PyObject_GC_Track(self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5482 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5483 return self; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5484 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5485 err: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5486 Py_DECREF((PyObject *)self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5487 return NULL; |
| 4907 | 5488 } |
| 5489 | |
| 5490 | |
| 5491 static PyObject * | |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
38431
diff
changeset
|
5492 get_Unpickler(PyObject *self, PyObject *file) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5493 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5494 return (PyObject *)newUnpicklerobject(file); |
| 4907 | 5495 } |
| 5496 | |
| 5497 | |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5498 static void |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
5499 Unpickler_dealloc(Unpicklerobject *self) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5500 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5501 PyObject_GC_UnTrack((PyObject *)self); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5502 Py_XDECREF(self->readline); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5503 Py_XDECREF(self->read); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5504 Py_XDECREF(self->file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5505 Py_XDECREF(self->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5506 Py_XDECREF(self->stack); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5507 Py_XDECREF(self->pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5508 Py_XDECREF(self->arg); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5509 Py_XDECREF(self->last_string); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5510 Py_XDECREF(self->find_class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5511 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5512 if (self->marks) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5513 free(self->marks); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5514 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5515 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5516 if (self->buf_size) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5517 free(self->buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5518 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5519 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5520 Py_TYPE(self)->tp_free((PyObject *)self); |
| 4907 | 5521 } |
| 5522 | |
|
28568
d08d7b4be532
Make Unpickler objects colletable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28567
diff
changeset
|
5523 static int |
|
d08d7b4be532
Make Unpickler objects colletable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28567
diff
changeset
|
5524 Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg) |
|
d08d7b4be532
Make Unpickler objects colletable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28567
diff
changeset
|
5525 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5526 Py_VISIT(self->readline); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5527 Py_VISIT(self->read); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5528 Py_VISIT(self->file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5529 Py_VISIT(self->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5530 Py_VISIT(self->stack); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5531 Py_VISIT(self->pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5532 Py_VISIT(self->arg); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5533 Py_VISIT(self->last_string); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5534 Py_VISIT(self->find_class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5535 return 0; |
|
28568
d08d7b4be532
Make Unpickler objects colletable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28567
diff
changeset
|
5536 } |
|
d08d7b4be532
Make Unpickler objects colletable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28567
diff
changeset
|
5537 |
|
d08d7b4be532
Make Unpickler objects colletable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28567
diff
changeset
|
5538 static int |
|
d08d7b4be532
Make Unpickler objects colletable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28567
diff
changeset
|
5539 Unpickler_clear(Unpicklerobject *self) |
|
d08d7b4be532
Make Unpickler objects colletable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28567
diff
changeset
|
5540 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5541 Py_CLEAR(self->readline); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5542 Py_CLEAR(self->read); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5543 Py_CLEAR(self->file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5544 Py_CLEAR(self->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5545 Py_CLEAR(self->stack); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5546 Py_CLEAR(self->pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5547 Py_CLEAR(self->arg); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5548 Py_CLEAR(self->last_string); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5549 Py_CLEAR(self->find_class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5550 return 0; |
|
28568
d08d7b4be532
Make Unpickler objects colletable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28567
diff
changeset
|
5551 } |
| 4907 | 5552 |
| 5553 static PyObject * | |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
5554 Unpickler_getattr(Unpicklerobject *self, char *name) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5555 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5556 if (!strcmp(name, "persistent_load")) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5557 if (!self->pers_func) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5558 PyErr_SetString(PyExc_AttributeError, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5559 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5560 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5561 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5562 Py_INCREF(self->pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5563 return self->pers_func; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5564 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5565 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5566 if (!strcmp(name, "find_global")) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5567 if (!self->find_class) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5568 PyErr_SetString(PyExc_AttributeError, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5569 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5570 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5571 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5572 Py_INCREF(self->find_class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5573 return self->find_class; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5574 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5575 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5576 if (!strcmp(name, "memo")) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5577 if (!self->memo) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5578 PyErr_SetString(PyExc_AttributeError, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5579 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5580 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5581 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5582 Py_INCREF(self->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5583 return self->memo; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5584 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5585 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5586 if (!strcmp(name, "UnpicklingError")) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5587 Py_INCREF(UnpicklingError); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5588 return UnpicklingError; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5589 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5590 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5591 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name); |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5592 } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5593 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5594 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5595 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
5596 Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5597 { |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5598 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5599 if (!strcmp(name, "persistent_load")) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5600 Py_XDECREF(self->pers_func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5601 self->pers_func = value; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5602 Py_XINCREF(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5603 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5604 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5605 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5606 if (!strcmp(name, "find_global")) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5607 Py_XDECREF(self->find_class); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5608 self->find_class = value; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5609 Py_XINCREF(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5610 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5611 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5612 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5613 if (! value) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5614 PyErr_SetString(PyExc_TypeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5615 "attribute deletion is not supported"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5616 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5617 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5618 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5619 if (strcmp(name, "memo") == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5620 if (!PyDict_Check(value)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5621 PyErr_SetString(PyExc_TypeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5622 "memo must be a dictionary"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5623 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5624 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5625 Py_XDECREF(self->memo); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5626 self->memo = value; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5627 Py_INCREF(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5628 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5629 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5630 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5631 PyErr_SetString(PyExc_AttributeError, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5632 return -1; |
| 4907 | 5633 } |
| 5634 | |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5635 /* --------------------------------------------------------------------------- |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5636 * Module-level functions. |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5637 */ |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5638 |
|
32829
cbd4ae74890d
Patch #995766: Keyword argument support in cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
32305
diff
changeset
|
5639 /* dump(obj, file, protocol=0). */ |
| 4907 | 5640 static PyObject * |
|
32829
cbd4ae74890d
Patch #995766: Keyword argument support in cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
32305
diff
changeset
|
5641 cpm_dump(PyObject *self, PyObject *args, PyObject *kwds) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5642 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5643 static char *kwlist[] = {"obj", "file", "protocol", NULL}; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5644 PyObject *ob, *file, *res = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5645 Picklerobject *pickler = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5646 int proto = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5647 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5648 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5649 &ob, &file, &proto))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5650 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5651 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5652 if (!( pickler = newPicklerobject(file, proto))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5653 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5654 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5655 if (dump(pickler, ob) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5656 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5657 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5658 Py_INCREF(Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5659 res = Py_None; |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5660 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5661 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5662 Py_XDECREF(pickler); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5663 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5664 return res; |
| 4907 | 5665 } |
| 5666 | |
| 5667 | |
|
32829
cbd4ae74890d
Patch #995766: Keyword argument support in cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
32305
diff
changeset
|
5668 /* dumps(obj, protocol=0). */ |
| 4907 | 5669 static PyObject * |
|
32829
cbd4ae74890d
Patch #995766: Keyword argument support in cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
32305
diff
changeset
|
5670 cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5671 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5672 static char *kwlist[] = {"obj", "protocol", NULL}; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5673 PyObject *ob, *file = 0, *res = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5674 Picklerobject *pickler = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5675 int proto = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5676 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5677 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5678 &ob, &proto))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5679 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5680 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5681 if (!( file = PycStringIO->NewOutput(128))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5682 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5683 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5684 if (!( pickler = newPicklerobject(file, proto))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5685 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5686 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5687 if (dump(pickler, ob) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5688 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5689 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5690 res = PycStringIO->cgetvalue(file); |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5691 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5692 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5693 Py_XDECREF(pickler); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5694 Py_XDECREF(file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5695 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5696 return res; |
|
17062
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
5697 } |
|
33c8680b3b35
SF bug [ #233200 ] cPickle does not use Py_BEGIN_ALLOW_THREADS.
Tim Peters <tim.peters@gmail.com>
parents:
15607
diff
changeset
|
5698 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5699 |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5700 /* load(fileobj). */ |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5701 static PyObject * |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
38431
diff
changeset
|
5702 cpm_load(PyObject *self, PyObject *ob) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5703 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5704 Unpicklerobject *unpickler = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5705 PyObject *res = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5706 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5707 if (!( unpickler = newUnpicklerobject(ob))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5708 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5709 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5710 res = load(unpickler); |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5711 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5712 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5713 Py_XDECREF(unpickler); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5714 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5715 return res; |
| 4907 | 5716 } |
| 5717 | |
| 5718 | |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5719 /* loads(string) */ |
| 4907 | 5720 static PyObject * |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
5721 cpm_loads(PyObject *self, PyObject *args) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5722 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5723 PyObject *ob, *file = 0, *res = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5724 Unpicklerobject *unpickler = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5725 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5726 if (!( PyArg_ParseTuple(args, "S:loads", &ob))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5727 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5728 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5729 if (!( file = PycStringIO->NewInput(ob))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5730 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5731 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5732 if (!( unpickler = newUnpicklerobject(file))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5733 goto finally; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5734 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5735 res = load(unpickler); |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5736 |
|
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5737 finally: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5738 Py_XDECREF(file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5739 Py_XDECREF(unpickler); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5740 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5741 return res; |
| 4907 | 5742 } |
| 5743 | |
| 5744 | |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23332
diff
changeset
|
5745 PyDoc_STRVAR(Unpicklertype__doc__, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23332
diff
changeset
|
5746 "Objects that know how to unpickle"); |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5747 |
| 6774 | 5748 static PyTypeObject Unpicklertype = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41525
diff
changeset
|
5749 PyVarObject_HEAD_INIT(NULL, 0) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5750 "cPickle.Unpickler", /*tp_name*/ |
|
28568
d08d7b4be532
Make Unpickler objects colletable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28567
diff
changeset
|
5751 sizeof(Unpicklerobject), /*tp_basicsize*/ |
|
d08d7b4be532
Make Unpickler objects colletable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28567
diff
changeset
|
5752 0, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5753 (destructor)Unpickler_dealloc, /* tp_dealloc */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5754 0, /* tp_print */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5755 (getattrfunc)Unpickler_getattr, /* tp_getattr */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5756 (setattrfunc)Unpickler_setattr, /* tp_setattr */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5757 0, /* tp_compare */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5758 0, /* tp_repr */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5759 0, /* tp_as_number */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5760 0, /* tp_as_sequence */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5761 0, /* tp_as_mapping */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5762 0, /* tp_hash */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5763 0, /* tp_call */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5764 0, /* tp_str */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5765 0, /* tp_getattro */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5766 0, /* tp_setattro */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5767 0, /* tp_as_buffer */ |
|
28568
d08d7b4be532
Make Unpickler objects colletable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28567
diff
changeset
|
5768 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5769 Unpicklertype__doc__, /* tp_doc */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5770 (traverseproc)Unpickler_traverse, /* tp_traverse */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5771 (inquiry)Unpickler_clear, /* tp_clear */ |
| 6774 | 5772 }; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5773 |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5774 static struct PyMethodDef cPickle_methods[] = { |
|
32829
cbd4ae74890d
Patch #995766: Keyword argument support in cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
32305
diff
changeset
|
5775 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS, |
|
cbd4ae74890d
Patch #995766: Keyword argument support in cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
32305
diff
changeset
|
5776 PyDoc_STR("dump(obj, file, protocol=0) -- " |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5777 "Write an object in pickle format to the given file.\n" |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5778 "\n" |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5779 "See the Pickler docstring for the meaning of optional argument proto.") |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5780 }, |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5781 |
|
32829
cbd4ae74890d
Patch #995766: Keyword argument support in cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
32305
diff
changeset
|
5782 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS, |
|
cbd4ae74890d
Patch #995766: Keyword argument support in cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
32305
diff
changeset
|
5783 PyDoc_STR("dumps(obj, protocol=0) -- " |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5784 "Return a string containing an object in pickle format.\n" |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5785 "\n" |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5786 "See the Pickler docstring for the meaning of optional argument proto.") |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5787 }, |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5788 |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
38431
diff
changeset
|
5789 {"load", (PyCFunction)cpm_load, METH_O, |
|
24796
de71e6fe64b0
Allow more docstrings to be removed during compilation in some modules
Neal Norwitz <nnorwitz@gmail.com>
parents:
24532
diff
changeset
|
5790 PyDoc_STR("load(file) -- Load a pickle from the given file")}, |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5791 |
|
22706
14ebd7610902
Use symbolic METH_VARARGS/METH_OLDARGS instead of 1/0 for ml_flags
Neal Norwitz <nnorwitz@gmail.com>
parents:
22464
diff
changeset
|
5792 {"loads", (PyCFunction)cpm_loads, METH_VARARGS, |
|
24796
de71e6fe64b0
Allow more docstrings to be removed during compilation in some modules
Neal Norwitz <nnorwitz@gmail.com>
parents:
24532
diff
changeset
|
5793 PyDoc_STR("loads(string) -- Load a pickle from the given string")}, |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5794 |
|
32829
cbd4ae74890d
Patch #995766: Keyword argument support in cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
32305
diff
changeset
|
5795 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS, |
|
cbd4ae74890d
Patch #995766: Keyword argument support in cPickle.
Martin v. Löwis <martin@v.loewis.de>
parents:
32305
diff
changeset
|
5796 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n" |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5797 "\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5798 "This takes a file-like object for writing a pickle data stream.\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5799 "The optional proto argument tells the pickler to use the given\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5800 "protocol; supported protocols are 0, 1, 2. The default\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5801 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5802 "only protocol that can be written to a file opened in text\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5803 "mode and read back successfully. When using a protocol higher\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5804 "than 0, make sure the file is opened in binary mode, both when\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5805 "pickling and unpickling.)\n" |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5806 "\n" |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5807 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5808 "more efficient than protocol 1.\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5809 "\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5810 "Specifying a negative protocol version selects the highest\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5811 "protocol version supported. The higher the protocol used, the\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5812 "more recent the version of Python needed to read the pickle\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5813 "produced.\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5814 "\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5815 "The file parameter must have a write() method that accepts a single\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5816 "string argument. It can thus be an open file object, a StringIO\n" |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5817 "object, or any other custom object that meets this interface.\n") |
|
6740
1853b5bc0548
New versions of cPickle and cStringIO, from Jim Fulton's cPickle 1.0b1
Guido van Rossum <guido@python.org>
parents:
6692
diff
changeset
|
5818 }, |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5819 |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
38431
diff
changeset
|
5820 {"Unpickler", (PyCFunction)get_Unpickler, METH_O, |
|
27584
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5821 PyDoc_STR("Unpickler(file) -- Create an unpickler.")}, |
|
65635c72135e
The C pickle now knows how to deal with a proto= argument. Assorted
Tim Peters <tim.peters@gmail.com>
parents:
27580
diff
changeset
|
5822 |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5823 { NULL, NULL } |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5824 }; |
|
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5825 |
| 4907 | 5826 static int |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
5827 init_stuff(PyObject *module_dict) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5828 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5829 PyObject *copyreg, *t, *r; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5830 |
| 22725 | 5831 #define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1; |
|
5281
607fa32fc04a
Jim Fulton's version 2.2.
Guido van Rossum <guido@python.org>
parents:
4958
diff
changeset
|
5832 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5833 if (PyType_Ready(&Unpicklertype) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5834 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5835 if (PyType_Ready(&Picklertype) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5836 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5837 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5838 INIT_STR(__class__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5839 INIT_STR(__getinitargs__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5840 INIT_STR(__dict__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5841 INIT_STR(__getstate__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5842 INIT_STR(__setstate__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5843 INIT_STR(__name__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5844 INIT_STR(__main__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5845 INIT_STR(__reduce__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5846 INIT_STR(__reduce_ex__); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5847 INIT_STR(write); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5848 INIT_STR(append); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5849 INIT_STR(read); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5850 INIT_STR(readline); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5851 INIT_STR(dispatch_table); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5852 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5853 if (!( copyreg = PyImport_ImportModule("copy_reg"))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5854 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5855 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5856 /* This is special because we want to use a different |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5857 one in restricted mode. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5858 dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5859 if (!dispatch_table) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5860 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5861 extension_registry = PyObject_GetAttrString(copyreg, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5862 "_extension_registry"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5863 if (!extension_registry) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5864 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5865 inverted_registry = PyObject_GetAttrString(copyreg, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5866 "_inverted_registry"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5867 if (!inverted_registry) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5868 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5869 extension_cache = PyObject_GetAttrString(copyreg, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5870 "_extension_cache"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5871 if (!extension_cache) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5872 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5873 Py_DECREF(copyreg); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5874 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5875 if (!(empty_tuple = PyTuple_New(0))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5876 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5877 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5878 two_tuple = PyTuple_New(2); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5879 if (two_tuple == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5880 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5881 /* We use this temp container with no regard to refcounts, or to |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5882 * keeping containees alive. Exempt from GC, because we don't |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5883 * want anything looking at two_tuple() by magic. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5884 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5885 PyObject_GC_UnTrack(two_tuple); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5886 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5887 /* Ugh */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5888 if (!( t=PyImport_ImportModule("__builtin__"))) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5889 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5890 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5891 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5892 if (!( t=PyDict_New())) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5893 if (!( r=PyRun_String( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5894 "def __str__(self):\n" |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5895 " return self.args and ('%s' % self.args[0]) or '(what)'\n", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5896 Py_file_input, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5897 module_dict, t) )) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5898 Py_DECREF(r); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5899 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5900 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5901 if (!PickleError) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5902 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5903 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5904 Py_DECREF(t); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5905 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5906 PicklingError = PyErr_NewException("cPickle.PicklingError", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5907 PickleError, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5908 if (!PicklingError) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5909 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5910 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5911 if (!( t=PyDict_New())) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5912 if (!( r=PyRun_String( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5913 "def __str__(self):\n" |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5914 " a=self.args\n" |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5915 " a=a and type(a[0]) or '(what)'\n" |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5916 " return 'Cannot pickle %s objects' % a\n" |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5917 , Py_file_input, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5918 module_dict, t) )) return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5919 Py_DECREF(r); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5920 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5921 if (!( UnpickleableError = PyErr_NewException( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5922 "cPickle.UnpickleableError", PicklingError, t))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5923 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5924 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5925 Py_DECREF(t); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5926 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5927 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5928 PickleError, NULL))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5929 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5930 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5931 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5932 UnpicklingError, NULL))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5933 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5934 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5935 if (PyDict_SetItemString(module_dict, "PickleError", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5936 PickleError) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5937 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5938 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5939 if (PyDict_SetItemString(module_dict, "PicklingError", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5940 PicklingError) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5941 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5942 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5943 if (PyDict_SetItemString(module_dict, "UnpicklingError", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5944 UnpicklingError) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5945 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5946 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5947 if (PyDict_SetItemString(module_dict, "UnpickleableError", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5948 UnpickleableError) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5949 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5950 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5951 if (PyDict_SetItemString(module_dict, "BadPickleGet", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5952 BadPickleGet) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5953 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5954 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5955 PycString_IMPORT; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5956 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5957 return 0; |
| 4907 | 5958 } |
| 5959 | |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5960 #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ |
|
24471
f66b3a3509c7
Excise DL_EXPORT/DL_IMPORT from Modules/*. Required adding a prototype
Mark Hammond <mhammond@skippinet.com.au>
parents:
24302
diff
changeset
|
5961 #define PyMODINIT_FUNC void |
|
10097
f5f1b5e9814a
Jim Fulton: this fixes seg faults with bad pickles like "c".
Guido van Rossum <guido@python.org>
parents:
9948
diff
changeset
|
5962 #endif |
|
24471
f66b3a3509c7
Excise DL_EXPORT/DL_IMPORT from Modules/*. Required adding a prototype
Mark Hammond <mhammond@skippinet.com.au>
parents:
24302
diff
changeset
|
5963 PyMODINIT_FUNC |
|
27578
2f227ff11f5e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
27577
diff
changeset
|
5964 initcPickle(void) |
|
22732
00154a0fde61
Reindent. Break long lines. Move comments before the statements.
Martin v. Löwis <martin@v.loewis.de>
parents:
22725
diff
changeset
|
5965 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5966 PyObject *m, *d, *di, *v, *k; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5967 Py_ssize_t i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5968 char *rev = "1.71"; /* XXX when does this change? */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5969 PyObject *format_version; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5970 PyObject *compatible_formats; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5971 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5972 Py_TYPE(&Picklertype) = &PyType_Type; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5973 Py_TYPE(&Unpicklertype) = &PyType_Type; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5974 Py_TYPE(&PdataType) = &PyType_Type; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5975 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5976 /* Initialize some pieces. We need to do this before module creation, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5977 * so we're forced to use a temporary dictionary. :( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5978 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5979 di = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5980 if (!di) return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5981 if (init_stuff(di) < 0) return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5982 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5983 /* Create the module and add the functions */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5984 m = Py_InitModule4("cPickle", cPickle_methods, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5985 cPickle_module_documentation, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5986 (PyObject*)NULL,PYTHON_API_VERSION); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5987 if (m == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5988 return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5989 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5990 /* Add some symbolic constants to the module */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5991 d = PyModule_GetDict(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5992 v = PyString_FromString(rev); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5993 PyDict_SetItemString(d, "__version__", v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5994 Py_XDECREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5995 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5996 /* Copy data from di. Waaa. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5997 for (i=0; PyDict_Next(di, &i, &k, &v); ) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5998 if (PyObject_SetItem(d, k, v) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
5999 Py_DECREF(di); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6000 return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6001 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6002 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6003 Py_DECREF(di); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6004 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6005 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6006 if (i < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6007 return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6008 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6009 /* These are purely informational; no code uses them. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6010 /* File format version we write. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6011 format_version = PyString_FromString("2.0"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6012 /* Format versions we can read. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6013 compatible_formats = Py_BuildValue("[sssss]", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6014 "1.0", /* Original protocol 0 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6015 "1.1", /* Protocol 0 + INST */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6016 "1.2", /* Original protocol 1 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6017 "1.3", /* Protocol 1 + BINFLOAT */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6018 "2.0"); /* Original protocol 2 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6019 PyDict_SetItemString(d, "format_version", format_version); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6020 PyDict_SetItemString(d, "compatible_formats", compatible_formats); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6021 Py_XDECREF(format_version); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58201
diff
changeset
|
6022 Py_XDECREF(compatible_formats); |
| 4907 | 6023 } |
