[pypy-commit] lang-smalltalk storage-cleanups: Fixed translation.

anton_gulenko noreply at buildbot.pypy.org
Wed Aug 6 13:38:36 CEST 2014


Author: Anton Gulenko <anton.gulenko at googlemail.com>
Branch: storage-cleanups
Changeset: r1021:218915d01567
Date: 2014-08-06 13:37 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/218915d01567/

Log:	Fixed translation. Now able to parse 64-bit versions when
	translating in 32-bit mode; but will raise an error that image
	cannot be handled.

diff --git a/spyvm/squeakimage.py b/spyvm/squeakimage.py
--- a/spyvm/squeakimage.py
+++ b/spyvm/squeakimage.py
@@ -1,6 +1,6 @@
 import os, time
 from spyvm import constants, model, util, error
-from spyvm.util import stream
+from spyvm.util import stream, system
 from spyvm.util.bitmanipulation import splitter
 from rpython.rlib import objectmodel
 
@@ -32,6 +32,8 @@
     def configure_stream(self, stream):
         stream.big_endian = self.is_big_endian
         if self.is_64bit:
+            if not system.IS_64BIT:
+                raise error.FatalError("Cannot handle 64-bit image.")
             stream.be_64bit()
         else:
             stream.be_32bit()
@@ -43,14 +45,16 @@
     0x68190000:         ImageVersion(6504,  False, False, True,  False),
     0x00001969:         ImageVersion(6505,  True,  False, True,  True ),
     0x69190000:         ImageVersion(6505,  False, False, True,  True ),
-    
-    # Versions for 64 bit images
-    0x00000000000109A0: ImageVersion(68000, True,  True,  False, False),
-    -0x5ff6ff0000000000:ImageVersion(68000, False, True,  False, False), # 0xA009010000000000
-    0x00000000000109A2: ImageVersion(68002, True,  True,  True,  False),
-    -0x5df6ff0000000000:ImageVersion(68002, False, True,  True,  False), # 0xA209010000000000
-    0x00000000000109A3: ImageVersion(68003, True,  True,  True,  True ),
-    -0x5cf6ff0000000000:ImageVersion(68003, False, True,  True,  True ), # 0xA309010000000000
+}
+
+image_versions_64bit = {
+    # Versions for 64 bit images (expressed as two 32-bit words)
+    (0x00000000,  0x000109A0): ImageVersion(68000, True,  True,  False, False),
+    (-0x5ff6ff00, 0x00000000): ImageVersion(68000, False, True,  False, False), # 0xA009010000000000
+    (0x00000000,  0x000109A2): ImageVersion(68002, True,  True,  True,  False),
+    (-0x5df6ff00, 0x00000000): ImageVersion(68002, False, True,  True,  False), # 0xA209010000000000
+    (0x00000000,  0x000109A3): ImageVersion(68003, True,  True,  True,  True ),
+    (-0x5cf6ff00, 0x00000000): ImageVersion(68003, False, True,  True,  True ), # 0xA309010000000000
 }
 
 # ____________________________________________________________
@@ -59,20 +63,13 @@
 
 class ImageReader(object):
     
-    _attrs_ = [ "space", "stream", "version",
-        "chunks", # Dictionary mapping old address to chunk object
-        "chunklist", # Flat list of all read chunks
-        "intcache", # Cached instances of SmallInteger
-        "lastWindowSize"
-    ]
-    
     def __init__(self, space, stream):
         self.space = space
         self.stream = stream
         self.version = None
-        self.chunks = {}
-        self.chunklist = []
-        self.intcache = {}
+        self.chunks = {} # Dictionary mapping old address to chunk object
+        self.chunklist = [] # Flat list of all read chunks
+        self.intcache = {} # Cached instances of SmallInteger
         self.lastWindowSize = 0
     
     def create_image(self):
@@ -94,25 +91,25 @@
         self.fillin_w_objects()
 
     def try_read_version(self):
-        version = image_versions.get(self.stream.next(), None)
+        magic1 = self.stream.next()
+        version = image_versions.get(magic1, None)
         if version:
             return version
-        self.stream.reset()
-        if self.stream.length() > POSSIBLE_IMAGE_OFFSET + 4:
-            self.stream.skipbytes(POSSIBLE_IMAGE_OFFSET)
-            version = image_versions.get(self.stream.next(), None)
-            if not version:
-                self.stream.reset()
-            return version
+        # Check 64 bit version
+        magic2 = self.stream.next()
+        version = image_versions_64bit.get((magic1, magic2), None)
+        if not version:
+            self.stream.reset()
+        return version
 
     def read_version(self):
         version = self.try_read_version()
         if not version:
