Author: Anton Gulenko <anton.gule...@googlemail.com>
Branch: storage
Changeset: r860:a5b744a0ec04
Date: 2014-07-01 17:21 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/a5b744a0ec04/

Log:    Using 4 bytes to encode object size due to large objects in Squeak
        image.

diff --git a/spyvm/storage_logger.py b/spyvm/storage_logger.py
--- a/spyvm/storage_logger.py
+++ b/spyvm/storage_logger.py
@@ -71,19 +71,26 @@
     assert new_storage in storage_map, "Cannot handle new-storage type %s" % 
new_storage
     bytes.append(storage_map[new_storage])
     
-    # Next: 2 bytes encoding object size (big endian)
-    assert size < 2**16, "Object of type %s too large (size %d)" % (classname, 
size)
+    # Next: 4 bytes encoding object size (big endian)
+    # Assert not compiling in RPython
+    # assert size < 2**32, "Object of type %s too large (size %d)" % 
(classname, size)
     mask = (1<<8)-1
-    bytes.append(size & mask)
+    shift = 0
+    bytes.append((size & mask) >> shift)
     mask = mask<<8
-    bytes.append((size & mask) >> 8)
+    shift += 8
+    bytes.append((size & mask) >> shift)
+    mask = mask<<8
+    shift += 8
+    bytes.append((size & mask) >> shift)
+    mask = mask<<8
+    shift += 8
+    bytes.append((size & mask) >> shift)
     
     # Next: classname string plus terminating null-character
-    i = 5
     if classname:
         for c in classname:
             bytes.append(ord(c))
-            i += 1
     bytes.append(0)
     
     # No simpler way for RPython's sake.
diff --git a/spyvm/tool/storagelog_parser.py b/spyvm/tool/storagelog_parser.py
--- a/spyvm/tool/storagelog_parser.py
+++ b/spyvm/tool/storagelog_parser.py
@@ -57,9 +57,9 @@
     old_storage = storage_map[old_storage_byte]
     new_storage = storage_map[new_storage_byte]
     
-    # Next 2 bytes: object size (big endian)
-    size_bytes = file.read(2)
-    size = int(ord(size_bytes[0]) + (ord(size_bytes[1])<<8))
+    # Next 4 bytes: object size (big endian)
+    size_bytes = file.read(4)
+    size = int(ord(size_bytes[0]) + (ord(size_bytes[1])<<8) + 
(ord(size_bytes[2])<<16) + (ord(size_bytes[3])<<24))
     
     # Last: classname, nul-terminated
     classname = ""
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to