Mercurial > projects > ddmd
diff dmd/AssignExp.d @ 130:60bb0fe4563e
dmdfe 2.037 first main iteration
author | Eldar Insafutdinov <e.insafutdinov@gmail.com> |
---|---|
date | Thu, 09 Sep 2010 22:51:44 +0100 |
parents | 1765f3ef917d |
children | e3afd1303184 |
line wrap: on
line diff
--- a/dmd/AssignExp.d Sun Sep 05 15:32:22 2010 +0400 +++ b/dmd/AssignExp.d Thu Sep 09 22:51:44 2010 +0100 @@ -5,7 +5,7 @@ import dmd.Identifier; import dmd.backend.elem; import dmd.InterState; -import dmd.Argument; +import dmd.Parameter; import dmd.IndexExp; import dmd.CallExp; import dmd.CastExp; @@ -390,7 +390,7 @@ buf.writestring("Assign"); } - override Expression buildArrayLoop(Arguments fparams) + override Expression buildArrayLoop(Parameters fparams) { /* Evaluate assign expressions right to left */ @@ -412,9 +412,6 @@ override elem* toElem(IRState* irs) { - elem* e; - IndexExp ae; - int r; Type t1b; //printf("AssignExp.toElem('%s')\n", toChars()); @@ -427,45 +424,25 @@ // _d_arraysetlength(e2, sizeelem, &ale.e1); ArrayLengthExp ale = cast(ArrayLengthExp)e1; - elem* p1; - elem* p2; - elem* p3; - elem* ep; - Type t1; - p1 = e2.toElem(irs); - p3 = ale.e1.toElem(irs); + auto p1 = e2.toElem(irs); + auto p3 = ale.e1.toElem(irs); p3 = addressElem(p3, null); - t1 = ale.e1.type.toBasetype(); + Type t1 = ale.e1.type.toBasetype(); -static if (true) { // call _d_arraysetlengthT(ti, e2, &ale.e1); - p2 = t1.getTypeInfo(null).toElem(irs); - ep = el_params(p3, p1, p2, null); // c function - r = t1.nextOf().isZeroInit(Loc(0)) ? RTLSYM.RTLSYM_ARRAYSETLENGTHT : RTLSYM.RTLSYM_ARRAYSETLENGTHIT; -} else { - if (t1.next.isZeroInit()) - { - p2 = t1.getTypeInfo(null).toElem(irs); - ep = el_params(p3, p1, p2, null); // c function - r = RTLSYM.RTLSYM_ARRAYSETLENGTHT; - } - else - { - p2 = el_long(TYM.TYint, t1.next.size()); - ep = el_params(p3, p2, p1, null); // c function - Expression init = t1.next.defaultInit(); - ep = el_param(el_long(TYM.TYint, init.type.size()), ep); - elem* ei = init.toElem(irs); - ep = el_param(ei, ep); - r = RTLSYM.RTLSYM_ARRAYSETLENGTH3; - } -} - e = el_bin(OPER.OPcall, type.totym(), el_var(rtlsym[r]), ep); + auto p2 = t1.getTypeInfo(null).toElem(irs); + auto ep = el_params(p3, p1, p2, null); // c function + int r = t1.nextOf().isZeroInit(Loc(0)) ? RTLSYM.RTLSYM_ARRAYSETLENGTHT : RTLSYM.RTLSYM_ARRAYSETLENGTHIT; + + auto e = el_bin(OPER.OPcall, type.totym(), el_var(rtlsym[r]), ep); el_setLoc(e, loc); return e; } - + + elem *e; + IndexExp ae; + // Look for array[]=n if (e1.op == TOK.TOKslice) { @@ -560,7 +537,7 @@ elem_print(enbytes); } - if (global.params.useArrayBounds && eupr && ta.ty != TY.Tpointer) + if (irs.arrayBoundsCheck() && eupr && ta.ty != TY.Tpointer) { elem *c1; elem *c2; @@ -651,16 +628,13 @@ /* It's array1[]=array2[] * which is a memcpy */ - elem* eto; - elem* efrom; - elem* esize; elem* ep; - eto = e1.toElem(irs); - efrom = e2.toElem(irs); + auto eto = e1.toElem(irs); + auto efrom = e2.toElem(irs); uint size = cast(uint)t1.nextOf().size(); - esize = el_long(TYM.TYint, size); + auto esize = el_long(TYM.TYint, size); /* Determine if we need to do postblit */ @@ -670,16 +644,12 @@ assert(e2.type.ty != TY.Tpointer); - if (!postblit && !global.params.useArrayBounds) + if (!postblit && !irs.arrayBoundsCheck()) { - elem* epto; - elem* epfr; - elem* elen; - elem* ex; - - ex = el_same(&eto); + auto ex = el_same(&eto); // Determine if elen is a constant + elem *elen; if (eto.Eoper == OPER.OPpair && eto.E1.Eoper == OPER.OPconst) { elen = el_copytree(eto.E1); @@ -691,8 +661,8 @@ } esize = el_bin(OPER.OPmul, TYM.TYint, elen, esize); - epto = array_toPtr(e1.type, ex); - epfr = array_toPtr(e2.type, efrom); + auto epto = array_toPtr(e1.type, ex); + auto epfr = array_toPtr(e2.type, efrom); static if (true) { // memcpy() is faster, so if we can't beat 'em, join 'em e = el_params(esize, epfr, epto, null);