Mercurial > cpython-lru_cache-weakref
annotate Lib/pickletools.py @ 78069:a8aa77458e12 3.2
Add c_size_t and c_ssize_t to the ctypes summary table.
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Thu, 12 Jul 2012 20:31:50 +0200 |
| parents | 14695b4825dc |
| children | 98df29d51e12 |
| rev | line source |
|---|---|
| 27518 | 1 '''"Executable documentation" for the pickle module. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
3 Extensive comments about the pickle protocols and pickle-machine opcodes |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
4 can be found here. Some functions meant for external use: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
5 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
6 genops(pickle) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
7 Generate all the opcodes in a pickle, as (opcode, arg, position) triples. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
8 |
|
33004
867fef2b5060
Add argument to docstring
Andrew M. Kuchling <amk@amk.ca>
parents:
27703
diff
changeset
|
9 dis(pickle, out=None, memo=None, indentlevel=4) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
10 Print a symbolic disassembly of a pickle. |
| 27518 | 11 ''' |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
12 |
|
42064
bc90fc9b70b7
Rip out all codecs that can't work in a unicode/bytes world:
Walter Dörwald <walter@livinglogic.de>
parents:
41986
diff
changeset
|
13 import codecs |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
14 import pickle |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
15 import re |
|
42064
bc90fc9b70b7
Rip out all codecs that can't work in a unicode/bytes world:
Walter Dörwald <walter@livinglogic.de>
parents:
41986
diff
changeset
|
16 |
|
45278
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
17 __all__ = ['dis', 'genops', 'optimize'] |
|
33917
25714e0fc89d
Essentially SF patch 1061679: add missing __all__ to pickletools.py.
Tim Peters <tim.peters@gmail.com>
parents:
33004
diff
changeset
|
18 |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
19 bytes_types = pickle.bytes_types |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
20 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
21 # Other ideas: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
22 # |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
23 # - A pickle verifier: read a pickle and check it exhaustively for |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
24 # well-formedness. dis() does a lot of this already. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
25 # |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
26 # - A protocol identifier: examine a pickle and return its protocol number |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
27 # (== the highest .proto attr value among all the opcodes in the pickle). |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
28 # dis() already prints this info at the end. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
29 # |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
30 # - A pickle optimizer: for example, tuple-building code is sometimes more |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
31 # elaborate than necessary, catering for the possibility that the tuple |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
32 # is recursive. Or lots of times a PUT is generated that's never accessed |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
33 # by a later GET. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
34 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
35 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
36 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
37 "A pickle" is a program for a virtual pickle machine (PM, but more accurately |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
38 called an unpickling machine). It's a sequence of opcodes, interpreted by the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
39 PM, building an arbitrarily complex Python object. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
40 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
41 For the most part, the PM is very simple: there are no looping, testing, or |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
42 conditional instructions, no arithmetic and no function calls. Opcodes are |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
43 executed once each, from first to last, until a STOP opcode is reached. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
44 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
45 The PM has two data areas, "the stack" and "the memo". |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
46 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
47 Many opcodes push Python objects onto the stack; e.g., INT pushes a Python |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
48 integer object on the stack, whose value is gotten from a decimal string |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
49 literal immediately following the INT opcode in the pickle bytestream. Other |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
50 opcodes take Python objects off the stack. The result of unpickling is |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
51 whatever object is left on the stack when the final STOP opcode is executed. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
52 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
53 The memo is simply an array of objects, or it can be implemented as a dict |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
54 mapping little integers to objects. The memo serves as the PM's "long term |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
55 memory", and the little integers indexing the memo are akin to variable |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
56 names. Some opcodes pop a stack object into the memo at a given index, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
57 and others push a memo object at a given index onto the stack again. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
58 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
59 At heart, that's all the PM has. Subtleties arise for these reasons: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
60 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
61 + Object identity. Objects can be arbitrarily complex, and subobjects |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
62 may be shared (for example, the list [a, a] refers to the same object a |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
63 twice). It can be vital that unpickling recreate an isomorphic object |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
64 graph, faithfully reproducing sharing. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
65 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
66 + Recursive objects. For example, after "L = []; L.append(L)", L is a |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
67 list, and L[0] is the same list. This is related to the object identity |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
68 point, and some sequences of pickle opcodes are subtle in order to |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
69 get the right result in all cases. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
70 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
71 + Things pickle doesn't know everything about. Examples of things pickle |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
72 does know everything about are Python's builtin scalar and container |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
73 types, like ints and tuples. They generally have opcodes dedicated to |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
74 them. For things like module references and instances of user-defined |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
75 classes, pickle's knowledge is limited. Historically, many enhancements |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
76 have been made to the pickle protocol in order to do a better (faster, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
77 and/or more compact) job on those. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
78 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
79 + Backward compatibility and micro-optimization. As explained below, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
80 pickle opcodes never go away, not even when better ways to do a thing |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
81 get invented. The repertoire of the PM just keeps growing over time. |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
82 For example, protocol 0 had two opcodes for building Python integers (INT |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
83 and LONG), protocol 1 added three more for more-efficient pickling of short |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
84 integers, and protocol 2 added two more for more-efficient pickling of |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
85 long integers (before protocol 2, the only ways to pickle a Python long |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
86 took time quadratic in the number of digits, for both pickling and |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
87 unpickling). "Opcode bloat" isn't so much a subtlety as a source of |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
88 wearying complication. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
89 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
90 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
91 Pickle protocols: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
92 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
93 For compatibility, the meaning of a pickle opcode never changes. Instead new |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
94 pickle opcodes get added, and each version's unpickler can handle all the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
95 pickle opcodes in all protocol versions to date. So old pickles continue to |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
96 be readable forever. The pickler can generally be told to restrict itself to |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
97 the subset of opcodes available under previous protocol versions too, so that |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
98 users can create pickles under the current version readable by older |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
99 versions. However, a pickle does not contain its version number embedded |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
100 within it. If an older unpickler tries to read a pickle using a later |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
101 protocol, the result is most likely an exception due to seeing an unknown (in |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
102 the older unpickler) opcode. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
103 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
104 The original pickle used what's now called "protocol 0", and what was called |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
105 "text mode" before Python 2.3. The entire pickle bytestream is made up of |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
106 printable 7-bit ASCII characters, plus the newline character, in protocol 0. |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
107 That's why it was called text mode. Protocol 0 is small and elegant, but |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
108 sometimes painfully inefficient. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
109 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
110 The second major set of additions is now called "protocol 1", and was called |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
111 "binary mode" before Python 2.3. This added many opcodes with arguments |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
112 consisting of arbitrary bytes, including NUL bytes and unprintable "high bit" |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
113 bytes. Binary mode pickles can be substantially smaller than equivalent |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
114 text mode pickles, and sometimes faster too; e.g., BININT represents a 4-byte |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
115 int as 4 bytes following the opcode, which is cheaper to unpickle than the |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
116 (perhaps) 11-character decimal string attached to INT. Protocol 1 also added |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
117 a number of opcodes that operate on many stack elements at once (like APPENDS |
| 27463 | 118 and SETITEMS), and "shortcut" opcodes (like EMPTY_DICT and EMPTY_TUPLE). |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
119 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
120 The third major set of additions came in Python 2.3, and is called "protocol |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
121 2". This added: |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
122 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
123 - A better way to pickle instances of new-style classes (NEWOBJ). |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
124 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
125 - A way for a pickle to identify its protocol (PROTO). |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
126 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
127 - Time- and space- efficient pickling of long ints (LONG{1,4}). |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
128 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
129 - Shortcuts for small tuples (TUPLE{1,2,3}}. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
130 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
131 - Dedicated opcodes for bools (NEWTRUE, NEWFALSE). |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
132 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
133 - The "extension registry", a vector of popular objects that can be pushed |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
134 efficiently by index (EXT{1,2,4}). This is akin to the memo and GET, but |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
135 the registry contents are predefined (there's nothing akin to the memo's |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
136 PUT). |
|
27513
b1d1fe7fb514
Document the demise of all pretenses of safety, and the difference
Guido van Rossum <guido@python.org>
parents:
27507
diff
changeset
|
137 |
| 27518 | 138 Another independent change with Python 2.3 is the abandonment of any |
| 139 pretense that it might be safe to load pickles received from untrusted | |
|
27513
b1d1fe7fb514
Document the demise of all pretenses of safety, and the difference
Guido van Rossum <guido@python.org>
parents:
27507
diff
changeset
|
140 parties -- no sufficient security analysis has been done to guarantee |
| 27518 | 141 this and there isn't a use case that warrants the expense of such an |
|
27513
b1d1fe7fb514
Document the demise of all pretenses of safety, and the difference
Guido van Rossum <guido@python.org>
parents:
27507
diff
changeset
|
142 analysis. |
|
b1d1fe7fb514
Document the demise of all pretenses of safety, and the difference
Guido van Rossum <guido@python.org>
parents:
27507
diff
changeset
|
143 |
|
b1d1fe7fb514
Document the demise of all pretenses of safety, and the difference
Guido van Rossum <guido@python.org>
parents:
27507
diff
changeset
|
144 To this end, all tests for __safe_for_unpickling__ or for |
|
46867
dd5513b472dc
Rename copy_reg module to copyreg.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
45812
diff
changeset
|
145 copyreg.safe_constructors are removed from the unpickling code. |
|
27513
b1d1fe7fb514
Document the demise of all pretenses of safety, and the difference
Guido van Rossum <guido@python.org>
parents:
27507
diff
changeset
|
146 References to these variables in the descriptions below are to be seen |
|
b1d1fe7fb514
Document the demise of all pretenses of safety, and the difference
Guido van Rossum <guido@python.org>
parents:
27507
diff
changeset
|
147 as describing unpickling in Python 2.2 and before. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
148 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
149 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
150 # Meta-rule: Descriptions are stored in instances of descriptor objects, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
151 # with plain constructors. No meta-language is defined from which |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
152 # descriptors could be constructed. If you want, e.g., XML, write a little |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
153 # program to generate XML from the objects. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
154 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
155 ############################################################################## |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
156 # Some pickle opcodes have an argument, following the opcode in the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
157 # bytestream. An argument is of a specific type, described by an instance |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
158 # of ArgumentDescriptor. These are not to be confused with arguments taken |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
159 # off the stack -- ArgumentDescriptor applies only to arguments embedded in |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
160 # the opcode stream, immediately following an opcode. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
161 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
162 # Represents the number of bytes consumed by an argument delimited by the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
163 # next newline character. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
164 UP_TO_NEWLINE = -1 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
165 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
166 # Represents the number of bytes consumed by a two-argument opcode where |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
167 # the first argument gives the number of bytes in the second argument. |
|
27435
430ed1c8e071
Removed the new LONG2 opcode: it's extravagant. If LONG1 isn't enough,
Tim Peters <tim.peters@gmail.com>
parents:
27434
diff
changeset
|
168 TAKEN_FROM_ARGUMENT1 = -2 # num bytes is 1-byte unsigned int |
|
430ed1c8e071
Removed the new LONG2 opcode: it's extravagant. If LONG1 isn't enough,
Tim Peters <tim.peters@gmail.com>
parents:
27434
diff
changeset
|
169 TAKEN_FROM_ARGUMENT4 = -3 # num bytes is 4-byte signed little-endian int |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
170 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
171 class ArgumentDescriptor(object): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
172 __slots__ = ( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
173 # name of descriptor record, also a module global name; a string |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
174 'name', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
175 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
176 # length of argument, in bytes; an int; UP_TO_NEWLINE and |
|
27435
430ed1c8e071
Removed the new LONG2 opcode: it's extravagant. If LONG1 isn't enough,
Tim Peters <tim.peters@gmail.com>
parents:
27434
diff
changeset
|
177 # TAKEN_FROM_ARGUMENT{1,4} are negative values for variable-length |
|
430ed1c8e071
Removed the new LONG2 opcode: it's extravagant. If LONG1 isn't enough,
Tim Peters <tim.peters@gmail.com>
parents:
27434
diff
changeset
|
178 # cases |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
179 'n', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
180 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
181 # a function taking a file-like object, reading this kind of argument |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
182 # from the object at the current position, advancing the current |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
183 # position by n bytes, and returning the value of the argument |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
184 'reader', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
185 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
186 # human-readable docs for this arg descriptor; a string |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
187 'doc', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
188 ) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
189 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
190 def __init__(self, name, n, reader, doc): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
191 assert isinstance(name, str) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
192 self.name = name |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
193 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
194 assert isinstance(n, int) and (n >= 0 or |
|
27435
430ed1c8e071
Removed the new LONG2 opcode: it's extravagant. If LONG1 isn't enough,
Tim Peters <tim.peters@gmail.com>
parents:
27434
diff
changeset
|
195 n in (UP_TO_NEWLINE, |
|
430ed1c8e071
Removed the new LONG2 opcode: it's extravagant. If LONG1 isn't enough,
Tim Peters <tim.peters@gmail.com>
parents:
27434
diff
changeset
|
196 TAKEN_FROM_ARGUMENT1, |
|
430ed1c8e071
Removed the new LONG2 opcode: it's extravagant. If LONG1 isn't enough,
Tim Peters <tim.peters@gmail.com>
parents:
27434
diff
changeset
|
197 TAKEN_FROM_ARGUMENT4)) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
198 self.n = n |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
199 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
200 self.reader = reader |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
201 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
202 assert isinstance(doc, str) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
203 self.doc = doc |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
204 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
205 from struct import unpack as _unpack |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
206 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
207 def read_uint1(f): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
208 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
209 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
210 >>> read_uint1(io.BytesIO(b'\xff')) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
211 255 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
212 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
213 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
214 data = f.read(1) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
215 if data: |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
216 return data[0] |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
217 raise ValueError("not enough data in stream to read uint1") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
218 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
219 uint1 = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
220 name='uint1', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
221 n=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
222 reader=read_uint1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
223 doc="One-byte unsigned integer.") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
224 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
225 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
226 def read_uint2(f): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
227 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
228 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
229 >>> read_uint2(io.BytesIO(b'\xff\x00')) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
230 255 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
231 >>> read_uint2(io.BytesIO(b'\xff\xff')) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
232 65535 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
233 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
234 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
235 data = f.read(2) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
236 if len(data) == 2: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
237 return _unpack("<H", data)[0] |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
238 raise ValueError("not enough data in stream to read uint2") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
239 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
240 uint2 = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
241 name='uint2', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
242 n=2, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
243 reader=read_uint2, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
244 doc="Two-byte unsigned integer, little-endian.") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
245 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
246 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
247 def read_int4(f): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
248 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
249 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
250 >>> read_int4(io.BytesIO(b'\xff\x00\x00\x00')) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
251 255 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
252 >>> read_int4(io.BytesIO(b'\x00\x00\x00\x80')) == -(2**31) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
253 True |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
254 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
255 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
256 data = f.read(4) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
257 if len(data) == 4: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
258 return _unpack("<i", data)[0] |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
259 raise ValueError("not enough data in stream to read int4") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
260 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
261 int4 = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
262 name='int4', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
263 n=4, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
264 reader=read_int4, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
265 doc="Four-byte signed integer, little-endian, 2's complement.") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
266 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
267 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
268 def read_stringnl(f, decode=True, stripquotes=True): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
269 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
270 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
271 >>> read_stringnl(io.BytesIO(b"'abcd'\nefg\n")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
272 'abcd' |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
273 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
274 >>> read_stringnl(io.BytesIO(b"\n")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
275 Traceback (most recent call last): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
276 ... |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
277 ValueError: no string quotes around b'' |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
278 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
279 >>> read_stringnl(io.BytesIO(b"\n"), stripquotes=False) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
280 '' |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
281 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
282 >>> read_stringnl(io.BytesIO(b"''\n")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
283 '' |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
284 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
285 >>> read_stringnl(io.BytesIO(b'"abcd"')) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
286 Traceback (most recent call last): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
287 ... |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
288 ValueError: no newline found when trying to read stringnl |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
289 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
290 Embedded escapes are undone in the result. |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
291 >>> read_stringnl(io.BytesIO(br"'a\n\\b\x00c\td'" + b"\n'e'")) |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
292 'a\n\\b\x00c\td' |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
293 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
294 |
|
42295
5337c3a4a273
Make test_pickletools.py pass.
Guido van Rossum <guido@python.org>
parents:
42064
diff
changeset
|
295 data = f.readline() |
|
42919
c72a3cc21ef7
More str/bytes fixes.
Guido van Rossum <guido@python.org>
parents:
42501
diff
changeset
|
296 if not data.endswith(b'\n'): |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
297 raise ValueError("no newline found when trying to read stringnl") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
298 data = data[:-1] # lose the newline |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
299 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
300 if stripquotes: |
|
42919
c72a3cc21ef7
More str/bytes fixes.
Guido van Rossum <guido@python.org>
parents:
42501
diff
changeset
|
301 for q in (b'"', b"'"): |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
302 if data.startswith(q): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
303 if not data.endswith(q): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
304 raise ValueError("strinq quote %r not found at both " |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
305 "ends of %r" % (q, data)) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
306 data = data[1:-1] |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
307 break |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
308 else: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
309 raise ValueError("no string quotes around %r" % data) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
310 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
311 if decode: |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
312 data = codecs.escape_decode(data)[0].decode("ascii") |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
313 return data |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
314 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
315 stringnl = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
316 name='stringnl', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
317 n=UP_TO_NEWLINE, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
318 reader=read_stringnl, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
319 doc="""A newline-terminated string. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
320 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
321 This is a repr-style string, with embedded escapes, and |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
322 bracketing quotes. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
323 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
324 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
325 def read_stringnl_noescape(f): |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
326 return read_stringnl(f, stripquotes=False) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
327 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
328 stringnl_noescape = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
329 name='stringnl_noescape', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
330 n=UP_TO_NEWLINE, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
331 reader=read_stringnl_noescape, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
332 doc="""A newline-terminated string. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
333 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
334 This is a str-style string, without embedded escapes, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
335 or bracketing quotes. It should consist solely of |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
336 printable ASCII characters. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
337 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
338 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
339 def read_stringnl_noescape_pair(f): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
340 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
341 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
342 >>> read_stringnl_noescape_pair(io.BytesIO(b"Queue\nEmpty\njunk")) |
|
27422
24c8fbec761f
stringnl_noescape_pair(): changed the reader to separate the two
Tim Peters <tim.peters@gmail.com>
parents:
27421
diff
changeset
|
343 'Queue Empty' |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
344 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
345 |
|
27422
24c8fbec761f
stringnl_noescape_pair(): changed the reader to separate the two
Tim Peters <tim.peters@gmail.com>
parents:
27421
diff
changeset
|
346 return "%s %s" % (read_stringnl_noescape(f), read_stringnl_noescape(f)) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
347 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
348 stringnl_noescape_pair = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
349 name='stringnl_noescape_pair', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
350 n=UP_TO_NEWLINE, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
351 reader=read_stringnl_noescape_pair, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
352 doc="""A pair of newline-terminated strings. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
353 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
354 These are str-style strings, without embedded |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
355 escapes, or bracketing quotes. They should |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
356 consist solely of printable ASCII characters. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
357 The pair is returned as a single string, with |
|
27422
24c8fbec761f
stringnl_noescape_pair(): changed the reader to separate the two
Tim Peters <tim.peters@gmail.com>
parents:
27421
diff
changeset
|
358 a single blank separating the two strings. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
359 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
360 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
361 def read_string4(f): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
362 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
363 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
364 >>> read_string4(io.BytesIO(b"\x00\x00\x00\x00abc")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
365 '' |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
366 >>> read_string4(io.BytesIO(b"\x03\x00\x00\x00abcdef")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
367 'abc' |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
368 >>> read_string4(io.BytesIO(b"\x00\x00\x00\x03abcdef")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
369 Traceback (most recent call last): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
370 ... |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
371 ValueError: expected 50331648 bytes in a string4, but only 6 remain |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
372 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
373 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
374 n = read_int4(f) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
375 if n < 0: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
376 raise ValueError("string4 byte count < 0: %d" % n) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
377 data = f.read(n) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
378 if len(data) == n: |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
379 return data.decode("latin-1") |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
380 raise ValueError("expected %d bytes in a string4, but only %d remain" % |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
381 (n, len(data))) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
382 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
383 string4 = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
384 name="string4", |
|
27435
430ed1c8e071
Removed the new LONG2 opcode: it's extravagant. If LONG1 isn't enough,
Tim Peters <tim.peters@gmail.com>
parents:
27434
diff
changeset
|
385 n=TAKEN_FROM_ARGUMENT4, |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
386 reader=read_string4, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
387 doc="""A counted string. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
388 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
389 The first argument is a 4-byte little-endian signed int giving |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
390 the number of bytes in the string, and the second argument is |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
391 that many bytes. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
392 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
393 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
394 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
395 def read_string1(f): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
396 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
397 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
398 >>> read_string1(io.BytesIO(b"\x00")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
399 '' |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
400 >>> read_string1(io.BytesIO(b"\x03abcdef")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
401 'abc' |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
402 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
403 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
404 n = read_uint1(f) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
405 assert n >= 0 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
406 data = f.read(n) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
407 if len(data) == n: |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
408 return data.decode("latin-1") |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
409 raise ValueError("expected %d bytes in a string1, but only %d remain" % |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
410 (n, len(data))) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
411 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
412 string1 = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
413 name="string1", |
|
27435
430ed1c8e071
Removed the new LONG2 opcode: it's extravagant. If LONG1 isn't enough,
Tim Peters <tim.peters@gmail.com>
parents:
27434
diff
changeset
|
414 n=TAKEN_FROM_ARGUMENT1, |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
415 reader=read_string1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
416 doc="""A counted string. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
417 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
418 The first argument is a 1-byte unsigned int giving the number |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
419 of bytes in the string, and the second argument is that many |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
420 bytes. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
421 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
422 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
423 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
424 def read_unicodestringnl(f): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
425 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
426 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
427 >>> read_unicodestringnl(io.BytesIO(b"abc\\uabcd\njunk")) == 'abc\uabcd' |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
428 True |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
429 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
430 |
|
42295
5337c3a4a273
Make test_pickletools.py pass.
Guido van Rossum <guido@python.org>
parents:
42064
diff
changeset
|
431 data = f.readline() |
|
42919
c72a3cc21ef7
More str/bytes fixes.
Guido van Rossum <guido@python.org>
parents:
42501
diff
changeset
|
432 if not data.endswith(b'\n'): |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
433 raise ValueError("no newline found when trying to read " |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
434 "unicodestringnl") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
435 data = data[:-1] # lose the newline |
|
41575
beacf40b5960
Rip out all the u"..." literals and calls to unicode().
Guido van Rossum <guido@python.org>
parents:
40930
diff
changeset
|
436 return str(data, 'raw-unicode-escape') |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
437 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
438 unicodestringnl = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
439 name='unicodestringnl', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
440 n=UP_TO_NEWLINE, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
441 reader=read_unicodestringnl, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
442 doc="""A newline-terminated Unicode string. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
443 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
444 This is raw-unicode-escape encoded, so consists of |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
445 printable ASCII characters, and may contain embedded |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
446 escape sequences. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
447 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
448 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
449 def read_unicodestring4(f): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
450 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
451 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
452 >>> s = 'abcd\uabcd' |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
453 >>> enc = s.encode('utf-8') |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
454 >>> enc |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
455 b'abcd\xea\xaf\x8d' |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
456 >>> n = bytes([len(enc), 0, 0, 0]) # little-endian 4-byte length |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
457 >>> t = read_unicodestring4(io.BytesIO(n + enc + b'junk')) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
458 >>> s == t |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
459 True |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
460 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
461 >>> read_unicodestring4(io.BytesIO(n + enc[:-1])) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
462 Traceback (most recent call last): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
463 ... |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
464 ValueError: expected 7 bytes in a unicodestring4, but only 6 remain |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
465 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
466 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
467 n = read_int4(f) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
468 if n < 0: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
469 raise ValueError("unicodestring4 byte count < 0: %d" % n) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
470 data = f.read(n) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
471 if len(data) == n: |
|
60577
7994269ad3a1
Issue #8383: pickle and pickletools use surrogatepass error handler when
Victor Stinner <victor.stinner@haypocalc.com>
parents:
54584
diff
changeset
|
472 return str(data, 'utf-8', 'surrogatepass') |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
473 raise ValueError("expected %d bytes in a unicodestring4, but only %d " |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
474 "remain" % (n, len(data))) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
475 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
476 unicodestring4 = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
477 name="unicodestring4", |
|
27435
430ed1c8e071
Removed the new LONG2 opcode: it's extravagant. If LONG1 isn't enough,
Tim Peters <tim.peters@gmail.com>
parents:
27434
diff
changeset
|
478 n=TAKEN_FROM_ARGUMENT4, |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
479 reader=read_unicodestring4, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
480 doc="""A counted Unicode string. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
481 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
482 The first argument is a 4-byte little-endian signed int |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
483 giving the number of bytes in the string, and the second |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
484 argument-- the UTF-8 encoding of the Unicode string -- |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
485 contains that many bytes. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
486 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
487 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
488 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
489 def read_decimalnl_short(f): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
490 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
491 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
492 >>> read_decimalnl_short(io.BytesIO(b"1234\n56")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
493 1234 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
494 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
495 >>> read_decimalnl_short(io.BytesIO(b"1234L\n56")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
496 Traceback (most recent call last): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
497 ... |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
498 ValueError: trailing 'L' not allowed in b'1234L' |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
499 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
500 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
501 s = read_stringnl(f, decode=False, stripquotes=False) |
|
42919
c72a3cc21ef7
More str/bytes fixes.
Guido van Rossum <guido@python.org>
parents:
42501
diff
changeset
|
502 if s.endswith(b"L"): |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
503 raise ValueError("trailing 'L' not allowed in %r" % s) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
504 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
505 # It's not necessarily true that the result fits in a Python short int: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
506 # the pickle may have been written on a 64-bit box. There's also a hack |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
507 # for True and False here. |
|
43003
cd80eb989728
Change string literals to bytes, since they are compared to bytes.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
42919
diff
changeset
|
508 if s == b"00": |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
509 return False |
|
43003
cd80eb989728
Change string literals to bytes, since they are compared to bytes.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
42919
diff
changeset
|
510 elif s == b"01": |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
511 return True |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
512 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
513 try: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
514 return int(s) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
515 except OverflowError: |
|
40644
1c26505c1de6
Rip out 'long' and 'L'-suffixed integer literals.
Guido van Rossum <guido@python.org>
parents:
40640
diff
changeset
|
516 return int(s) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
517 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
518 def read_decimalnl_long(f): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
519 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
520 >>> import io |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
521 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
522 >>> read_decimalnl_long(io.BytesIO(b"1234L\n56")) |
|
39575
63237fcefd99
Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents:
38397
diff
changeset
|
523 1234 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
524 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
525 >>> read_decimalnl_long(io.BytesIO(b"123456789012345678901234L\n6")) |
|
39575
63237fcefd99
Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents:
38397
diff
changeset
|
526 123456789012345678901234 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
527 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
528 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
529 s = read_stringnl(f, decode=False, stripquotes=False) |
|
50946
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
530 if s[-1:] == b'L': |
|
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
531 s = s[:-1] |
|
40644
1c26505c1de6
Rip out 'long' and 'L'-suffixed integer literals.
Guido van Rossum <guido@python.org>
parents:
40640
diff
changeset
|
532 return int(s) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
533 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
534 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
535 decimalnl_short = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
536 name='decimalnl_short', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
537 n=UP_TO_NEWLINE, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
538 reader=read_decimalnl_short, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
539 doc="""A newline-terminated decimal integer literal. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
540 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
541 This never has a trailing 'L', and the integer fit |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
542 in a short Python int on the box where the pickle |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
543 was written -- but there's no guarantee it will fit |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
544 in a short Python int on the box where the pickle |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
545 is read. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
546 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
547 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
548 decimalnl_long = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
549 name='decimalnl_long', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
550 n=UP_TO_NEWLINE, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
551 reader=read_decimalnl_long, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
552 doc="""A newline-terminated decimal integer literal. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
553 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
554 This has a trailing 'L', and can represent integers |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
555 of any size. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
556 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
557 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
558 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
559 def read_floatnl(f): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
560 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
561 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
562 >>> read_floatnl(io.BytesIO(b"-1.25\n6")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
563 -1.25 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
564 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
565 s = read_stringnl(f, decode=False, stripquotes=False) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
566 return float(s) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
567 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
568 floatnl = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
569 name='floatnl', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
570 n=UP_TO_NEWLINE, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
571 reader=read_floatnl, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
572 doc="""A newline-terminated decimal floating literal. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
573 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
574 In general this requires 17 significant digits for roundtrip |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
575 identity, and pickling then unpickling infinities, NaNs, and |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
576 minus zero doesn't work across boxes, or on some boxes even |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
577 on itself (e.g., Windows can't read the strings it produces |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
578 for infinities or NaNs). |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
579 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
580 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
581 def read_float8(f): |
|
27473
154bac0b26a5
Use raw-mode docstring whenever there's an escape code in an example --
Tim Peters <tim.peters@gmail.com>
parents:
27472
diff
changeset
|
582 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
583 >>> import io, struct |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
584 >>> raw = struct.pack(">d", -1.25) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
585 >>> raw |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
586 b'\xbf\xf4\x00\x00\x00\x00\x00\x00' |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
587 >>> read_float8(io.BytesIO(raw + b"\n")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
588 -1.25 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
589 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
590 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
591 data = f.read(8) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
592 if len(data) == 8: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
593 return _unpack(">d", data)[0] |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
594 raise ValueError("not enough data in stream to read float8") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
595 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
596 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
597 float8 = ArgumentDescriptor( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
598 name='float8', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
599 n=8, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
600 reader=read_float8, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
601 doc="""An 8-byte binary representation of a float, big-endian. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
602 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
603 The format is unique to Python, and shared with the struct |
|
42322
3e33215c66ed
Getting rid of cPickle. Mmm, feels good!
Guido van Rossum <guido@python.org>
parents:
42295
diff
changeset
|
604 module (format string '>d') "in theory" (the struct and pickle |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
605 implementations don't share the code -- they should). It's |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
606 strongly related to the IEEE-754 double format, and, in normal |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
607 cases, is in fact identical to the big-endian 754 double format. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
608 On other boxes the dynamic range is limited to that of a 754 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
609 double, and "add a half and chop" rounding is used to reduce |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
610 the precision to 53 bits. However, even on a 754 box, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
611 infinities, NaNs, and minus zero may not be handled correctly |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
612 (may not survive roundtrip pickling intact). |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
613 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
614 |
|
27429
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
615 # Protocol 2 formats |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
616 |
|
27506
b480a4f707f6
pickle: Comment repair.
Tim Peters <tim.peters@gmail.com>
parents:
27473
diff
changeset
|
617 from pickle import decode_long |
|
27429
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
618 |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
619 def read_long1(f): |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
620 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
621 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
622 >>> read_long1(io.BytesIO(b"\x00")) |
|
39575
63237fcefd99
Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents:
38397
diff
changeset
|
623 0 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
624 >>> read_long1(io.BytesIO(b"\x02\xff\x00")) |
|
39575
63237fcefd99
Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents:
38397
diff
changeset
|
625 255 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
626 >>> read_long1(io.BytesIO(b"\x02\xff\x7f")) |
|
39575
63237fcefd99
Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents:
38397
diff
changeset
|
627 32767 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
628 >>> read_long1(io.BytesIO(b"\x02\x00\xff")) |
|
39575
63237fcefd99
Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents:
38397
diff
changeset
|
629 -256 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
630 >>> read_long1(io.BytesIO(b"\x02\x00\x80")) |
|
39575
63237fcefd99
Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents:
38397
diff
changeset
|
631 -32768 |
|
27429
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
632 """ |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
633 |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
634 n = read_uint1(f) |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
635 data = f.read(n) |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
636 if len(data) != n: |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
637 raise ValueError("not enough data in stream to read long1") |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
638 return decode_long(data) |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
639 |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
640 long1 = ArgumentDescriptor( |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
641 name="long1", |
|
27435
430ed1c8e071
Removed the new LONG2 opcode: it's extravagant. If LONG1 isn't enough,
Tim Peters <tim.peters@gmail.com>
parents:
27434
diff
changeset
|
642 n=TAKEN_FROM_ARGUMENT1, |
|
27429
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
643 reader=read_long1, |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
644 doc="""A binary long, little-endian, using 1-byte size. |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
645 |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
646 This first reads one byte as an unsigned size, then reads that |
|
27434
7116cb5bac50
Documented the 2's-comp business for the new long opcodes.
Tim Peters <tim.peters@gmail.com>
parents:
27433
diff
changeset
|
647 many bytes and interprets them as a little-endian 2's-complement long. |
|
27552
50c734250e05
It's Official: for LONG1/LONG4, a "byte count" of 0 is taken as a
Tim Peters <tim.peters@gmail.com>
parents:
27535
diff
changeset
|
648 If the size is 0, that's taken as a shortcut for the long 0L. |
|
27429
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
649 """) |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
650 |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
651 def read_long4(f): |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
652 r""" |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
653 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
654 >>> read_long4(io.BytesIO(b"\x02\x00\x00\x00\xff\x00")) |
|
39575
63237fcefd99
Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents:
38397
diff
changeset
|
655 255 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
656 >>> read_long4(io.BytesIO(b"\x02\x00\x00\x00\xff\x7f")) |
|
39575
63237fcefd99
Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents:
38397
diff
changeset
|
657 32767 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
658 >>> read_long4(io.BytesIO(b"\x02\x00\x00\x00\x00\xff")) |
|
39575
63237fcefd99
Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents:
38397
diff
changeset
|
659 -256 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
660 >>> read_long4(io.BytesIO(b"\x02\x00\x00\x00\x00\x80")) |
|
39575
63237fcefd99
Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents:
38397
diff
changeset
|
661 -32768 |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
662 >>> read_long1(io.BytesIO(b"\x00\x00\x00\x00")) |
|
39575
63237fcefd99
Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents:
38397
diff
changeset
|
663 0 |
|
27429
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
664 """ |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
665 |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
666 n = read_int4(f) |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
667 if n < 0: |
|
27436
60ff1ba428c3
Use proper function name in exception messages
Neal Norwitz <nnorwitz@gmail.com>
parents:
27435
diff
changeset
|
668 raise ValueError("long4 byte count < 0: %d" % n) |
|
27429
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
669 data = f.read(n) |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
670 if len(data) != n: |
|
27436
60ff1ba428c3
Use proper function name in exception messages
Neal Norwitz <nnorwitz@gmail.com>
parents:
27435
diff
changeset
|
671 raise ValueError("not enough data in stream to read long4") |
|
27429
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
672 return decode_long(data) |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
673 |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
674 long4 = ArgumentDescriptor( |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
675 name="long4", |
|
27435
430ed1c8e071
Removed the new LONG2 opcode: it's extravagant. If LONG1 isn't enough,
Tim Peters <tim.peters@gmail.com>
parents:
27434
diff
changeset
|
676 n=TAKEN_FROM_ARGUMENT4, |
|
27429
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
677 reader=read_long4, |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
678 doc="""A binary representation of a long, little-endian. |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
679 |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
680 This first reads four bytes as a signed size (but requires the |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
681 size to be >= 0), then reads that many bytes and interprets them |
|
27552
50c734250e05
It's Official: for LONG1/LONG4, a "byte count" of 0 is taken as a
Tim Peters <tim.peters@gmail.com>
parents:
27535
diff
changeset
|
682 as a little-endian 2's-complement long. If the size is 0, that's taken |
|
40644
1c26505c1de6
Rip out 'long' and 'L'-suffixed integer literals.
Guido van Rossum <guido@python.org>
parents:
40640
diff
changeset
|
683 as a shortcut for the int 0, although LONG1 should really be used |
|
27552
50c734250e05
It's Official: for LONG1/LONG4, a "byte count" of 0 is taken as a
Tim Peters <tim.peters@gmail.com>
parents:
27535
diff
changeset
|
684 then instead (and in any case where # of bytes < 256). |
|
27429
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
685 """) |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
686 |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
687 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
688 ############################################################################## |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
689 # Object descriptors. The stack used by the pickle machine holds objects, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
690 # and in the stack_before and stack_after attributes of OpcodeInfo |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
691 # descriptors we need names to describe the various types of objects that can |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
692 # appear on the stack. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
693 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
694 class StackObject(object): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
695 __slots__ = ( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
696 # name of descriptor record, for info only |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
697 'name', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
698 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
699 # type of object, or tuple of type objects (meaning the object can |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
700 # be of any type in the tuple) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
701 'obtype', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
702 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
703 # human-readable docs for this kind of stack object; a string |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
704 'doc', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
705 ) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
706 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
707 def __init__(self, name, obtype, doc): |
|
43577
ace45b361e87
Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents:
43003
diff
changeset
|
708 assert isinstance(name, str) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
709 self.name = name |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
710 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
711 assert isinstance(obtype, type) or isinstance(obtype, tuple) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
712 if isinstance(obtype, tuple): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
713 for contained in obtype: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
714 assert isinstance(contained, type) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
715 self.obtype = obtype |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
716 |
|
43577
ace45b361e87
Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents:
43003
diff
changeset
|
717 assert isinstance(doc, str) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
718 self.doc = doc |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
719 |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
720 def __repr__(self): |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
721 return self.name |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
722 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
723 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
724 pyint = StackObject( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
725 name='int', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
726 obtype=int, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
727 doc="A short (as opposed to long) Python integer object.") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
728 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
729 pylong = StackObject( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
730 name='long', |
|
40644
1c26505c1de6
Rip out 'long' and 'L'-suffixed integer literals.
Guido van Rossum <guido@python.org>
parents:
40640
diff
changeset
|
731 obtype=int, |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
732 doc="A long (as opposed to short) Python integer object.") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
733 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
734 pyinteger_or_bool = StackObject( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
735 name='int_or_bool', |
|
64010
656fe6292f9f
Merged revisions 83212,83829,83833,83838-83839,83878,84019,84025,84028,84032,84036 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents:
63041
diff
changeset
|
736 obtype=(int, bool), |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
737 doc="A Python integer object (short or long), or " |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
738 "a Python bool.") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
739 |
|
27429
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
740 pybool = StackObject( |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
741 name='bool', |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
742 obtype=(bool,), |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
743 doc="A Python bool object.") |
|
b465c9d2196a
Begin documenting protocol 2.
Guido van Rossum <guido@python.org>
parents:
27424
diff
changeset
|
744 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
745 pyfloat = StackObject( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
746 name='float', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
747 obtype=float, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
748 doc="A Python float object.") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
749 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
750 pystring = StackObject( |
|
45812
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
751 name='string', |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
752 obtype=bytes, |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
753 doc="A Python (8-bit) string object.") |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
754 |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
755 pybytes = StackObject( |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
756 name='bytes', |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
757 obtype=bytes, |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
758 doc="A Python bytes object.") |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
759 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
760 pyunicode = StackObject( |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
761 name='str', |
|
41575
beacf40b5960
Rip out all the u"..." literals and calls to unicode().
Guido van Rossum <guido@python.org>
parents:
40930
diff
changeset
|
762 obtype=str, |
|
45812
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
763 doc="A Python (Unicode) string object.") |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
764 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
765 pynone = StackObject( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
766 name="None", |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
767 obtype=type(None), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
768 doc="The Python None object.") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
769 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
770 pytuple = StackObject( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
771 name="tuple", |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
772 obtype=tuple, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
773 doc="A Python tuple object.") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
774 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
775 pylist = StackObject( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
776 name="list", |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
777 obtype=list, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
778 doc="A Python list object.") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
779 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
780 pydict = StackObject( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
781 name="dict", |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
782 obtype=dict, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
783 doc="A Python dict object.") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
784 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
785 anyobject = StackObject( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
786 name='any', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
787 obtype=object, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
788 doc="Any kind of object whatsoever.") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
789 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
790 markobject = StackObject( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
791 name="mark", |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
792 obtype=StackObject, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
793 doc="""'The mark' is a unique object. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
794 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
795 Opcodes that operate on a variable number of objects |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
796 generally don't embed the count of objects in the opcode, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
797 or pull it off the stack. Instead the MARK opcode is used |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
798 to push a special marker object on the stack, and then |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
799 some other opcodes grab all the objects from the top of |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
800 the stack down to (but not including) the topmost marker |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
801 object. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
802 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
803 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
804 stackslice = StackObject( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
805 name="stackslice", |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
806 obtype=StackObject, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
807 doc="""An object representing a contiguous slice of the stack. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
808 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
809 This is used in conjuction with markobject, to represent all |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
810 of the stack following the topmost markobject. For example, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
811 the POP_MARK opcode changes the stack from |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
812 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
813 [..., markobject, stackslice] |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
814 to |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
815 [...] |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
816 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
817 No matter how many object are on the stack after the topmost |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
818 markobject, POP_MARK gets rid of all of them (including the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
819 topmost markobject too). |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
820 """) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
821 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
822 ############################################################################## |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
823 # Descriptors for pickle opcodes. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
824 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
825 class OpcodeInfo(object): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
826 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
827 __slots__ = ( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
828 # symbolic name of opcode; a string |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
829 'name', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
830 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
831 # the code used in a bytestream to represent the opcode; a |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
832 # one-character string |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
833 'code', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
834 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
835 # If the opcode has an argument embedded in the byte string, an |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
836 # instance of ArgumentDescriptor specifying its type. Note that |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
837 # arg.reader(s) can be used to read and decode the argument from |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
838 # the bytestream s, and arg.doc documents the format of the raw |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
839 # argument bytes. If the opcode doesn't have an argument embedded |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
840 # in the bytestream, arg should be None. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
841 'arg', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
842 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
843 # what the stack looks like before this opcode runs; a list |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
844 'stack_before', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
845 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
846 # what the stack looks like after this opcode runs; a list |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
847 'stack_after', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
848 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
849 # the protocol number in which this opcode was introduced; an int |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
850 'proto', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
851 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
852 # human-readable docs for this opcode; a string |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
853 'doc', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
854 ) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
855 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
856 def __init__(self, name, code, arg, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
857 stack_before, stack_after, proto, doc): |
|
43577
ace45b361e87
Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents:
43003
diff
changeset
|
858 assert isinstance(name, str) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
859 self.name = name |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
860 |
|
43577
ace45b361e87
Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents:
43003
diff
changeset
|
861 assert isinstance(code, str) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
862 assert len(code) == 1 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
863 self.code = code |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
864 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
865 assert arg is None or isinstance(arg, ArgumentDescriptor) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
866 self.arg = arg |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
867 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
868 assert isinstance(stack_before, list) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
869 for x in stack_before: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
870 assert isinstance(x, StackObject) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
871 self.stack_before = stack_before |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
872 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
873 assert isinstance(stack_after, list) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
874 for x in stack_after: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
875 assert isinstance(x, StackObject) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
876 self.stack_after = stack_after |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
877 |
|
45812
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
878 assert isinstance(proto, int) and 0 <= proto <= 3 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
879 self.proto = proto |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
880 |
|
43577
ace45b361e87
Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents:
43003
diff
changeset
|
881 assert isinstance(doc, str) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
882 self.doc = doc |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
883 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
884 I = OpcodeInfo |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
885 opcodes = [ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
886 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
887 # Ways to spell integers. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
888 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
889 I(name='INT', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
890 code='I', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
891 arg=decimalnl_short, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
892 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
893 stack_after=[pyinteger_or_bool], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
894 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
895 doc="""Push an integer or bool. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
896 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
897 The argument is a newline-terminated decimal literal string. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
898 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
899 The intent may have been that this always fit in a short Python int, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
900 but INT can be generated in pickles written on a 64-bit box that |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
901 require a Python long on a 32-bit box. The difference between this |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
902 and LONG then is that INT skips a trailing 'L', and produces a short |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
903 int whenever possible. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
904 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
905 Another difference is due to that, when bool was introduced as a |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
906 distinct type in 2.3, builtin names True and False were also added to |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
907 2.2.2, mapping to ints 1 and 0. For compatibility in both directions, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
908 True gets pickled as INT + "I01\\n", and False as INT + "I00\\n". |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
909 Leading zeroes are never produced for a genuine integer. The 2.3 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
910 (and later) unpicklers special-case these and return bool instead; |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
911 earlier unpicklers ignore the leading "0" and return the int. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
912 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
913 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
914 I(name='BININT', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
915 code='J', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
916 arg=int4, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
917 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
918 stack_after=[pyint], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
919 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
920 doc="""Push a four-byte signed integer. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
921 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
922 This handles the full range of Python (short) integers on a 32-bit |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
923 box, directly as binary bytes (1 for the opcode and 4 for the integer). |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
924 If the integer is non-negative and fits in 1 or 2 bytes, pickling via |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
925 BININT1 or BININT2 saves space. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
926 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
927 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
928 I(name='BININT1', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
929 code='K', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
930 arg=uint1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
931 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
932 stack_after=[pyint], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
933 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
934 doc="""Push a one-byte unsigned integer. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
935 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
936 This is a space optimization for pickling very small non-negative ints, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
937 in range(256). |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
938 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
939 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
940 I(name='BININT2', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
941 code='M', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
942 arg=uint2, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
943 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
944 stack_after=[pyint], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
945 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
946 doc="""Push a two-byte unsigned integer. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
947 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
948 This is a space optimization for pickling small positive ints, in |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
949 range(256, 2**16). Integers in range(256) can also be pickled via |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
950 BININT2, but BININT1 instead saves a byte. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
951 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
952 |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
953 I(name='LONG', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
954 code='L', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
955 arg=decimalnl_long, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
956 stack_before=[], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
957 stack_after=[pylong], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
958 proto=0, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
959 doc="""Push a long integer. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
960 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
961 The same as INT, except that the literal ends with 'L', and always |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
962 unpickles to a Python long. There doesn't seem a real purpose to the |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
963 trailing 'L'. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
964 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
965 Note that LONG takes time quadratic in the number of digits when |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
966 unpickling (this is simply due to the nature of decimal->binary |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
967 conversion). Proto 2 added linear-time (in C; still quadratic-time |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
968 in Python) LONG1 and LONG4 opcodes. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
969 """), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
970 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
971 I(name="LONG1", |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
972 code='\x8a', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
973 arg=long1, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
974 stack_before=[], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
975 stack_after=[pylong], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
976 proto=2, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
977 doc="""Long integer using one-byte length. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
978 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
979 A more efficient encoding of a Python long; the long1 encoding |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
980 says it all."""), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
981 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
982 I(name="LONG4", |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
983 code='\x8b', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
984 arg=long4, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
985 stack_before=[], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
986 stack_after=[pylong], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
987 proto=2, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
988 doc="""Long integer using found-byte length. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
989 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
990 A more efficient encoding of a Python long; the long4 encoding |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
991 says it all."""), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
992 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
993 # Ways to spell strings (8-bit, not Unicode). |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
994 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
995 I(name='STRING', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
996 code='S', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
997 arg=stringnl, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
998 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
999 stack_after=[pystring], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1000 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1001 doc="""Push a Python string object. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1002 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1003 The argument is a repr-style string, with bracketing quote characters, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1004 and perhaps embedded escapes. The argument extends until the next |
|
45812
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1005 newline character. (Actually, they are decoded into a str instance |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1006 using the encoding given to the Unpickler constructor. or the default, |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1007 'ASCII'.) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1008 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1009 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1010 I(name='BINSTRING', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1011 code='T', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1012 arg=string4, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1013 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1014 stack_after=[pystring], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1015 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1016 doc="""Push a Python string object. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1017 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1018 There are two arguments: the first is a 4-byte little-endian signed int |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1019 giving the number of bytes in the string, and the second is that many |
|
45812
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1020 bytes, which are taken literally as the string content. (Actually, |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1021 they are decoded into a str instance using the encoding given to the |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1022 Unpickler constructor. or the default, 'ASCII'.) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1023 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1024 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1025 I(name='SHORT_BINSTRING', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1026 code='U', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1027 arg=string1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1028 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1029 stack_after=[pystring], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1030 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1031 doc="""Push a Python string object. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1032 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1033 There are two arguments: the first is a 1-byte unsigned int giving |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1034 the number of bytes in the string, and the second is that many bytes, |
|
45812
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1035 which are taken literally as the string content. (Actually, they |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1036 are decoded into a str instance using the encoding given to the |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1037 Unpickler constructor. or the default, 'ASCII'.) |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1038 """), |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1039 |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1040 # Bytes (protocol 3 only; older protocols don't support bytes at all) |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1041 |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1042 I(name='BINBYTES', |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1043 code='B', |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1044 arg=string4, |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1045 stack_before=[], |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1046 stack_after=[pybytes], |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1047 proto=3, |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1048 doc="""Push a Python bytes object. |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1049 |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1050 There are two arguments: the first is a 4-byte little-endian signed int |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1051 giving the number of bytes in the string, and the second is that many |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1052 bytes, which are taken literally as the bytes content. |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1053 """), |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1054 |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1055 I(name='SHORT_BINBYTES', |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1056 code='C', |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1057 arg=string1, |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1058 stack_before=[], |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1059 stack_after=[pybytes], |
|
54215
6fab8bd15d71
Merge r72792: POP_MARK was not in pickle protocol 0, SHORT_BINBYTES was not in protocol 1.
Collin Winter <collinw@gmail.com>
parents:
51022
diff
changeset
|
1060 proto=3, |
|
45812
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1061 doc="""Push a Python string object. |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1062 |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1063 There are two arguments: the first is a 1-byte unsigned int giving |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
1064 the number of bytes in the string, and the second is that many bytes, |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1065 which are taken literally as the string content. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1066 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1067 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1068 # Ways to spell None. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1069 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1070 I(name='NONE', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1071 code='N', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1072 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1073 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1074 stack_after=[pynone], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1075 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1076 doc="Push None on the stack."), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1077 |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1078 # Ways to spell bools, starting with proto 2. See INT for how this was |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1079 # done before proto 2. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1080 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1081 I(name='NEWTRUE', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1082 code='\x88', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1083 arg=None, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1084 stack_before=[], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1085 stack_after=[pybool], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1086 proto=2, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1087 doc="""True. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1088 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1089 Push True onto the stack."""), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1090 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1091 I(name='NEWFALSE', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1092 code='\x89', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1093 arg=None, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1094 stack_before=[], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1095 stack_after=[pybool], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1096 proto=2, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1097 doc="""True. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1098 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1099 Push False onto the stack."""), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1100 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1101 # Ways to spell Unicode strings. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1102 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1103 I(name='UNICODE', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1104 code='V', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1105 arg=unicodestringnl, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1106 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1107 stack_after=[pyunicode], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1108 proto=0, # this may be pure-text, but it's a later addition |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1109 doc="""Push a Python Unicode string object. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1110 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1111 The argument is a raw-unicode-escape encoding of a Unicode string, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1112 and so may contain embedded escape sequences. The argument extends |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1113 until the next newline character. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1114 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1115 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1116 I(name='BINUNICODE', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1117 code='X', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1118 arg=unicodestring4, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1119 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1120 stack_after=[pyunicode], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1121 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1122 doc="""Push a Python Unicode string object. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1123 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1124 There are two arguments: the first is a 4-byte little-endian signed int |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1125 giving the number of bytes in the string. The second is that many |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1126 bytes, and is the UTF-8 encoding of the Unicode string. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1127 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1128 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1129 # Ways to spell floats. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1130 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1131 I(name='FLOAT', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1132 code='F', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1133 arg=floatnl, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1134 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1135 stack_after=[pyfloat], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1136 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1137 doc="""Newline-terminated decimal float literal. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1138 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1139 The argument is repr(a_float), and in general requires 17 significant |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1140 digits for roundtrip conversion to be an identity (this is so for |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1141 IEEE-754 double precision values, which is what Python float maps to |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1142 on most boxes). |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1143 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1144 In general, FLOAT cannot be used to transport infinities, NaNs, or |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1145 minus zero across boxes (or even on a single box, if the platform C |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1146 library can't read the strings it produces for such things -- Windows |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1147 is like that), but may do less damage than BINFLOAT on boxes with |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1148 greater precision or dynamic range than IEEE-754 double. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1149 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1150 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1151 I(name='BINFLOAT', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1152 code='G', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1153 arg=float8, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1154 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1155 stack_after=[pyfloat], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1156 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1157 doc="""Float stored in binary form, with 8 bytes of data. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1158 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1159 This generally requires less than half the space of FLOAT encoding. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1160 In general, BINFLOAT cannot be used to transport infinities, NaNs, or |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1161 minus zero, raises an exception if the exponent exceeds the range of |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1162 an IEEE-754 double, and retains no more than 53 bits of precision (if |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1163 there are more than that, "add a half and chop" rounding is used to |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1164 cut it back to 53 significant bits). |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1165 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1166 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1167 # Ways to build lists. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1168 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1169 I(name='EMPTY_LIST', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1170 code=']', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1171 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1172 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1173 stack_after=[pylist], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1174 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1175 doc="Push an empty list."), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1176 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1177 I(name='APPEND', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1178 code='a', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1179 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1180 stack_before=[pylist, anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1181 stack_after=[pylist], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1182 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1183 doc="""Append an object to a list. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1184 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1185 Stack before: ... pylist anyobject |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1186 Stack after: ... pylist+[anyobject] |
| 27463 | 1187 |
| 1188 although pylist is really extended in-place. | |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1189 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1190 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1191 I(name='APPENDS', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1192 code='e', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1193 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1194 stack_before=[pylist, markobject, stackslice], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1195 stack_after=[pylist], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1196 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1197 doc="""Extend a list by a slice of stack objects. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1198 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1199 Stack before: ... pylist markobject stackslice |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1200 Stack after: ... pylist+stackslice |
| 27463 | 1201 |
| 1202 although pylist is really extended in-place. | |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1203 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1204 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1205 I(name='LIST', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1206 code='l', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1207 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1208 stack_before=[markobject, stackslice], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1209 stack_after=[pylist], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1210 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1211 doc="""Build a list out of the topmost stack slice, after markobject. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1212 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1213 All the stack entries following the topmost markobject are placed into |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1214 a single Python list, which single list object replaces all of the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1215 stack from the topmost markobject onward. For example, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1216 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1217 Stack before: ... markobject 1 2 3 'abc' |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1218 Stack after: ... [1, 2, 3, 'abc'] |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1219 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1220 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1221 # Ways to build tuples. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1222 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1223 I(name='EMPTY_TUPLE', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1224 code=')', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1225 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1226 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1227 stack_after=[pytuple], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1228 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1229 doc="Push an empty tuple."), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1230 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1231 I(name='TUPLE', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1232 code='t', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1233 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1234 stack_before=[markobject, stackslice], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1235 stack_after=[pytuple], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1236 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1237 doc="""Build a tuple out of the topmost stack slice, after markobject. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1238 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1239 All the stack entries following the topmost markobject are placed into |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1240 a single Python tuple, which single tuple object replaces all of the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1241 stack from the topmost markobject onward. For example, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1242 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1243 Stack before: ... markobject 1 2 3 'abc' |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1244 Stack after: ... (1, 2, 3, 'abc') |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1245 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1246 |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1247 I(name='TUPLE1', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1248 code='\x85', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1249 arg=None, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1250 stack_before=[anyobject], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1251 stack_after=[pytuple], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1252 proto=2, |
|
63041
24f7fa2581e6
Merged revisions 82915 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
1253 doc="""Build a one-tuple out of the topmost item on the stack. |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1254 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1255 This code pops one value off the stack and pushes a tuple of |
|
63041
24f7fa2581e6
Merged revisions 82915 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
1256 length 1 whose one item is that value back onto it. In other |
|
24f7fa2581e6
Merged revisions 82915 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
1257 words: |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1258 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1259 stack[-1] = tuple(stack[-1:]) |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1260 """), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1261 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1262 I(name='TUPLE2', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1263 code='\x86', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1264 arg=None, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1265 stack_before=[anyobject, anyobject], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1266 stack_after=[pytuple], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1267 proto=2, |
|
63041
24f7fa2581e6
Merged revisions 82915 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
1268 doc="""Build a two-tuple out of the top two items on the stack. |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1269 |
|
63041
24f7fa2581e6
Merged revisions 82915 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
1270 This code pops two values off the stack and pushes a tuple of |
|
24f7fa2581e6
Merged revisions 82915 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
1271 length 2 whose items are those values back onto it. In other |
|
24f7fa2581e6
Merged revisions 82915 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
1272 words: |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1273 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1274 stack[-2:] = [tuple(stack[-2:])] |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1275 """), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1276 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1277 I(name='TUPLE3', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1278 code='\x87', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1279 arg=None, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1280 stack_before=[anyobject, anyobject, anyobject], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1281 stack_after=[pytuple], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1282 proto=2, |
|
63041
24f7fa2581e6
Merged revisions 82915 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
1283 doc="""Build a three-tuple out of the top three items on the stack. |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1284 |
|
63041
24f7fa2581e6
Merged revisions 82915 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
1285 This code pops three values off the stack and pushes a tuple of |
|
24f7fa2581e6
Merged revisions 82915 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
1286 length 3 whose items are those values back onto it. In other |
|
24f7fa2581e6
Merged revisions 82915 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
1287 words: |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1288 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1289 stack[-3:] = [tuple(stack[-3:])] |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1290 """), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1291 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1292 # Ways to build dicts. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1293 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1294 I(name='EMPTY_DICT', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1295 code='}', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1296 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1297 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1298 stack_after=[pydict], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1299 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1300 doc="Push an empty dict."), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1301 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1302 I(name='DICT', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1303 code='d', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1304 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1305 stack_before=[markobject, stackslice], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1306 stack_after=[pydict], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1307 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1308 doc="""Build a dict out of the topmost stack slice, after markobject. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1309 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1310 All the stack entries following the topmost markobject are placed into |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1311 a single Python dict, which single dict object replaces all of the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1312 stack from the topmost markobject onward. The stack slice alternates |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1313 key, value, key, value, .... For example, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1314 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1315 Stack before: ... markobject 1 2 3 'abc' |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1316 Stack after: ... {1: 2, 3: 'abc'} |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1317 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1318 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1319 I(name='SETITEM', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1320 code='s', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1321 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1322 stack_before=[pydict, anyobject, anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1323 stack_after=[pydict], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1324 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1325 doc="""Add a key+value pair to an existing dict. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1326 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1327 Stack before: ... pydict key value |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1328 Stack after: ... pydict |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1329 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1330 where pydict has been modified via pydict[key] = value. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1331 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1332 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1333 I(name='SETITEMS', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1334 code='u', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1335 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1336 stack_before=[pydict, markobject, stackslice], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1337 stack_after=[pydict], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1338 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1339 doc="""Add an arbitrary number of key+value pairs to an existing dict. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1340 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1341 The slice of the stack following the topmost markobject is taken as |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1342 an alternating sequence of keys and values, added to the dict |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1343 immediately under the topmost markobject. Everything at and after the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1344 topmost markobject is popped, leaving the mutated dict at the top |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1345 of the stack. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1346 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1347 Stack before: ... pydict markobject key_1 value_1 ... key_n value_n |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1348 Stack after: ... pydict |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1349 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1350 where pydict has been modified via pydict[key_i] = value_i for i in |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1351 1, 2, ..., n, and in that order. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1352 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1353 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1354 # Stack manipulation. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1355 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1356 I(name='POP', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1357 code='0', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1358 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1359 stack_before=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1360 stack_after=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1361 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1362 doc="Discard the top stack item, shrinking the stack by one item."), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1363 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1364 I(name='DUP', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1365 code='2', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1366 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1367 stack_before=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1368 stack_after=[anyobject, anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1369 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1370 doc="Push the top stack item onto the stack again, duplicating it."), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1371 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1372 I(name='MARK', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1373 code='(', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1374 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1375 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1376 stack_after=[markobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1377 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1378 doc="""Push markobject onto the stack. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1379 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1380 markobject is a unique object, used by other opcodes to identify a |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1381 region of the stack containing a variable number of objects for them |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1382 to work on. See markobject.doc for more detail. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1383 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1384 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1385 I(name='POP_MARK', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1386 code='1', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1387 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1388 stack_before=[markobject, stackslice], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1389 stack_after=[], |
|
54215
6fab8bd15d71
Merge r72792: POP_MARK was not in pickle protocol 0, SHORT_BINBYTES was not in protocol 1.
Collin Winter <collinw@gmail.com>
parents:
51022
diff
changeset
|
1390 proto=1, |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1391 doc="""Pop all the stack objects at and above the topmost markobject. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1392 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1393 When an opcode using a variable number of stack objects is done, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1394 POP_MARK is used to remove those objects, and to remove the markobject |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1395 that delimited their starting position on the stack. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1396 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1397 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1398 # Memo manipulation. There are really only two operations (get and put), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1399 # each in all-text, "short binary", and "long binary" flavors. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1400 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1401 I(name='GET', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1402 code='g', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1403 arg=decimalnl_short, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1404 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1405 stack_after=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1406 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1407 doc="""Read an object from the memo and push it on the stack. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1408 |
|
68585
bf94b6a73fc8
#11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
64010
diff
changeset
|
1409 The index of the memo object to push is given by the newline-terminated |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1410 decimal string following. BINGET and LONG_BINGET are space-optimized |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1411 versions. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1412 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1413 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1414 I(name='BINGET', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1415 code='h', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1416 arg=uint1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1417 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1418 stack_after=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1419 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1420 doc="""Read an object from the memo and push it on the stack. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1421 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1422 The index of the memo object to push is given by the 1-byte unsigned |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1423 integer following. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1424 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1425 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1426 I(name='LONG_BINGET', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1427 code='j', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1428 arg=int4, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1429 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1430 stack_after=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1431 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1432 doc="""Read an object from the memo and push it on the stack. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1433 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1434 The index of the memo object to push is given by the 4-byte signed |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1435 little-endian integer following. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1436 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1437 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1438 I(name='PUT', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1439 code='p', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1440 arg=decimalnl_short, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1441 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1442 stack_after=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1443 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1444 doc="""Store the stack top into the memo. The stack is not popped. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1445 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1446 The index of the memo location to write into is given by the newline- |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1447 terminated decimal string following. BINPUT and LONG_BINPUT are |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1448 space-optimized versions. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1449 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1450 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1451 I(name='BINPUT', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1452 code='q', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1453 arg=uint1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1454 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1455 stack_after=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1456 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1457 doc="""Store the stack top into the memo. The stack is not popped. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1458 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1459 The index of the memo location to write into is given by the 1-byte |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1460 unsigned integer following. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1461 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1462 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1463 I(name='LONG_BINPUT', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1464 code='r', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1465 arg=int4, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1466 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1467 stack_after=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1468 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1469 doc="""Store the stack top into the memo. The stack is not popped. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1470 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1471 The index of the memo location to write into is given by the 4-byte |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1472 signed little-endian integer following. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1473 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1474 |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1475 # Access the extension registry (predefined objects). Akin to the GET |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1476 # family. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1477 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1478 I(name='EXT1', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1479 code='\x82', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1480 arg=uint1, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1481 stack_before=[], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1482 stack_after=[anyobject], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1483 proto=2, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1484 doc="""Extension code. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1485 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1486 This code and the similar EXT2 and EXT4 allow using a registry |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1487 of popular objects that are pickled by name, typically classes. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1488 It is envisioned that through a global negotiation and |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1489 registration process, third parties can set up a mapping between |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1490 ints and object names. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1491 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1492 In order to guarantee pickle interchangeability, the extension |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1493 code registry ought to be global, although a range of codes may |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1494 be reserved for private use. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1495 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1496 EXT1 has a 1-byte integer argument. This is used to index into the |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1497 extension registry, and the object at that index is pushed on the stack. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1498 """), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1499 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1500 I(name='EXT2', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1501 code='\x83', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1502 arg=uint2, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1503 stack_before=[], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1504 stack_after=[anyobject], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1505 proto=2, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1506 doc="""Extension code. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1507 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1508 See EXT1. EXT2 has a two-byte integer argument. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1509 """), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1510 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1511 I(name='EXT4', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1512 code='\x84', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1513 arg=int4, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1514 stack_before=[], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1515 stack_after=[anyobject], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1516 proto=2, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1517 doc="""Extension code. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1518 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1519 See EXT1. EXT4 has a four-byte integer argument. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1520 """), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1521 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1522 # Push a class object, or module function, on the stack, via its module |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1523 # and name. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1524 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1525 I(name='GLOBAL', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1526 code='c', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1527 arg=stringnl_noescape_pair, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1528 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1529 stack_after=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1530 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1531 doc="""Push a global object (module.attr) on the stack. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1532 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1533 Two newline-terminated strings follow the GLOBAL opcode. The first is |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1534 taken as a module name, and the second as a class name. The class |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1535 object module.class is pushed on the stack. More accurately, the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1536 object returned by self.find_class(module, class) is pushed on the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1537 stack, so unpickling subclasses can override this form of lookup. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1538 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1539 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1540 # Ways to build objects of classes pickle doesn't know about directly |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1541 # (user-defined classes). I despair of documenting this accurately |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1542 # and comprehensibly -- you really have to read the pickle code to |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1543 # find all the special cases. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1544 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1545 I(name='REDUCE', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1546 code='R', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1547 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1548 stack_before=[anyobject, anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1549 stack_after=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1550 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1551 doc="""Push an object built from a callable and an argument tuple. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1552 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1553 The opcode is named to remind of the __reduce__() method. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1554 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1555 Stack before: ... callable pytuple |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1556 Stack after: ... callable(*pytuple) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1557 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1558 The callable and the argument tuple are the first two items returned |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1559 by a __reduce__ method. Applying the callable to the argtuple is |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1560 supposed to reproduce the original object, or at least get it started. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1561 If the __reduce__ method returns a 3-tuple, the last component is an |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1562 argument to be passed to the object's __setstate__, and then the REDUCE |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1563 opcode is followed by code to create setstate's argument, and then a |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1564 BUILD opcode to apply __setstate__ to that argument. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1565 |
|
41986
6464cc638faa
Merged revisions 55795-55816 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41715
diff
changeset
|
1566 If not isinstance(callable, type), REDUCE complains unless the |
|
46867
dd5513b472dc
Rename copy_reg module to copyreg.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
45812
diff
changeset
|
1567 callable has been registered with the copyreg module's |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1568 safe_constructors dict, or the callable has a magic |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1569 '__safe_for_unpickling__' attribute with a true value. I'm not sure |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1570 why it does this, but I've sure seen this complaint often enough when |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1571 I didn't want to <wink>. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1572 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1573 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1574 I(name='BUILD', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1575 code='b', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1576 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1577 stack_before=[anyobject, anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1578 stack_after=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1579 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1580 doc="""Finish building an object, via __setstate__ or dict update. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1581 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1582 Stack before: ... anyobject argument |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1583 Stack after: ... anyobject |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1584 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1585 where anyobject may have been mutated, as follows: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1586 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1587 If the object has a __setstate__ method, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1588 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1589 anyobject.__setstate__(argument) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1590 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1591 is called. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1592 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1593 Else the argument must be a dict, the object must have a __dict__, and |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1594 the object is updated via |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1595 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1596 anyobject.__dict__.update(argument) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1597 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1598 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1599 I(name='INST', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1600 code='i', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1601 arg=stringnl_noescape_pair, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1602 stack_before=[markobject, stackslice], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1603 stack_after=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1604 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1605 doc="""Build a class instance. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1606 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1607 This is the protocol 0 version of protocol 1's OBJ opcode. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1608 INST is followed by two newline-terminated strings, giving a |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1609 module and class name, just as for the GLOBAL opcode (and see |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1610 GLOBAL for more details about that). self.find_class(module, name) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1611 is used to get a class object. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1612 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1613 In addition, all the objects on the stack following the topmost |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1614 markobject are gathered into a tuple and popped (along with the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1615 topmost markobject), just as for the TUPLE opcode. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1616 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1617 Now it gets complicated. If all of these are true: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1618 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1619 + The argtuple is empty (markobject was at the top of the stack |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1620 at the start). |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1621 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1622 + The class object does not have a __getinitargs__ attribute. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1623 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1624 then we want to create an old-style class instance without invoking |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1625 its __init__() method (pickle has waffled on this over the years; not |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1626 calling __init__() is current wisdom). In this case, an instance of |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1627 an old-style dummy class is created, and then we try to rebind its |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1628 __class__ attribute to the desired class object. If this succeeds, |
|
41715
f60c877d52c8
Merged revisions 55270-55324 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41651
diff
changeset
|
1629 the new instance object is pushed on the stack, and we're done. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1630 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1631 Else (the argtuple is not empty, it's not an old-style class object, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1632 or the class object does have a __getinitargs__ attribute), the code |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1633 first insists that the class object have a __safe_for_unpickling__ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1634 attribute. Unlike as for the __safe_for_unpickling__ check in REDUCE, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1635 it doesn't matter whether this attribute has a true or false value, it |
|
42322
3e33215c66ed
Getting rid of cPickle. Mmm, feels good!
Guido van Rossum <guido@python.org>
parents:
42295
diff
changeset
|
1636 only matters whether it exists (XXX this is a bug). If |
|
3e33215c66ed
Getting rid of cPickle. Mmm, feels good!
Guido van Rossum <guido@python.org>
parents:
42295
diff
changeset
|
1637 __safe_for_unpickling__ doesn't exist, UnpicklingError is raised. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1638 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1639 Else (the class object does have a __safe_for_unpickling__ attr), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1640 the class object obtained from INST's arguments is applied to the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1641 argtuple obtained from the stack, and the resulting instance object |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1642 is pushed on the stack. |
|
27535
72b38d5fe61f
Updated the INST/OBJ docs, to say they really are (almost) identical
Tim Peters <tim.peters@gmail.com>
parents:
27532
diff
changeset
|
1643 |
|
72b38d5fe61f
Updated the INST/OBJ docs, to say they really are (almost) identical
Tim Peters <tim.peters@gmail.com>
parents:
27532
diff
changeset
|
1644 NOTE: checks for __safe_for_unpickling__ went away in Python 2.3. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1645 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1646 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1647 I(name='OBJ', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1648 code='o', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1649 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1650 stack_before=[markobject, anyobject, stackslice], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1651 stack_after=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1652 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1653 doc="""Build a class instance. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1654 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1655 This is the protocol 1 version of protocol 0's INST opcode, and is |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1656 very much like it. The major difference is that the class object |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1657 is taken off the stack, allowing it to be retrieved from the memo |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1658 repeatedly if several instances of the same class are created. This |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1659 can be much more efficient (in both time and space) than repeatedly |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1660 embedding the module and class names in INST opcodes. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1661 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1662 Unlike INST, OBJ takes no arguments from the opcode stream. Instead |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1663 the class object is taken off the stack, immediately above the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1664 topmost markobject: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1665 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1666 Stack before: ... markobject classobject stackslice |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1667 Stack after: ... new_instance_object |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1668 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1669 As for INST, the remainder of the stack above the markobject is |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1670 gathered into an argument tuple, and then the logic seems identical, |
|
27513
b1d1fe7fb514
Document the demise of all pretenses of safety, and the difference
Guido van Rossum <guido@python.org>
parents:
27507
diff
changeset
|
1671 except that no __safe_for_unpickling__ check is done (XXX this is |
|
42322
3e33215c66ed
Getting rid of cPickle. Mmm, feels good!
Guido van Rossum <guido@python.org>
parents:
42295
diff
changeset
|
1672 a bug). See INST for the gory details. |
|
27535
72b38d5fe61f
Updated the INST/OBJ docs, to say they really are (almost) identical
Tim Peters <tim.peters@gmail.com>
parents:
27532
diff
changeset
|
1673 |
|
72b38d5fe61f
Updated the INST/OBJ docs, to say they really are (almost) identical
Tim Peters <tim.peters@gmail.com>
parents:
27532
diff
changeset
|
1674 NOTE: In Python 2.3, INST and OBJ are identical except for how they |
|
72b38d5fe61f
Updated the INST/OBJ docs, to say they really are (almost) identical
Tim Peters <tim.peters@gmail.com>
parents:
27532
diff
changeset
|
1675 get the class object. That was always the intent; the implementations |
|
72b38d5fe61f
Updated the INST/OBJ docs, to say they really are (almost) identical
Tim Peters <tim.peters@gmail.com>
parents:
27532
diff
changeset
|
1676 had diverged for accidental reasons. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1677 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1678 |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1679 I(name='NEWOBJ', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1680 code='\x81', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1681 arg=None, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1682 stack_before=[anyobject, anyobject], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1683 stack_after=[anyobject], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1684 proto=2, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1685 doc="""Build an object instance. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1686 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1687 The stack before should be thought of as containing a class |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1688 object followed by an argument tuple (the tuple being the stack |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1689 top). Call these cls and args. They are popped off the stack, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1690 and the value returned by cls.__new__(cls, *args) is pushed back |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1691 onto the stack. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1692 """), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1693 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1694 # Machine control. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1695 |
|
27462
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1696 I(name='PROTO', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1697 code='\x80', |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1698 arg=uint1, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1699 stack_before=[], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1700 stack_after=[], |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1701 proto=2, |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1702 doc="""Protocol version indicator. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1703 |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1704 For protocol 2 and above, a pickle must start with this opcode. |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1705 The argument is the protocol version, an int in range(2, 256). |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1706 """), |
|
26a792007665
Now that proto2 is defined, replaced XXX blocks with text about it.
Tim Peters <tim.peters@gmail.com>
parents:
27436
diff
changeset
|
1707 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1708 I(name='STOP', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1709 code='.', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1710 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1711 stack_before=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1712 stack_after=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1713 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1714 doc="""Stop the unpickling machine. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1715 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1716 Every pickle ends with this opcode. The object at the top of the stack |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1717 is popped, and that's the result of unpickling. The stack should be |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1718 empty then. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1719 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1720 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1721 # Ways to deal with persistent IDs. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1722 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1723 I(name='PERSID', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1724 code='P', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1725 arg=stringnl_noescape, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1726 stack_before=[], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1727 stack_after=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1728 proto=0, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1729 doc="""Push an object identified by a persistent ID. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1730 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1731 The pickle module doesn't define what a persistent ID means. PERSID's |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1732 argument is a newline-terminated str-style (no embedded escapes, no |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1733 bracketing quote characters) string, which *is* "the persistent ID". |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1734 The unpickler passes this string to self.persistent_load(). Whatever |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1735 object that returns is pushed on the stack. There is no implementation |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1736 of persistent_load() in Python's unpickler: it must be supplied by an |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1737 unpickler subclass. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1738 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1739 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1740 I(name='BINPERSID', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1741 code='Q', |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1742 arg=None, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1743 stack_before=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1744 stack_after=[anyobject], |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1745 proto=1, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1746 doc="""Push an object identified by a persistent ID. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1747 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1748 Like PERSID, except the persistent ID is popped off the stack (instead |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1749 of being a string embedded in the opcode bytestream). The persistent |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1750 ID is passed to self.persistent_load(), and whatever object that |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1751 returns is pushed on the stack. See PERSID for more detail. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1752 """), |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1753 ] |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1754 del I |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1755 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1756 # Verify uniqueness of .name and .code members. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1757 name2i = {} |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1758 code2i = {} |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1759 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1760 for i, d in enumerate(opcodes): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1761 if d.name in name2i: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1762 raise ValueError("repeated name %r at indices %d and %d" % |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1763 (d.name, name2i[d.name], i)) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1764 if d.code in code2i: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1765 raise ValueError("repeated code %r at indices %d and %d" % |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1766 (d.code, code2i[d.code], i)) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1767 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1768 name2i[d.name] = i |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1769 code2i[d.code] = i |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1770 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1771 del name2i, code2i, i, d |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1772 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1773 ############################################################################## |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1774 # Build a code2op dict, mapping opcode characters to OpcodeInfo records. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1775 # Also ensure we've got the same stuff as pickle.py, although the |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1776 # introspection here is dicey. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1777 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1778 code2op = {} |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1779 for d in opcodes: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1780 code2op[d.code] = d |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1781 del d |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1782 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1783 def assure_pickle_consistency(verbose=False): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1784 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1785 copy = code2op.copy() |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1786 for name in pickle.__all__: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1787 if not re.match("[A-Z][A-Z0-9_]+$", name): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1788 if verbose: |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
1789 print("skipping %r: it doesn't look like an opcode name" % name) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1790 continue |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1791 picklecode = getattr(pickle, name) |
|
41643
c6568550b1c6
Checkpoint. A b it closer to working pickles and pickletools.
Guido van Rossum <guido@python.org>
parents:
41575
diff
changeset
|
1792 if not isinstance(picklecode, bytes) or len(picklecode) != 1: |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1793 if verbose: |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
1794 print(("skipping %r: value %r doesn't look like a pickle " |
|
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
1795 "code" % (name, picklecode))) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1796 continue |
|
41643
c6568550b1c6
Checkpoint. A b it closer to working pickles and pickletools.
Guido van Rossum <guido@python.org>
parents:
41575
diff
changeset
|
1797 picklecode = picklecode.decode("latin-1") |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1798 if picklecode in copy: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1799 if verbose: |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
1800 print("checking name %r w/ code %r for consistency" % ( |
|
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
1801 name, picklecode)) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1802 d = copy[picklecode] |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1803 if d.name != name: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1804 raise ValueError("for pickle code %r, pickle.py uses name %r " |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1805 "but we're using name %r" % (picklecode, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1806 name, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1807 d.name)) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1808 # Forget this one. Any left over in copy at the end are a problem |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1809 # of a different kind. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1810 del copy[picklecode] |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1811 else: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1812 raise ValueError("pickle.py appears to have a pickle opcode with " |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1813 "name %r and code %r, but we don't" % |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1814 (name, picklecode)) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1815 if copy: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1816 msg = ["we appear to have pickle opcodes that pickle.py doesn't have:"] |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1817 for code, d in copy.items(): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1818 msg.append(" name %r with code %r" % (d.name, code)) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1819 raise ValueError("\n".join(msg)) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1820 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1821 assure_pickle_consistency() |
|
27506
b480a4f707f6
pickle: Comment repair.
Tim Peters <tim.peters@gmail.com>
parents:
27473
diff
changeset
|
1822 del assure_pickle_consistency |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1823 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1824 ############################################################################## |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1825 # A pickle opcode generator. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1826 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1827 def genops(pickle): |
|
27424
93ba42cf4e53
Remove a stray quote.
Guido van Rossum <guido@python.org>
parents:
27423
diff
changeset
|
1828 """Generate all the opcodes in a pickle. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1829 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1830 'pickle' is a file-like object, or string, containing the pickle. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1831 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1832 Each opcode in the pickle is generated, from the current pickle position, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1833 stopping after a STOP opcode is delivered. A triple is generated for |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1834 each opcode: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1835 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1836 opcode, arg, pos |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1837 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1838 opcode is an OpcodeInfo record, describing the current opcode. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1839 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1840 If the opcode has an argument embedded in the pickle, arg is its decoded |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1841 value, as a Python object. If the opcode doesn't have an argument, arg |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1842 is None. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1843 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1844 If the pickle has a tell() method, pos was the value of pickle.tell() |
|
42501
f6069f9dd52d
SF patch# 1770008 by Christian Heimes (plus some extras).
Guido van Rossum <guido@python.org>
parents:
42322
diff
changeset
|
1845 before reading the current opcode. If the pickle is a bytes object, |
|
f6069f9dd52d
SF patch# 1770008 by Christian Heimes (plus some extras).
Guido van Rossum <guido@python.org>
parents:
42322
diff
changeset
|
1846 it's wrapped in a BytesIO object, and the latter's tell() result is |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1847 used. Else (the pickle doesn't have a tell(), and it's not obvious how |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1848 to query its current position) pos is None. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1849 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1850 |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43664
diff
changeset
|
1851 if isinstance(pickle, bytes_types): |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
1852 import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
1853 pickle = io.BytesIO(pickle) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1854 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1855 if hasattr(pickle, "tell"): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1856 getpos = pickle.tell |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1857 else: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1858 getpos = lambda: None |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1859 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1860 while True: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1861 pos = getpos() |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1862 code = pickle.read(1) |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
1863 opcode = code2op.get(code.decode("latin-1")) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1864 if opcode is None: |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
1865 if code == b"": |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1866 raise ValueError("pickle exhausted before seeing STOP") |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1867 else: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1868 raise ValueError("at position %s, opcode %r unknown" % ( |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1869 pos is None and "<unknown>" or pos, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1870 code)) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1871 if opcode.arg is None: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1872 arg = None |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1873 else: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1874 arg = opcode.arg.reader(pickle) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1875 yield opcode, arg, pos |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
1876 if code == b'.': |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1877 assert opcode.name == 'STOP' |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1878 break |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1879 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1880 ############################################################################## |
|
45278
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1881 # A pickle optimizer. |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1882 |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1883 def optimize(p): |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1884 'Optimize a pickle string by removing unused PUT opcodes' |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1885 gets = set() # set of args used by a GET opcode |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1886 puts = [] # (arg, startpos, stoppos) for the PUT opcodes |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1887 prevpos = None # set to pos if previous opcode was a PUT |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1888 for opcode, arg, pos in genops(p): |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1889 if prevpos is not None: |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1890 puts.append((prevarg, prevpos, pos)) |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1891 prevpos = None |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1892 if 'PUT' in opcode.name: |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1893 prevarg, prevpos = arg, pos |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1894 elif 'GET' in opcode.name: |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1895 gets.add(arg) |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1896 |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1897 # Copy the pickle string except for PUTS without a corresponding GET |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1898 s = [] |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1899 i = 0 |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1900 for arg, start, stop in puts: |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1901 j = stop if (arg in gets) else start |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1902 s.append(p[i:j]) |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1903 i = stop |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1904 s.append(p[i:]) |
|
45288
85b68d7d6f41
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60734 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45278
diff
changeset
|
1905 return b''.join(s) |
|
45278
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1906 |
|
e67050d62adf
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
1907 ############################################################################## |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1908 # A symbolic pickle disassembler. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1909 |
|
63055
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
1910 def dis(pickle, out=None, memo=None, indentlevel=4, annotate=0): |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1911 """Produce a symbolic disassembly of a pickle. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1912 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1913 'pickle' is a file-like object, or string, containing a (at least one) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1914 pickle. The pickle is disassembled from the current position, through |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1915 the first STOP opcode encountered. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1916 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1917 Optional arg 'out' is a file-like object to which the disassembly is |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1918 printed. It defaults to sys.stdout. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1919 |
|
27703
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
1920 Optional arg 'memo' is a Python dict, used as the pickle's memo. It |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
1921 may be mutated by dis(), if the pickle contains PUT or BINPUT opcodes. |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
1922 Passing the same memo object to another dis() call then allows disassembly |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
1923 to proceed across multiple pickles that were all created by the same |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
1924 pickler with the same memo. Ordinarily you don't need to worry about this. |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
1925 |
|
63055
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
1926 Optional arg 'indentlevel' is the number of blanks by which to indent |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1927 a new MARK level. It defaults to 4. |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1928 |
|
63055
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
1929 Optional arg 'annotate' if nonzero instructs dis() to add short |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
1930 description of the opcode on each line of disassembled output. |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
1931 The value given to 'annotate' must be an integer and is used as a |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
1932 hint for the column where annotation should start. The default |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
1933 value is 0, meaning no annotations. |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
1934 |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1935 In addition to printing the disassembly, some sanity checks are made: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1936 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1937 + All embedded opcode arguments "make sense". |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1938 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1939 + Explicit and implicit pop operations have enough items on the stack. |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1940 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1941 + When an opcode implicitly refers to a markobject, a markobject is |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1942 actually on the stack. |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1943 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1944 + A memo entry isn't referenced before it's defined. |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1945 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1946 + The markobject isn't stored in the memo. |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1947 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1948 + A memo entry isn't redefined. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1949 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1950 |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1951 # Most of the hair here is for sanity checks, but most of it is needed |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1952 # anyway to detect when a protocol 0 POP takes a MARK off the stack |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1953 # (which in turn is needed to indent MARK blocks correctly). |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1954 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1955 stack = [] # crude emulation of unpickler stack |
|
27703
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
1956 if memo is None: |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
1957 memo = {} # crude emulation of unpicker memo |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1958 maxproto = -1 # max protocol number seen |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1959 markstack = [] # bytecode positions of MARK opcodes |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1960 indentchunk = ' ' * indentlevel |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1961 errormsg = None |
|
63055
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
1962 annocol = annotate # columnt hint for annotations |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1963 for opcode, arg, pos in genops(pickle): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1964 if pos is not None: |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
1965 print("%5d:" % pos, end=' ', file=out) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1966 |
|
27471
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
1967 line = "%-4s %s%s" % (repr(opcode.code)[1:-1], |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
1968 indentchunk * len(markstack), |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
1969 opcode.name) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1970 |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1971 maxproto = max(maxproto, opcode.proto) |
|
27532
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
1972 before = opcode.stack_before # don't mutate |
|
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
1973 after = opcode.stack_after # don't mutate |
|
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
1974 numtopop = len(before) |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1975 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1976 # See whether a MARK should be popped. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1977 markmsg = None |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1978 if markobject in before or (opcode.name == "POP" and |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1979 stack and |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1980 stack[-1] is markobject): |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1981 assert markobject not in after |
|
27532
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
1982 if __debug__: |
|
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
1983 if markobject in before: |
|
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
1984 assert before[-1] is stackslice |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1985 if markstack: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1986 markpos = markstack.pop() |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1987 if markpos is None: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1988 markmsg = "(MARK at unknown opcode offset)" |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1989 else: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1990 markmsg = "(MARK at %d)" % markpos |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1991 # Pop everything at and after the topmost markobject. |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1992 while stack[-1] is not markobject: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1993 stack.pop() |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1994 stack.pop() |
|
27532
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
1995 # Stop later code from popping too much. |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1996 try: |
|
27532
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
1997 numtopop = before.index(markobject) |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1998 except ValueError: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
1999 assert opcode.name == "POP" |
|
27532
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
2000 numtopop = 0 |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2001 else: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2002 errormsg = markmsg = "no MARK exists on stack" |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2003 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2004 # Check for correct memo usage. |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2005 if opcode.name in ("PUT", "BINPUT", "LONG_BINPUT"): |
|
27532
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
2006 assert arg is not None |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2007 if arg in memo: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2008 errormsg = "memo key %r already defined" % arg |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2009 elif not stack: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2010 errormsg = "stack is empty -- can't store into memo" |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2011 elif stack[-1] is markobject: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2012 errormsg = "can't store markobject in the memo" |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2013 else: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2014 memo[arg] = stack[-1] |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2015 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2016 elif opcode.name in ("GET", "BINGET", "LONG_BINGET"): |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2017 if arg in memo: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2018 assert len(after) == 1 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2019 after = [memo[arg]] # for better stack emulation |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2020 else: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2021 errormsg = "memo key %r has never been stored into" % arg |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2022 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2023 if arg is not None or markmsg: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2024 # make a mild effort to align arguments |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2025 line += ' ' * (10 - len(opcode.name)) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2026 if arg is not None: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2027 line += ' ' + repr(arg) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2028 if markmsg: |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2029 line += ' ' + markmsg |
|
63055
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2030 if annotate: |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2031 line += ' ' * (annocol - len(line)) |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2032 # make a mild effort to align annotations |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2033 annocol = len(line) |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2034 if annocol > 50: |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2035 annocol = annotate |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2036 line += ' ' + opcode.doc.split('\n', 1)[0] |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
2037 print(line, file=out) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2038 |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2039 if errormsg: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2040 # Note that we delayed complaining until the offending opcode |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2041 # was printed. |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2042 raise ValueError(errormsg) |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2043 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2044 # Emulate the stack effects. |
|
27532
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
2045 if len(stack) < numtopop: |
|
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
2046 raise ValueError("tries to pop %d items from stack with " |
|
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
2047 "only %d items" % (numtopop, len(stack))) |
|
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
2048 if numtopop: |
|
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
2049 del stack[-numtopop:] |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2050 if markobject in after: |
|
27532
02f138c639a0
dis(): Simplified stack emulation a bit.
Tim Peters <tim.peters@gmail.com>
parents:
27522
diff
changeset
|
2051 assert markobject not in before |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2052 markstack.append(pos) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2053 |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2054 stack.extend(after) |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2055 |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
2056 print("highest protocol among opcodes =", maxproto, file=out) |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2057 if stack: |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2058 raise ValueError("stack not empty after STOP: %r" % stack) |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2059 |
|
34590
ff3def77b129
An instance of class PicklingError was used here simply as an example of
Tim Peters <tim.peters@gmail.com>
parents:
34128
diff
changeset
|
2060 # For use in the doctest, simply as an example of a class to pickle. |
|
ff3def77b129
An instance of class PicklingError was used here simply as an example of
Tim Peters <tim.peters@gmail.com>
parents:
34128
diff
changeset
|
2061 class _Example: |
|
ff3def77b129
An instance of class PicklingError was used here simply as an example of
Tim Peters <tim.peters@gmail.com>
parents:
34128
diff
changeset
|
2062 def __init__(self, value): |
|
ff3def77b129
An instance of class PicklingError was used here simply as an example of
Tim Peters <tim.peters@gmail.com>
parents:
34128
diff
changeset
|
2063 self.value = value |
|
ff3def77b129
An instance of class PicklingError was used here simply as an example of
Tim Peters <tim.peters@gmail.com>
parents:
34128
diff
changeset
|
2064 |
|
27472
de4061584c83
_dis_test should be a raw string now that it contains \x escapes.
Guido van Rossum <guido@python.org>
parents:
27471
diff
changeset
|
2065 _dis_test = r""" |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2066 >>> import pickle |
|
45812
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
2067 >>> x = [1, 2, (3, 4), {b'abc': "def"}] |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
2068 >>> pkl0 = pickle.dumps(x, 0) |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
2069 >>> dis(pkl0) |
|
27471
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2070 0: ( MARK |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2071 1: l LIST (MARK at 0) |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2072 2: p PUT 0 |
|
40640
6f5b33947274
Fix pickletools doctests -- all we get nowadays is longs.
Guido van Rossum <guido@python.org>
parents:
39575
diff
changeset
|
2073 5: L LONG 1 |
|
50946
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2074 9: a APPEND |
|
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2075 10: L LONG 2 |
|
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2076 14: a APPEND |
|
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2077 15: ( MARK |
|
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2078 16: L LONG 3 |
|
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2079 20: L LONG 4 |
|
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2080 24: t TUPLE (MARK at 15) |
|
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2081 25: p PUT 1 |
|
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2082 28: a APPEND |
|
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2083 29: ( MARK |
|
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2084 30: d DICT (MARK at 29) |
|
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2085 31: p PUT 2 |
|
73957
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2086 34: c GLOBAL '_codecs encode' |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2087 50: p PUT 3 |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2088 53: ( MARK |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2089 54: V UNICODE 'abc' |
|
54584
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2090 59: p PUT 4 |
|
73957
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2091 62: V UNICODE 'latin1' |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2092 70: p PUT 5 |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2093 73: t TUPLE (MARK at 53) |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2094 74: p PUT 6 |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2095 77: R REDUCE |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2096 78: p PUT 7 |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2097 81: V UNICODE 'def' |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2098 86: p PUT 8 |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2099 89: s SETITEM |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2100 90: a APPEND |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2101 91: . STOP |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2102 highest protocol among opcodes = 0 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2103 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2104 Try again with a "binary" pickle. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2105 |
|
45812
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
2106 >>> pkl1 = pickle.dumps(x, 1) |
|
322693bf10ca
- A new pickle protocol (protocol 3) is added with explicit support
Guido van Rossum <guido@python.org>
parents:
45288
diff
changeset
|
2107 >>> dis(pkl1) |
|
27471
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2108 0: ] EMPTY_LIST |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2109 1: q BINPUT 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2110 3: ( MARK |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2111 4: K BININT1 1 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2112 6: K BININT1 2 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2113 8: ( MARK |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2114 9: K BININT1 3 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2115 11: K BININT1 4 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2116 13: t TUPLE (MARK at 8) |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2117 14: q BINPUT 1 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2118 16: } EMPTY_DICT |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2119 17: q BINPUT 2 |
|
73957
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2120 19: c GLOBAL '_codecs encode' |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2121 35: q BINPUT 3 |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2122 37: ( MARK |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2123 38: X BINUNICODE 'abc' |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2124 46: q BINPUT 4 |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2125 48: X BINUNICODE 'latin1' |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2126 59: q BINPUT 5 |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2127 61: t TUPLE (MARK at 37) |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2128 62: q BINPUT 6 |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2129 64: R REDUCE |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2130 65: q BINPUT 7 |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2131 67: X BINUNICODE 'def' |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2132 75: q BINPUT 8 |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2133 77: s SETITEM |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2134 78: e APPENDS (MARK at 3) |
|
14695b4825dc
Issue #13505: Make pickling of bytes object compatible with Python 2.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
68586
diff
changeset
|
2135 79: . STOP |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2136 highest protocol among opcodes = 1 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2137 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2138 Exercise the INST/OBJ/BUILD family. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2139 |
|
51022
f7f3d841da2c
Merged revisions 68908 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50946
diff
changeset
|
2140 >>> import pickletools |
|
f7f3d841da2c
Merged revisions 68908 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50946
diff
changeset
|
2141 >>> dis(pickle.dumps(pickletools.dis, 0)) |
|
f7f3d841da2c
Merged revisions 68908 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50946
diff
changeset
|
2142 0: c GLOBAL 'pickletools dis' |
|
f7f3d841da2c
Merged revisions 68908 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50946
diff
changeset
|
2143 17: p PUT 0 |
|
f7f3d841da2c
Merged revisions 68908 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50946
diff
changeset
|
2144 20: . STOP |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2145 highest protocol among opcodes = 0 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2146 |
|
34590
ff3def77b129
An instance of class PicklingError was used here simply as an example of
Tim Peters <tim.peters@gmail.com>
parents:
34128
diff
changeset
|
2147 >>> from pickletools import _Example |
|
ff3def77b129
An instance of class PicklingError was used here simply as an example of
Tim Peters <tim.peters@gmail.com>
parents:
34128
diff
changeset
|
2148 >>> x = [_Example(42)] * 2 |
|
27431
f8a90085acc4
Begin the change from 'binary vs. text mode' to 'protocol 0, 1, 2'.
Guido van Rossum <guido@python.org>
parents:
27429
diff
changeset
|
2149 >>> dis(pickle.dumps(x, 0)) |
|
27471
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2150 0: ( MARK |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2151 1: l LIST (MARK at 0) |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2152 2: p PUT 0 |
|
54584
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2153 5: c GLOBAL 'copy_reg _reconstructor' |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2154 30: p PUT 1 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2155 33: ( MARK |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2156 34: c GLOBAL 'pickletools _Example' |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2157 56: p PUT 2 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2158 59: c GLOBAL '__builtin__ object' |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2159 79: p PUT 3 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2160 82: N NONE |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2161 83: t TUPLE (MARK at 33) |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2162 84: p PUT 4 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2163 87: R REDUCE |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2164 88: p PUT 5 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2165 91: ( MARK |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2166 92: d DICT (MARK at 91) |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2167 93: p PUT 6 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2168 96: V UNICODE 'value' |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2169 103: p PUT 7 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2170 106: L LONG 42 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2171 111: s SETITEM |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2172 112: b BUILD |
|
50946
a57d10d6bc89
Merged revisions 68814-68815 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47645
diff
changeset
|
2173 113: a APPEND |
|
54584
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2174 114: g GET 5 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2175 117: a APPEND |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2176 118: . STOP |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2177 highest protocol among opcodes = 0 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2178 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2179 >>> dis(pickle.dumps(x, 1)) |
|
27471
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2180 0: ] EMPTY_LIST |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2181 1: q BINPUT 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2182 3: ( MARK |
|
54584
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2183 4: c GLOBAL 'copy_reg _reconstructor' |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2184 29: q BINPUT 1 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2185 31: ( MARK |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2186 32: c GLOBAL 'pickletools _Example' |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2187 54: q BINPUT 2 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2188 56: c GLOBAL '__builtin__ object' |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2189 76: q BINPUT 3 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2190 78: N NONE |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2191 79: t TUPLE (MARK at 31) |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2192 80: q BINPUT 4 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2193 82: R REDUCE |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2194 83: q BINPUT 5 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2195 85: } EMPTY_DICT |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2196 86: q BINPUT 6 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2197 88: X BINUNICODE 'value' |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2198 98: q BINPUT 7 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2199 100: K BININT1 42 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2200 102: s SETITEM |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2201 103: b BUILD |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2202 104: h BINGET 5 |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2203 106: e APPENDS (MARK at 3) |
|
0805ea211122
Issue #6137: The pickle module now translates module names when loading
Antoine Pitrou <solipsis@pitrou.net>
parents:
54215
diff
changeset
|
2204 107: . STOP |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2205 highest protocol among opcodes = 1 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2206 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2207 Try "the canonical" recursive-object test. |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2208 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2209 >>> L = [] |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2210 >>> T = L, |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2211 >>> L.append(T) |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2212 >>> L[0] is T |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2213 True |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2214 >>> T[0] is L |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2215 True |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2216 >>> L[0][0] is L |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2217 True |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2218 >>> T[0][0] is T |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2219 True |
|
27431
f8a90085acc4
Begin the change from 'binary vs. text mode' to 'protocol 0, 1, 2'.
Guido van Rossum <guido@python.org>
parents:
27429
diff
changeset
|
2220 >>> dis(pickle.dumps(L, 0)) |
|
27471
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2221 0: ( MARK |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2222 1: l LIST (MARK at 0) |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2223 2: p PUT 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2224 5: ( MARK |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2225 6: g GET 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2226 9: t TUPLE (MARK at 5) |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2227 10: p PUT 1 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2228 13: a APPEND |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2229 14: . STOP |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2230 highest protocol among opcodes = 0 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2231 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2232 >>> dis(pickle.dumps(L, 1)) |
|
27471
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2233 0: ] EMPTY_LIST |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2234 1: q BINPUT 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2235 3: ( MARK |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2236 4: h BINGET 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2237 6: t TUPLE (MARK at 3) |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2238 7: q BINPUT 1 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2239 9: a APPEND |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2240 10: . STOP |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2241 highest protocol among opcodes = 1 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2242 |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2243 Note that, in the protocol 0 pickle of the recursive tuple, the disassembler |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2244 has to emulate the stack in order to realize that the POP opcode at 16 gets |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2245 rid of the MARK at 0. |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2246 |
|
27431
f8a90085acc4
Begin the change from 'binary vs. text mode' to 'protocol 0, 1, 2'.
Guido van Rossum <guido@python.org>
parents:
27429
diff
changeset
|
2247 >>> dis(pickle.dumps(T, 0)) |
|
27471
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2248 0: ( MARK |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2249 1: ( MARK |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2250 2: l LIST (MARK at 1) |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2251 3: p PUT 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2252 6: ( MARK |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2253 7: g GET 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2254 10: t TUPLE (MARK at 6) |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2255 11: p PUT 1 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2256 14: a APPEND |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2257 15: 0 POP |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2258 16: 0 POP (MARK at 0) |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2259 17: g GET 1 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2260 20: . STOP |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2261 highest protocol among opcodes = 0 |
|
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2262 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2263 >>> dis(pickle.dumps(T, 1)) |
|
27471
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2264 0: ( MARK |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2265 1: ] EMPTY_LIST |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2266 2: q BINPUT 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2267 4: ( MARK |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2268 5: h BINGET 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2269 7: t TUPLE (MARK at 4) |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2270 8: q BINPUT 1 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2271 10: a APPEND |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2272 11: 1 POP_MARK (MARK at 0) |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2273 12: h BINGET 1 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2274 14: . STOP |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2275 highest protocol among opcodes = 1 |
|
27471
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2276 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2277 Try protocol 2. |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2278 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2279 >>> dis(pickle.dumps(L, 2)) |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2280 0: \x80 PROTO 2 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2281 2: ] EMPTY_LIST |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2282 3: q BINPUT 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2283 5: h BINGET 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2284 7: \x85 TUPLE1 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2285 8: q BINPUT 1 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2286 10: a APPEND |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2287 11: . STOP |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2288 highest protocol among opcodes = 2 |
|
27471
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2289 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2290 >>> dis(pickle.dumps(T, 2)) |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2291 0: \x80 PROTO 2 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2292 2: ] EMPTY_LIST |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2293 3: q BINPUT 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2294 5: h BINGET 0 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2295 7: \x85 TUPLE1 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2296 8: q BINPUT 1 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2297 10: a APPEND |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2298 11: 0 POP |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2299 12: h BINGET 1 |
|
05f7e1c65d7e
dis(): Not all opcodes are printable anymore, so print the repr
Tim Peters <tim.peters@gmail.com>
parents:
27468
diff
changeset
|
2300 14: . STOP |
|
27522
0f9eb8413b61
dis(): This had a problem with proto 0 pickles, in that POP sometimes
Tim Peters <tim.peters@gmail.com>
parents:
27518
diff
changeset
|
2301 highest protocol among opcodes = 2 |
|
63055
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2302 |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2303 Try protocol 3 with annotations: |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2304 |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2305 >>> dis(pickle.dumps(T, 3), annotate=1) |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2306 0: \x80 PROTO 3 Protocol version indicator. |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2307 2: ] EMPTY_LIST Push an empty list. |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2308 3: q BINPUT 0 Store the stack top into the memo. The stack is not popped. |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2309 5: h BINGET 0 Read an object from the memo and push it on the stack. |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2310 7: \x85 TUPLE1 Build a one-tuple out of the topmost item on the stack. |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2311 8: q BINPUT 1 Store the stack top into the memo. The stack is not popped. |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2312 10: a APPEND Append an object to a list. |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2313 11: 0 POP Discard the top stack item, shrinking the stack by one item. |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2314 12: h BINGET 1 Read an object from the memo and push it on the stack. |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2315 14: . STOP Stop the unpickling machine. |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2316 highest protocol among opcodes = 2 |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2317 |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2318 """ |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2319 |
|
27703
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2320 _memo_test = r""" |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2321 >>> import pickle |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
2322 >>> import io |
|
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
2323 >>> f = io.BytesIO() |
|
27703
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2324 >>> p = pickle.Pickler(f, 2) |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2325 >>> x = [1, 2, 3] |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2326 >>> p.dump(x) |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2327 >>> p.dump(x) |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2328 >>> f.seek(0) |
|
41651
44ebae4f61c4
Got test_pickletools and test_pickle working.
Guido van Rossum <guido@python.org>
parents:
41643
diff
changeset
|
2329 0 |
|
27703
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2330 >>> memo = {} |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2331 >>> dis(f, memo=memo) |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2332 0: \x80 PROTO 2 |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2333 2: ] EMPTY_LIST |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2334 3: q BINPUT 0 |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2335 5: ( MARK |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2336 6: K BININT1 1 |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2337 8: K BININT1 2 |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2338 10: K BININT1 3 |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2339 12: e APPENDS (MARK at 5) |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2340 13: . STOP |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2341 highest protocol among opcodes = 2 |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2342 >>> dis(f, memo=memo) |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2343 14: \x80 PROTO 2 |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2344 16: h BINGET 0 |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2345 18: . STOP |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2346 highest protocol among opcodes = 2 |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2347 """ |
|
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2348 |
|
27468
6ffafcef98fb
Fix one disassembly output now that empty tuples are no longer
Guido van Rossum <guido@python.org>
parents:
27463
diff
changeset
|
2349 __test__ = {'disassembler_test': _dis_test, |
|
27703
0428d59069a9
dis(): Added an optional memo argument, so that multiple pickles in a
Tim Peters <tim.peters@gmail.com>
parents:
27552
diff
changeset
|
2350 'disassembler_memo_test': _memo_test, |
|
27421
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2351 } |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2352 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2353 def _test(): |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2354 import doctest |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2355 return doctest.testmod() |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2356 |
|
0aeaa3d1e0ff
Moving pickletools.py from the sandbox into the std library. I started
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2357 if __name__ == "__main__": |
|
62752
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2358 import sys, argparse |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2359 parser = argparse.ArgumentParser( |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2360 description='disassemble one or more pickle files') |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2361 parser.add_argument( |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2362 'pickle_file', type=argparse.FileType('br'), |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2363 nargs='*', help='the pickle file') |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2364 parser.add_argument( |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2365 '-o', '--output', default=sys.stdout, type=argparse.FileType('w'), |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2366 help='the file where the output should be written') |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2367 parser.add_argument( |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2368 '-m', '--memo', action='store_true', |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2369 help='preserve memo between disassemblies') |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2370 parser.add_argument( |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2371 '-l', '--indentlevel', default=4, type=int, |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2372 help='the number of blanks by which to indent a new MARK level') |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2373 parser.add_argument( |
|
63055
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2374 '-a', '--annotate', action='store_true', |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2375 help='annotate each line with a short opcode description') |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2376 parser.add_argument( |
|
62752
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2377 '-p', '--preamble', default="==> {name} <==", |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2378 help='if more than one pickle file is specified, print this before' |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2379 ' each disassembly') |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2380 parser.add_argument( |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2381 '-t', '--test', action='store_true', |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2382 help='run self-test suite') |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2383 parser.add_argument( |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2384 '-v', action='store_true', |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2385 help='run verbosely; only affects self-test run') |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2386 args = parser.parse_args() |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2387 if args.test: |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2388 _test() |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2389 else: |
|
63055
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2390 annotate = 30 if args.annotate else 0 |
|
62752
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2391 if not args.pickle_file: |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2392 parser.print_help() |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2393 elif len(args.pickle_file) == 1: |
|
63055
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2394 dis(args.pickle_file[0], args.output, None, |
|
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2395 args.indentlevel, annotate) |
|
62752
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2396 else: |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2397 memo = {} if args.memo else None |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2398 for f in args.pickle_file: |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2399 preamble = args.preamble.format(name=f.name) |
|
e42baf678d14
Issue #9094: Make python -m pickletools disassemble pickles given in
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
60577
diff
changeset
|
2400 args.output.write(preamble + '\n') |
|
63055
cf4b833a47de
Issue #9268: Add annotation option to pickletools.dis
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63040
diff
changeset
|
2401 dis(f, args.output, memo, args.indentlevel, annotate) |
