[pypy-commit] lang-smalltalk storage-cleanups: Extracted Stream() into util/stream.py since its reusable.

anton_gulenko noreply at buildbot.pypy.org
Wed Aug 6 11:41:12 CEST 2014


Author: Anton Gulenko <anton.gulenko at googlemail.com>
Branch: storage-cleanups
Changeset: r1018:eabb41bf240d
Date: 2014-08-05 20:18 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/eabb41bf240d/

Log:	Extracted Stream() into util/stream.py since its reusable. Also, can
	be turned into in/out stream when implementing image writer.

diff --git a/spyvm/squeakimage.py b/spyvm/squeakimage.py
--- a/spyvm/squeakimage.py
+++ b/spyvm/squeakimage.py
@@ -1,120 +1,11 @@
 import os, sys, time
-from spyvm import constants, model
+from spyvm import constants, model, util
+from spyvm.util import stream
 from spyvm.util.bitmanipulation import splitter
-from rpython.rlib import objectmodel, streamio
+from rpython.rlib import objectmodel
 
-# ____________________________________________________________
-#
-# Stream class for reading raw input data
-
-def chrs2int(b):
-    assert len(b) == 4
-    first = ord(b[0]) # big endian
-    if first & 0x80 != 0:
-        first = first - 0x100
-    return (first << 24 | ord(b[1]) << 16 | ord(b[2]) << 8 | ord(b[3]))
-
-def swapped_chrs2int(b):
-    assert len(b) == 4
-    first = ord(b[3]) # little endian
-    if first & 0x80 != 0:
-        first = first - 0x100
-    return (first << 24 | ord(b[2]) << 16 | ord(b[1]) << 8 | ord(b[0]))
-
-def chrs2long(b):
-    assert len(b) == 8
-    first = ord(b[0]) # big endian
-    if first & 0x80 != 0:
-        first = first - 0x100
-    return (      first << 56 | ord(b[1]) << 48 | ord(b[2]) << 40 | ord(b[3]) << 32
-            | ord(b[4]) << 24 | ord(b[5]) << 16 | ord(b[6]) <<  8 | ord(b[7])      )
-
-def swapped_chrs2long(b):
-    assert len(b) == 8
-    first = ord(b[7]) # little endian
-    if first & 0x80 != 0:
-        first = first - 0x100
-    return (      first << 56 | ord(b[6]) << 48 | ord(b[5]) << 40 | ord(b[4]) << 32
-            | ord(b[3]) << 24 | ord(b[2]) << 16 | ord(b[1]) <<  8 | ord(b[0])      )
-
-class Stream(object):
-    """ Simple input stream. Constructor can raise OSError. """
-    
-    def __init__(self, filename=None, inputfile=None, data=None):
-        if filename:
-            f = streamio.open_file_as_stream(filename, mode="rb", buffering=0)
-            try:
-                self.data = f.readall()
-            finally:
-                f.close()
-        elif inputfile:
-            try:
-                self.data = inputfile.read()
-            finally:
-                inputfile.close()
-        elif data:
-            self.data = data
-        else:
-            raise RuntimeError("need to supply either inputfile or data")
-        
-        self.reset()
-    
-    def peek(self):
-        if self.pos >= len(self.data):
-            raise IndexError
-        data_peek = self.data[self.pos:self.pos + self.word_size]
-        if self.use_long_read:
-            if self.swap:
-                return swapped_chrs2long(data_peek)
-            else:
-                return chrs2long(data_peek)
-        else:
-            if self.swap:
-                return swapped_chrs2int(data_peek)
-            else:
-                return chrs2int(data_peek)
-
-    def next(self):
-        integer = self.peek()
-        self.pos += self.word_size
-        self.count += self.word_size
-        return integer
-
-    def reset(self):
-        self.swap = False
-        self.pos = 0
-        self.count = 0
-        self.be_32bit()
-
-    def reset_count(self):
-        self.count = 0
-
-    def skipbytes(self, jump):
-        assert jump > 0
-        assert (self.pos + jump) <= len(self.data)
-        self.pos += jump
-        self.count += jump
-
-    def skipwords(self, jump):
-        self.skipbytes(jump * self.word_size)
-        assert (self.pos + jump) <= len(self.data)
-        self.pos += jump
-        self.count += jump
-
-    def length(self):
-        return len(self.data)
-
-    def close(self):
-        pass # already closed
-
-    def be_64bit(self):
-        self.word_size = 8
-        self.use_long_read = True
-
-    def be_32bit(self):
-        self.word_size = 4
-        self.use_long_read = False
-
+# Access for module users
+Stream = stream.Stream
 
 # ____________________________________________________________
 #
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
@@ -1,7 +1,7 @@
 import py, StringIO, sys
 from struct import pack
 from spyvm import squeakimage
