lib/stream: eof is blocking
authorJean Privat <jean@pryen.org>
Sat, 6 Dec 2014 03:11:10 +0000 (22:11 -0500)
committerJean Privat <jean@pryen.org>
Tue, 9 Dec 2014 09:17:16 +0000 (04:17 -0500)
Signed-off-by: Jean Privat <jean@pryen.org>

lib/standard/collection/m.dot [new file with mode: 0644]
lib/standard/collection/range [new file with mode: 0755]
lib/standard/stream.nit

diff --git a/lib/standard/collection/m.dot b/lib/standard/collection/m.dot
new file mode 100644 (file)
index 0000000..762472d
--- /dev/null
@@ -0,0 +1,14 @@
+digraph g {
+rankdir=BT;node[shape=box];
+subgraph cluster_37053984 {
+label=".."
+       m_41649040 [label="kernel"]
+subgraph cluster_37183344 {
+label="../collection"
+       m_38874592 [label="array"]
+       m_40662960 [label="abstract_collection"]
+}
+}
+       m_38874592 -> m_40662960
+       m_40662960 -> m_41649040
+}
diff --git a/lib/standard/collection/range b/lib/standard/collection/range
new file mode 100755 (executable)
index 0000000..384fffe
Binary files /dev/null and b/lib/standard/collection/range differ
index 4139e45..ec0e4be 100644 (file)
@@ -74,7 +74,7 @@ interface IStream
        # NOTE: Only LINE FEED (`\n`) is considered to delimit the end of lines.
        fun read_line: String
        do
-               assert not eof
+               if eof then return ""
                var s = new FlatBuffer
                append_line_to(s)
                return s.to_s
@@ -189,7 +189,6 @@ abstract class BufferedIStream
        super IStream
        redef fun read_char
        do
-               assert not eof
                if _buffer_pos >= _buffer.length then
                        fill_buffer
                end
@@ -205,7 +204,6 @@ abstract class BufferedIStream
        do
                if _buffer.length == _buffer_pos then
                        if not eof then
-                               fill_buffer
                                return read(i)
                        end
                        return ""
@@ -271,7 +269,13 @@ abstract class BufferedIStream
                end
        end
 
-       redef fun eof do return _buffer_pos >= _buffer.length and end_reached
+       redef fun eof
+       do
+               if _buffer_pos < _buffer.length then return false
+               if end_reached then return true
+               fill_buffer
+               return _buffer_pos >= _buffer.length and end_reached
+       end
 
        # The buffer
        private var buffer: nullable FlatBuffer = null