| 2222 | del d |
| 2223 | |
| 2224 | def assure_pickle_consistency(verbose=False): |
| 2225 | |
| 2226 | copy = code2op.copy() |
| 2227 | for name in pickle.__all__: |
| 2228 | if not re.match("[A-Z][A-Z0-9_]+$", name): |
| 2229 | if verbose: |
| 2230 | print("skipping %r: it doesn't look like an opcode name" % name) |
| 2231 | continue |
| 2232 | picklecode = getattr(pickle, name) |
| 2233 | if not isinstance(picklecode, bytes) or len(picklecode) != 1: |
| 2234 | if verbose: |
| 2235 | print(("skipping %r: value %r doesn't look like a pickle " |
| 2236 | "code" % (name, picklecode))) |
| 2237 | continue |
| 2238 | picklecode = picklecode.decode("latin-1") |
| 2239 | if picklecode in copy: |
| 2240 | if verbose: |
| 2241 | print("checking name %r w/ code %r for consistency" % ( |
| 2242 | name, picklecode)) |
| 2243 | d = copy[picklecode] |
| 2244 | if d.name != name: |
| 2245 | raise ValueError("for pickle code %r, pickle.py uses name %r " |
| 2246 | "but we're using name %r" % (picklecode, |
| 2247 | name, |
| 2248 | d.name)) |
| 2249 | # Forget this one. Any left over in copy at the end are a problem |
| 2250 | # of a different kind. |
| 2251 | del copy[picklecode] |
| 2252 | else: |
| 2253 | raise ValueError("pickle.py appears to have a pickle opcode with " |
| 2254 | "name %r and code %r, but we don't" % |
| 2255 | (name, picklecode)) |
| 2256 | if copy: |
| 2257 | msg = ["we appear to have pickle opcodes that pickle.py doesn't have:"] |
| 2258 | for code, d in copy.items(): |
| 2259 | msg.append(" name %r with code %r" % (d.name, code)) |
| 2260 | raise ValueError("\n".join(msg)) |
| 2261 | |
| 2262 | assure_pickle_consistency() |
| 2263 | del assure_pickle_consistency |