[pypy-svn] r52548 - pypy/dist/pypy/rlib

arigo at codespeak.net arigo at codespeak.net
Sat Mar 15 09:15:34 CET 2008


Author: arigo
Date: Sat Mar 15 09:15:34 2008
New Revision: 52548

Modified:
   pypy/dist/pypy/rlib/rmd5.py
Log:
The same allocation-avoiding approach for rmd5.


Modified: pypy/dist/pypy/rlib/rmd5.py
==============================================================================
--- pypy/dist/pypy/rlib/rmd5.py	(original)
+++ pypy/dist/pypy/rlib/rmd5.py	Sat Mar 15 09:15:34 2008
@@ -66,19 +66,17 @@
         hx[(d>>20)&0xF], hx[(d>>16)&0xF], hx[(d>>28)&0xF], hx[(d>>24)&0xF],
         ])
 
-def _string2uintlist(s, start=0, count=16):
+def _string2uintlist(s, start, count, result):
     """Build a list of count r_uint's by unpacking the string
     s[start:start+4*count] in little-endian order.
     """
-    result = []
     for i in range(count):
         p = start + i * 4
         x = r_uint(ord(s[p]))
         x |= r_uint(ord(s[p+1])) << 8
         x |= r_uint(ord(s[p+2])) << 16
         x |= r_uint(ord(s[p+3])) << 24
-        result.append(x)
-    return result
+        result[i] = x
 
 
 # ======================================================================
@@ -136,6 +134,7 @@
         """
         self.count = r_ulonglong(0)   # total number of bytes
         self.input = ""   # pending unprocessed data, < 64 bytes
+        self.uintbuffer = [r_uint(0)] * 16
 
         # Load magic initialization constants.
         self.A = r_uint(0x67452301L)
@@ -269,12 +268,12 @@
 
         # Append length (before padding).
         assert len(self.input) == 56
-        bits = _string2uintlist(self.input, 0, 56 // 4)
+        W = self.uintbuffer
+        _string2uintlist(self.input, 0, 14, W)
         length_in_bits = count << 3
-        bits.append(r_uint(length_in_bits))
-        bits.append(r_uint(length_in_bits >> 32))
-
-        self._transform(bits)
+        W[14] = r_uint(length_in_bits)
+        W[15] = r_uint(length_in_bits >> 32)
+        self._transform(W)
 
         # Store state in digest.
         digest = digestfunc(self.A, self.B, self.C, self.D)
@@ -315,11 +314,14 @@
         assert partLen > 0
 
         if leninBuf >= partLen:
+            W = self.uintbuffer
             self.input = self.input + inBuf[:partLen]
-            self._transform(_string2uintlist(self.input))
+            _string2uintlist(self.input, 0, 16, W)
+            self._transform(W)
             i = partLen
             while i + 64 <= leninBuf:
-                self._transform(_string2uintlist(inBuf, i))
+                _string2uintlist(inBuf, i, 16, W)
+                self._transform(W)
                 i = i + 64
             else:
                 self.input = inBuf[i:leninBuf]



More information about the Pypy-commit mailing list