[Python-checkins] python/nondist/sandbox/pickletools pickletools.py,1.17,1.18

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
Sun, 26 Jan 2003 09:29:49 -0800


Update of /cvsroot/python/python/nondist/sandbox/pickletools
In directory sc8-pr-cvs1:/tmp/cvs-serv12022

Modified Files:
	pickletools.py 
Log Message:
Ensure this module is defiing the same opcode names, with the same opcode
codes, as pickle.py.


Index: pickletools.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/pickletools/pickletools.py,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** pickletools.py	26 Jan 2003 16:10:46 -0000	1.17
--- pickletools.py	26 Jan 2003 17:29:46 -0000	1.18
***************
*** 1256,1259 ****
--- 1256,1310 ----
  del name2i, code2i, i, d
  
+ ##############################################################################
+ # Build a code2op dict, mapping opcode characters to OpcodeInfo records.
+ # Also ensure we've got the same stuff as pickle.py, although the
+ # introspection here is dicey.
+ 
+ code2op = {}
+ for d in opcodes:
+     code2op[d.code] = d
+ del d
+ 
+ def assure_pickle_consistency(verbose=False):
+     import pickle, re
+ 
+     copy = code2op.copy()
+     for name in pickle.__all__:
+         if not re.match("[A-Z][A-Z0-9_]+$", name):
+             if verbose:
+                 print "skipping %r: it doesn't look like an opcode name" % name
+             continue
+         picklecode = getattr(pickle, name)
+         if not isinstance(picklecode, str) or len(picklecode) != 1:
+             if verbose:
+                 print ("skipping %r: value %r doesn't look like a pickle "
+                        "code" % (name, picklecode))
+             continue
+         if picklecode in copy:
+             if verbose:
+                 print "checking name %r w/ code %r for consistency" % (
+                       name, picklecode)
+             d = copy[picklecode]
+             if d.name != name:
+                 raise ValueError("for pickle code %r, pickle.py uses name %r "
+                                  "but we're using name %r" % (picklecode,
+                                                               name,
+                                                               d.name))
+             # Forget this one.  Any left over in copy at the end are a problem
+             # of a different kind.
+             del copy[picklecode]
+         else:
+             raise ValueError("pickle.py appears to have a pickle opcode with "
+                              "name %r and code %r, but we don't" %
+                              (name, picklecode))
+     if copy:
+         msg = ["we appear to have pickle opcodes that pickle.py doesn't have:"]
+         for code, d in copy.items():
+             msg.append("    name %r with code %r" % (d.name, code))
+         raise ValueError("\n".join(msg))
+ 
+ assure_pickle_consistency()
+ 
+ 
  def _test():
      import doctest