Thread overview
foreach(line; f.byLine) produces core.exception.InvalidMemoryOperationError@(0) in 2.067 but not 2.066
Sep 15, 2015
Andrwe Brown
Sep 15, 2015
Martin Krejcirik
Sep 15, 2015
Daniel Kozák
Sep 15, 2015
Andrew Brown
Sep 15, 2015
Martin Krejcirik
Sep 15, 2015
Andrew Brown
Sep 15, 2015
Martin Krejcirik
Sep 15, 2015
Andrew Brown
September 15, 2015
Hi,

I'm trying to read a file line by line, and I get a core.exception.InvalidMemoryOperationError@(0), even after reducing the program to:

import std.stdio;

void main()
{
  File f = File("testfile");
  foreach(line; f.byLine)
  {
  }
}

The file is a simple table of ascii characters, 811 columns and it fails on the second line. Taking any subset of the columns and the program runs fine so I don't think it can by any particular file corruption.

In this simple example I can get it to work by changing:

foreach(line; f.byLine)

to

foreach(char[] line; f.byLine)

but in my more complicated program this still fails with the same error:

foreach (char[] lineVar; inFile.byLine)
{
  lineVar.split.indexed(places).joiner("\t").writeln;
}

(as does the range version I originally wrote:
inFile.byLine.map!(a => a.split.indexed(places).joiner("\t")).joiner("\n").writeln;)

Is this a bug, gdc on version 2.066 seems to have no problems with it? I'd be happy to fill in a bug report, but I can't share the file as it's sensitive genetic data and I haven't been able to reduce it to anything innocuous.

This has me very puzzled, any suggestions would be much appreciated.

Thanks very much

Andrew
September 15, 2015
On Tuesday, 15 September 2015 at 13:56:37 UTC, Andrwe Brown wrote:
> I'm trying to read a file line by line, and I get a core.exception.InvalidMemoryOperationError@(0), even after

https://issues.dlang.org/show_bug.cgi?id=13856

Try DMD 2.068, it has got fixed byLine implementation.


September 15, 2015
On Tue, 15 Sep 2015 13:56:36 +0000
Andrwe Brown via Digitalmars-d-learn
<digitalmars-d-learn@puremagic.com> wrote:

> Hi,
> 
> I'm trying to read a file line by line, and I get a core.exception.InvalidMemoryOperationError@(0), even after reducing the program to:
> 
> import std.stdio;
> 
> void main()
> {
>    File f = File("testfile");
>    foreach(line; f.byLine)
>    {
>    }
> }
> 
> The file is a simple table of ascii characters, 811 columns and it fails on the second line. Taking any subset of the columns and the program runs fine so I don't think it can by any particular file corruption.
> 
> In this simple example I can get it to work by changing:
> 
> foreach(line; f.byLine)
> 
> to
> 
> foreach(char[] line; f.byLine)
> 
> but in my more complicated program this still fails with the same error:
> 
> foreach (char[] lineVar; inFile.byLine)
> {
>    lineVar.split.indexed(places).joiner("\t").writeln;
> }
> 
> (as does the range version I originally wrote:
> inFile.byLine.map!(a =>
> a.split.indexed(places).joiner("\t")).joiner("\n").writeln;)
> 
> Is this a bug, gdc on version 2.066 seems to have no problems with it? I'd be happy to fill in a bug report, but I can't share the file as it's sensitive genetic data and I haven't been able to reduce it to anything innocuous.
> 
> This has me very puzzled, any suggestions would be much appreciated.
> 
> Thanks very much
> 
> Andrew

Which OS?
September 15, 2015
On Tuesday, 15 September 2015 at 14:19:13 UTC, Daniel Kozák wrote:
>
> Which OS?

It's CentOS release 6.5 (Final), I tried dmd 2.068.1 and the problem has disappeared. Thanks very much for the advice, I can stick to old gdc for speed until ldc catches up to 2.068.

Best

Andrew
September 15, 2015
For reference, it was this PR:
https://github.com/D-Programming-Language/phobos/pull/3089
which fixed the same issue for me.

September 15, 2015
On Tuesday, 15 September 2015 at 14:55:42 UTC, Martin Krejcirik wrote:
> For reference, it was this PR:
> https://github.com/D-Programming-Language/phobos/pull/3089
> which fixed the same issue for me.

A very naive question: would it be possible in this case to backport it into gdc/ldc by copying the pull request and building the compiler from source, or would this get me into a world of pain?
September 15, 2015
On Tuesday, 15 September 2015 at 15:28:23 UTC, Andrew Brown wrote:
> A very naive question: would it be possible in this case to backport it into gdc/ldc by copying the pull request and building the compiler from source, or would this get me into a world of pain?

Cherry-picking should work and merge cleanly. I have done it for DMD 2.067. I don't know how difficult it is to recompile Phobos and Druntime with LDC/GDC though.
September 15, 2015
Thanks very much for your help, it seemed to work a treat (I hope :))! Compiling ldc wasn't too bad, make the changes to runtime/phobos/std/stdio.d and then just building as normal was no problem. Unittests are passing and it handles that file perfectly.

On Tuesday, 15 September 2015 at 16:11:06 UTC, Martin Krejcirik wrote:
> On Tuesday, 15 September 2015 at 15:28:23 UTC, Andrew Brown wrote:
>> A very naive question: would it be possible in this case to backport it into gdc/ldc by copying the pull request and building the compiler from source, or would this get me into a world of pain?
>
> Cherry-picking should work and merge cleanly. I have done it for DMD 2.067. I don't know how difficult it is to recompile Phobos and Druntime with LDC/GDC though.