[Python-checkins] python/dist/src/Lib pickle.py,1.101,1.102

gvanrossum@users.sourceforge.net gvanrossum@users.sourceforge.net
Mon, 27 Jan 2003 20:14:53 -0800


Update of /cvsroot/python/python/dist/src/Lib
In directory sc8-pr-cvs1:/tmp/cvs-serv17311

Modified Files:
	pickle.py 
Log Message:
More protocol 2: TUPLE1, TUPLE2, TUPLE3.

Also moved the special case for empty tuples from save() to save_tuple().



Index: pickle.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/pickle.py,v
retrieving revision 1.101
retrieving revision 1.102
diff -C2 -d -r1.101 -r1.102
*** pickle.py	28 Jan 2003 03:51:36 -0000	1.101
--- pickle.py	28 Jan 2003 04:14:50 -0000	1.102
***************
*** 151,154 ****
--- 151,156 ----
  LONG4           = '\x8b'  # push really big long
  
+ _tuplesize2code = [EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3]
+ 
  
  __all__.extend([x for x in dir() if re.match("[A-Z][A-Z0-9_]+$",x)])
***************
*** 258,269 ****
          t = type(object)
  
-         # XXX Why are tuples a special case here?
-         if (t is TupleType) and (len(object) == 0):
-             if self.bin:
-                 self.save_empty_tuple(object)
-             else:
-                 self.save_tuple(object)
-             return
- 
          if d in memo:
              self.write(self.get(memo[d][0]))
--- 260,263 ----
***************
*** 464,467 ****
--- 458,479 ----
          save  = self.save
          memo  = self.memo
+         proto = self.proto
+ 
+         if proto >= 1:
+             n = len(object)
+             if n <= 3:
+                 if not object:
+                     write(EMPTY_TUPLE)
+                     return
+                 if proto >= 2:
+                     for element in object:
+                         save(element)
+                     # Subtle.  Same as in the big comment below
+                     if id(object) in memo:
+                         get = self.get(memo[id(object)][0])
+                         write(POP_MARK + get)
+                     else:
+                         write(_tuplesize2code[n])
+                     return
  
          write(MARK)
***************
*** 478,482 ****
              # recursive tuples are a rare thing.
              get = self.get(memo[id(object)][0])
!             if self.bin:
                  write(POP_MARK + get)
              else:   # proto 0 -- POP_MARK not available
--- 490,494 ----
              # recursive tuples are a rare thing.
              get = self.get(memo[id(object)][0])
!             if proto:
                  write(POP_MARK + get)
              else:   # proto 0 -- POP_MARK not available
***************
*** 484,490 ****
              return
  
!         # No recursion (including the empty-tuple case).
          self.write(TUPLE)
!         self.memoize(object)
  
      dispatch[TupleType] = save_tuple
--- 496,502 ----
              return
  
!         # No recursion (including the empty-tuple case for protocol 0).
          self.write(TUPLE)
!         self.memoize(object) # XXX shouldn't memoize empty tuple?!
  
      dispatch[TupleType] = save_tuple
***************
*** 876,879 ****
--- 888,903 ----
          self.stack.append(())
      dispatch[EMPTY_TUPLE] = load_empty_tuple
+ 
+     def load_tuple1(self):
+         self.stack[-1] = (self.stack[-1],)
+     dispatch[TUPLE1] = load_tuple1
+ 
+     def load_tuple2(self):
+         self.stack[-2:] = [(self.stack[-2], self.stack[-1])]
+     dispatch[TUPLE2] = load_tuple2
+ 
+     def load_tuple3(self):
+         self.stack[-3:] = [(self.stack[-3], self.stack[-2], self.stack[-1])]
+     dispatch[TUPLE3] = load_tuple3
  
      def load_empty_list(self):