-            # Try 64 bit
-            self.stream.be_64bit()
-            version = self.try_read_version()
-            if not version:
-                raise error.CorruptImageError("Illegal version magic.")
+            if self.stream.length() > POSSIBLE_IMAGE_OFFSET + 4:
+                self.stream.skipbytes(POSSIBLE_IMAGE_OFFSET)
+                version = self.try_read_version()
+        if not version:
+            raise error.CorruptImageError("Illegal version magic.")
         version.configure_stream(self.stream)
         self.version = version
     
diff --git a/spyvm/test/test_squeakimage.py b/spyvm/test/test_squeakimage.py
--- a/spyvm/test/test_squeakimage.py
+++ b/spyvm/test/test_squeakimage.py
@@ -185,42 +185,46 @@
     r.read_header()
     assert r.stream.pos == len(image_2)
 
-def test_simple_image64():
-    #if not sys.maxint == 2 ** 63 - 1:
-    #  py.test.skip("on 32 bit platforms, we can't need to check for 64 bit images")
-    word_size = 8
-    header_size = 16 * word_size
+def test_simple_image64(monkeypatch):
+    from spyvm.util import system
+    monkeypatch.setattr(system, "IS_64BIT", True)
+    
+    try:
+        word_size = 8
+        header_size = 16 * word_size
 
-    image_1 = (pack(">Q", 68002)         # 1 version
-               + pack(">q", header_size) # 2 64 byte header
-               + pack(">q", 0)           # 3 no body
-               + pack(">q", 0)           # 4 old base addresss unset
-               + pack(">q", 0)           # 5 no spl objs array
-               + ("\x12\x34\x56\x78" * 2)# 6 last hash
-               + pack(">H", 480)         # 7 window 480 height
-               +     pack(">H", 640)     #   window 640 width
-               +     pack(">i", 0)       #   pad
-               + pack(">q", 0)           # 8 not fullscreen
-               + pack(">q", 0)           # 9 no extra memory
-               + ("\x00" * (header_size - (9 * word_size))))
-    r = imagereader_mock(image_1)
-    # does not raise
-    r.read_header()
-    assert r.stream.pos == len(image_1)
+        image_1 = (pack(">Q", 68002)         # 1 version
+                   + pack(">q", header_size) # 2 64 byte header
+                   + pack(">q", 0)           # 3 no body
+                   + pack(">q", 0)           # 4 old base addresss unset
+                   + pack(">q", 0)           # 5 no spl objs array
+                   + ("\x12\x34\x56\x78" * 2)# 6 last hash
+                   + pack(">H", 480)         # 7 window 480 height
+                   +     pack(">H", 640)     #   window 640 width
+                   +     pack(">i", 0)       #   pad
+                   + pack(">q", 0)           # 8 not fullscreen
+                   + pack(">q", 0)           # 9 no extra memory
+                   + ("\x00" * (header_size - (9 * word_size))))
+        r = imagereader_mock(image_1)
+        # does not raise
+        r.read_header()
+        assert r.stream.pos == len(image_1)
 
-    image_2 = (pack("<Q", 68002)         # 1 version
-               + pack("<q", header_size) # 2 64 byte header
-               + pack("<q", 0)           # 3 no body
-               + pack("<q", 0)           # 4 old base addresss unset
-               + pack("<q", 0)           # 5 no spl objs array
-               + ("\x12\x34\x56\x78" * 2)# 6 last hash
-               + pack("<H", 480)         # 7 window 480 height
-               +     pack("<H", 640)     #   window 640 width
-               +     pack(">i", 0)       #   pad
-               + pack(">q", 0)           # 8 not fullscreen
-               + pack("<q", 0)           # 9 no extra memory
-               + ("\x00" * (header_size - (9 * word_size))))
-    r = imagereader_mock(image_2)
-    # does not raise
-    r.read_header()
-    assert r.stream.pos == len(image_2)
+        image_2 = (pack("<Q", 68002)         # 1 version
+                   + pack("<q", header_size) # 2 64 byte header
+                   + pack("<q", 0)           # 3 no body
+                   + pack("<q", 0)           # 4 old base addresss unset
+                   + pack("<q", 0)           # 5 no spl objs array
+                   + ("\x12\x34\x56\x78" * 2)# 6 last hash
+                   + pack("<H", 480)         # 7 window 480 height
+                   +     pack("<H", 640)     #   window 640 width
+                   +     pack(">i", 0)       #   pad
+                   + pack(">q", 0)           # 8 not fullscreen
+                   + pack("<q", 0)           # 9 no extra memory
+                   + ("\x00" * (header_size - (9 * word_size))))
+        r = imagereader_mock(image_2)
+        # does not raise
+        r.read_header()
+        assert r.stream.pos == len(image_2)
+    finally:
+        monkeypatch.undo()


More information about the pypy-commit mailing list