-from spyvm.squeakimage import chrs2int, chrs2long, swapped_chrs2long
+from spyvm.util.stream import chrs2int, chrs2long, swapped_chrs2long
 from spyvm import objspace
 from .util import create_space, copy_to_module, cleanup_module
 
diff --git a/spyvm/util/stream.py b/spyvm/util/stream.py
new file mode 100644
--- /dev/null
+++ b/spyvm/util/stream.py
@@ -0,0 +1,111 @@
+from rpython.rlib import streamio
+
+def chrs2int(b):
+    assert len(b) == 4
+    first = ord(b[0]) # big endian
+    if first & 0x80 != 0:
+        first = first - 0x100
+    return (first << 24 | ord(b[1]) << 16 | ord(b[2]) << 8 | ord(b[3]))
+
+def swapped_chrs2int(b):
+    assert len(b) == 4
+    first = ord(b[3]) # little endian
+    if first & 0x80 != 0:
+        first = first - 0x100
+    return (first << 24 | ord(b[2]) << 16 | ord(b[1]) << 8 | ord(b[0]))
+
+def chrs2long(b):
+    assert len(b) == 8
+    first = ord(b[0]) # big endian
+    if first & 0x80 != 0:
+        first = first - 0x100
+    return (      first << 56 | ord(b[1]) << 48 | ord(b[2]) << 40 | ord(b[3]) << 32
+            | ord(b[4]) << 24 | ord(b[5]) << 16 | ord(b[6]) <<  8 | ord(b[7])      )
+
+def swapped_chrs2long(b):
+    assert len(b) == 8
+    first = ord(b[7]) # little endian
+    if first & 0x80 != 0:
+        first = first - 0x100
+    return (      first << 56 | ord(b[6]) << 48 | ord(b[5]) << 40 | ord(b[4]) << 32
+            | ord(b[3]) << 24 | ord(b[2]) << 16 | ord(b[1]) <<  8 | ord(b[0])      )
+
+class Stream(object):
+    """ Simple input stream.
+    Data is completely read into memory.
+    Constructor can raise OSError. """
+    
+    def __init__(self, filename=None, inputfile=None, data=None):
+        if filename:
+            f = streamio.open_file_as_stream(filename, mode="rb", buffering=0)
+            try:
+                self.data = f.readall()
+            finally:
+                f.close()
+        elif inputfile:
+            try:
+                self.data = inputfile.read()
+            finally:
+                inputfile.close()
+        elif data:
+            self.data = data
+        else:
+            raise RuntimeError("need to supply either inputfile or data")
+        
+        self.reset()
+    
+    def peek(self):
+        if self.pos >= len(self.data):
+            raise IndexError
+        data_peek = self.data[self.pos:self.pos + self.word_size]
+        if self.use_long_read:
+            if self.swap:
+                return swapped_chrs2long(data_peek)
+            else:
+                return chrs2long(data_peek)
+        else:
+            if self.swap:
+                return swapped_chrs2int(data_peek)
+            else:
+                return chrs2int(data_peek)
+
+    def next(self):
+        integer = self.peek()
+        self.pos += self.word_size
+        self.count += self.word_size
+        return integer
+
+    def reset(self):
+        self.swap = False
+        self.pos = 0
+        self.count = 0
+        self.be_32bit()
+
+    def reset_count(self):
+        self.count = 0
+
+    def skipbytes(self, jump):
+        assert jump > 0
+        assert (self.pos + jump) <= len(self.data)
+        self.pos += jump
+        self.count += jump
+
+    def skipwords(self, jump):
+        self.skipbytes(jump * self.word_size)
+        assert (self.pos + jump) <= len(self.data)
+        self.pos += jump
+        self.count += jump
+
+    def length(self):
+        return len(self.data)
+
+    def close(self):
+        pass # already closed
+
+    def be_64bit(self):
+        self.word_size = 8
+        self.use_long_read = True
+
+    def be_32bit(self):
+        self.word_size = 4
+        self.use_long_read = False


More information about the pypy-commit mailing list