[Zope3-checkins] CVS: Zope3/src/ZODB - Connection.py:1.144 utils.py:1.21

Tim Peters tim.one at comcast.net
Tue Apr 6 17:47:43 EDT 2004


Update of /cvs-repository/Zope3/src/ZODB
In directory cvs.zope.org:/tmp/cvs-serv14114/src/ZODB

Modified Files:
	Connection.py utils.py 
Log Message:
ZODB.utils grows a new function positive_id(), which returns the id() of
an object as a non-negative integer.  Code trying to pass addresses to
an %x format uses positive_id(), and this avoids a Python FutureWarning
about applying %x to negative ints.  The primary difference between this
and the last stab is that positive_id() should work OK on 64-bit boxes
too.  What we really want here is C's %p format code, but in Python we
can't even reliably know the width of native addresses.


=== Zope3/src/ZODB/Connection.py 1.143 => 1.144 ===
--- Zope3/src/ZODB/Connection.py:1.143	Tue Apr  6 16:21:55 2004
+++ Zope3/src/ZODB/Connection.py	Tue Apr  6 17:47:12 2004
@@ -33,7 +33,7 @@
 from ZODB.POSException \
      import ConflictError, ReadConflictError, InvalidObjectReference
 from ZODB.TmpStore import TmpStore
-from ZODB.utils import oid_repr, z64
+from ZODB.utils import oid_repr, z64, positive_id
 from ZODB.serialize import ObjectWriter, ConnectionObjectReader, myhasattr
 
 global_reset_counter = 0
@@ -223,9 +223,7 @@
             ver = ' (in version %s)' % `self._version`
         else:
             ver = ''
-        # Force the address to look positive.  A negative address will
-        # show up as signed in Python 2.4, and in 2.3 raises FutureWarning.
-        return '<Connection at %08x%s>' % (id(self) & 0xffffffffL, ver)
+        return '<Connection at %08x%s>' % (positive_id(self), ver)
 
     def get(self, oid):
         """Return the persistent object with oid 'oid'.


=== Zope3/src/ZODB/utils.py 1.20 => 1.21 ===
--- Zope3/src/ZODB/utils.py:1.20	Mon Dec 29 16:24:16 2003
+++ Zope3/src/ZODB/utils.py	Tue Apr  6 17:47:12 2004
@@ -69,3 +69,26 @@
         return repr(oid)
 
 serial_repr = oid_repr
+
+# Addresses can "look negative" on some boxes, some of the time.  If you
+# feed a "negative address" to an %x format, Python 2.3 displays it as
+# unsigned, but produces a FutureWarning, because Python 2.4 will display
+# it as signed.  So when you want to prodce an address, use positive_id() to
+# obtain it.
+def positive_id(obj):
+    """Return id(obj) as a non-negative integer."""
+
+    result = id(obj)
+    if result < 0:
+        # This is a puzzle:  there's no way to know the natural width of
+        # addresses on this box (in particular, there's no necessary
+        # relation to sys.maxint).  Try 32 bits first (and on a 32-bit
+        # box, adding 2**32 gives a positive number with the same hex
+        # representation as the original result).
+        result += 1L << 32
+        if result < 0:
+            # Undo that, and try 64 bits.
+            result -= 1L << 32
+            result += 1L << 64
+            assert result >= 0 # else addresses are fatter than 64 bits
+    return result




More information about the Zope3-Checkins mailing list