[Issue 287] New: DMD optimization bug arround dynamic array length

d-bugmail at puremagic.com d-bugmail at puremagic.com
Mon Aug 14 08:07:33 PDT 2006


http://d.puremagic.com/issues/show_bug.cgi?id=287

           Summary: DMD optimization bug arround dynamic array length
           Product: D
           Version: 0.163
          Platform: PC
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla at digitalmars.com
        ReportedBy: iceelyne at gmail.com


build -release -O -clean sample.d
got wrong optimized exe.

import std.stdio;
import std.process;

char[] replace(char[] subject) {
                char[] s = new char[subject.length];
                int lng = 0;
                char[] sa;
                int lngnew;
                int i = 0;
                while(i<10) {
                        i++;
                        sa = "repxxxxxxxxxxxx";
                        lngnew = lng + sa.length;
                        if(lngnew > s.length) s.length = lngnew * 2; // expand
size
                        writefln(lng, \t, lngnew, \t, s.length, \t, sa.length);
                        s[lng .. lngnew] = sa[0 .. $];
                        lng = lngnew;

                        //volatile{//OK

                        sa = "repzzzzzzzzzzzzzzzzzzzzzz";
                        //lngnew = lng-1 + sa.length+1;//OK
                        //synchronized lngnew = lng + sa.length;//OK
                        //lngnew += sa.length;//OK
                        lngnew = lng + sa.length;// 2*sa.length?
                        if(lngnew > s.length) s.length = lngnew * 2; // expand
size
                        writefln(lng, \t, lngnew, \t, s.length, \t, sa.length);
                        s[lng .. lngnew] = sa[0 .. $];
                        lng = lngnew;

                        //}

                }
                return s[0 .. lng];
}

void demo() {
        int lng = 0;
        int lngnew = 0;
        int i = 0;
        char[] sa = "xxxx";//it seem to be around the Dynamic Array's length
property.

        // class SA {
                // int _a;
                // this(int a) {_a = a;}
                // int length() {return _a;}
        // }
        // SA sa = new SA(4);//OK
        while(i<10) {
                i++;
                lngnew = lng + sa.length;
                writefln(lng, \t, lngnew, \t, sa.length);
                lng = lngnew;

                lngnew = lng + sa.length;
                writefln(lng, \t, lngnew, \t, sa.length);
                lng = lngnew;
        }
}

int main(char[][] args) {
        try {
                demo();
                writefln(replace("012345678901234567890"));
        } catch(Exception e) {
                writefln(e.msg);
        }
        system("pause");
        return 0;
}


-- 




More information about the Digitalmars-d-bugs mailing list