[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