<br><br><div class="gmail_quote">On Thu, Feb 4, 2010 at 12:10 AM, Andrei Alexandrescu <span dir="ltr">&lt;<a href="mailto:andrei@erdani.com">andrei@erdani.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">David Simcha wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I recently filed bug 3673 (<a href="http://d.puremagic.com/issues/show_bug.cgi?id=3763" target="_blank">http://d.puremagic.com/issues/show_bug.cgi?id=3763</a>) and started looking at possible fixes.  This is a bug in std.stdio.readlnImpl().  However, the more I think about it the more I think the function needs to be completely rethought, not just patched.  I&#39;m not sure if this is a high priority given that it has nothing to do with the language spec and TDPL but it&#39;s a pretty embarrassing quality of implementation issue.<br>

<br>
Anyhow, readlnImpl() takes a ref char[] and tries to recycle the memory to read in another line.  In doing so, it queries GC.capacity for the relevant memory block and resizes the array to the size of the memory block.  This is arguably unsafe in the general case because, if someone passes in a slice that starts at the beginning of a GC block to use as the buffer, everything else in the same GC block can get overwritten.  This massively violates the principle of least surprise.  On the other hand, when encapsulated in the higher level API of byLine(), it&#39;s both safe and efficient.<br>

</blockquote>
<br></div>
Could you please give an example?</blockquote><div> </div><div>import std.stdio;<br><br>void main() {<br>    auto writer = File(&quot;foo.txt&quot;, &quot;wb&quot;);<br>    foreach(i; 0..1000) {<br>        writer.write(&#39;a&#39;);<br>
    }<br>    writer.writeln();<br>    writer.close();<br><br>    auto chars = new char[500];<br>    chars[] = &#39;b&#39;;<br>    auto buf = chars[0..100];<br><br>    auto reader = File(&quot;foo.txt&quot;, &quot;rb&quot;);<br>
    reader.readln(buf);<br>    writeln(chars[$ - 1]);  // a<br>    assert(chars[$ - 1] == &#39;b&#39;);  // FAILS.</div>}<br></div><br>