# HG changeset patch # User Trass3r # Date 1283283661 -7200 # Node ID 6da99741178e2d582cb4f477ea9d6d26675d8ae4 # Parent d8f19d85fadba3cb9941e742207aa82aca9fa536 e2ir.c changes, mainly accounts for static arrays being value types now diff -r d8f19d85fadb -r 6da99741178e dmd/AssocArrayLiteralExp.d --- a/dmd/AssocArrayLiteralExp.d Tue Aug 31 18:18:31 2010 +0200 +++ b/dmd/AssocArrayLiteralExp.d Tue Aug 31 21:41:01 2010 +0200 @@ -147,6 +147,8 @@ assert(t.ty == Taarray); auto ta = cast(TypeAArray)t; +static if(false) +{ /* Unfortunately, the hash function for Aa (array of chars) is custom and * different from Axa and Aya, which get the generic hash function. * So, rewrite the type of the AArray so that if it's key type @@ -160,6 +162,7 @@ ta = new TypeAArray(ta.nextOf(), tkey); ta = cast(TypeAArray)ta.merge(); } +} e = el_param(e, ta.getTypeInfo(null).toElem(irs)); diff -r d8f19d85fadb -r 6da99741178e dmd/CatAssignExp.d --- a/dmd/CatAssignExp.d Tue Aug 31 18:18:31 2010 +0200 +++ b/dmd/CatAssignExp.d Tue Aug 31 21:41:01 2010 +0200 @@ -107,7 +107,7 @@ e1 = el_una(OPaddr, TYnptr, e1); e2 = this.e2.toElem(irs); - if (tybasic(e2.Ety) == TYstruct) + if (tybasic(e2.Ety) == TYstruct || tybasic(e2.Ety) == TYarray) { e2 = el_una(OPstrpar, TYstruct, e2); e2.Enumbytes = e2.E1.Enumbytes; diff -r d8f19d85fadb -r 6da99741178e dmd/DeleteExp.d --- a/dmd/DeleteExp.d Tue Aug 31 18:18:31 2010 +0200 +++ b/dmd/DeleteExp.d Tue Aug 31 21:41:01 2010 +0200 @@ -188,7 +188,7 @@ elem* ep; elem* keyti; - if (tybasic(ekey.Ety) == TYstruct) + if (tybasic(ekey.Ety) == TYstruct || tybasic(ekey.Ety) == TYarray) { ekey = el_una(OPstrpar, TYstruct, ekey); ekey.Enumbytes = ekey.E1.Enumbytes; diff -r d8f19d85fadb -r 6da99741178e dmd/OverExp.d --- a/dmd/OverExp.d Tue Aug 31 18:18:31 2010 +0200 +++ b/dmd/OverExp.d Tue Aug 31 21:41:01 2010 +0200 @@ -7,6 +7,8 @@ import dmd.TOK; import dmd.Type; +//! overload set +version(DMDV2) class OverExp : Expression { OverloadSet vars; @@ -21,12 +23,12 @@ override int isLvalue() { - assert(false); + return true; } override Expression toLvalue(Scope sc, Expression e) { - assert(false); + return this; } } diff -r d8f19d85fadb -r 6da99741178e dmd/RemoveExp.d --- a/dmd/RemoveExp.d Tue Aug 31 18:18:31 2010 +0200 +++ b/dmd/RemoveExp.d Tue Aug 31 21:41:01 2010 +0200 @@ -38,7 +38,7 @@ elem* ep; elem* keyti; - if (tybasic(ekey.Ety) == TYstruct) + if (tybasic(ekey.Ety) == TYstruct || tybasic(ekey.Ety) == TYarray) { ekey = el_una(OPstrpar, TYstruct, ekey); ekey.Enumbytes = ekey.E1.Enumbytes; diff -r d8f19d85fadb -r 6da99741178e dmd/StringExp.d --- a/dmd/StringExp.d Tue Aug 31 18:18:31 2010 +0200 +++ b/dmd/StringExp.d Tue Aug 31 21:41:01 2010 +0200 @@ -830,13 +830,12 @@ } else if (tb.ty == TY.Tsarray) { - Symbol *si; dt_t *dt = null; toDt(&dt); dtnzeros(&dt, sz); // leave terminating 0 - si = symbol_generate(SC.SCstatic,type_allocn(TYM.TYarray, tschar)); + Symbol* si = symbol_generate(SC.SCstatic,type_allocn(TYM.TYarray, tschar)); si.Sdt = dt; si.Sfl = FL.FLdata; @@ -846,6 +845,7 @@ outdata(si); e = el_var(si); + e.Enumbytes = len * sz; } else if (tb.ty == TY.Tpointer) { diff -r d8f19d85fadb -r 6da99741178e dmd/SymOffExp.d --- a/dmd/SymOffExp.d Tue Aug 31 18:18:31 2010 +0200 +++ b/dmd/SymOffExp.d Tue Aug 31 21:41:01 2010 +0200 @@ -229,5 +229,13 @@ Symbol* s = var.toSymbol(); return dtxoff(pdt, s, offset, TYnptr); } + +static if (false) +{ + override elem* toElem(IRState* irs) + { + assert(false); // this function is #if 0'ed out in dmd + } +} } diff -r d8f19d85fadb -r 6da99741178e dmd/SymbolExp.d --- a/dmd/SymbolExp.d Tue Aug 31 18:18:31 2010 +0200 +++ b/dmd/SymbolExp.d Tue Aug 31 21:41:01 2010 +0200 @@ -19,6 +19,7 @@ import dmd.backend.Util; import dmd.codegen.Util; +version(DMDV2) class SymbolExp : Expression { Declaration var; @@ -97,7 +98,7 @@ if (op == TOK.TOKvar) e = el_una(OPER.OPind, TYM.TYnptr, e); - if ((var.isParameter() && tb.ty == TY.Tsarray) || var.isOut() || var.isRef()) + if (ISREF(var, tb)) e = el_una(OPER.OPind, s.ty(), e); else if (op == TOK.TOKsymoff && nrvo) { @@ -122,7 +123,7 @@ e.Enumbytes = cast(uint)type.size(); el_setLoc(e, loc); } - if ((var.isParameter() && tb.ty == TY.Tsarray) || var.isOut() || var.isRef()) + if (ISREF(var, tb)) { e.Ety = TYM.TYnptr; e = el_una(OPER.OPind, s.ty(), e); @@ -150,7 +151,7 @@ e = el_var(var.toImport()); e = el_una(OPER.OPind,s.ty(),e); } - else if ((var.isParameter() && tb.ty == TY.Tsarray) || var.isOut() || var.isRef()) + else if (ISREF(var, tb)) { // Static arrays are really passed as pointers to the array // Out parameters are really references diff -r d8f19d85fadb -r 6da99741178e dmd/VarExp.d --- a/dmd/VarExp.d Tue Aug 31 18:18:31 2010 +0200 +++ b/dmd/VarExp.d Tue Aug 31 21:41:01 2010 +0200 @@ -22,8 +22,7 @@ import dmd.backend.dt_t; import dmd.expression.Util; -// Variable - +//! Variable class VarExp : SymbolExp { this(Loc loc, Declaration var, bool hasOverloads = false) @@ -188,7 +187,8 @@ } } -version (DMDV2) { +version (DMDV2) +{ override int isLvalue() { if (var.storage_class & STClazy) @@ -230,6 +230,12 @@ assert(false); } + version(DMDV1) + override elem* toElem(IRState* irs) + { + assert(false); + } + override void scanForNestedRef(Scope sc) { //printf("VarExp.scanForNestedRef(%s)\n", toChars()); diff -r d8f19d85fadb -r 6da99741178e dmd/codegen/Util.d --- a/dmd/codegen/Util.d Tue Aug 31 18:18:31 2010 +0200 +++ b/dmd/codegen/Util.d Tue Aug 31 21:41:01 2010 +0200 @@ -5,6 +5,7 @@ import dmd.IRState; import dmd.Type; import dmd.Array; +import dmd.Declaration; import dmd.Dsymbol; import dmd.FuncDeclaration; import dmd.Identifier; @@ -60,10 +61,21 @@ import core.memory; + +/* If variable var of type typ is a reference + */ +version(SARRAYVALUE) +{ + bool ISREF(Declaration var, Type tb) {return var.isOut() || var.isRef();} +} +else + bool ISREF(Declaration var, Type tb) {return (var.isParameter() && tb.ty == TY.Tsarray) || var.isOut() || var.isRef();} + + + /************************************ * Call a function. */ - elem* callfunc(Loc loc, IRState* irs, int directcall, // 1: don't do virtual call @@ -126,13 +138,11 @@ // j=1 if _arguments[] is first argument int j = (tf.linkage == LINK.LINKd && tf.varargs == 1); - for (i = 0; i < arguments.dim ; i++) + foreach (size_t i, Expression arg; arguments) { - Expression arg; elem* ea; - arg = cast(Expression)arguments.data[i]; - //printf("\targ[%d]: %s\n", i, arg.toChars()); + //writef("\targ[%d]: %s\n", i, arg.toChars()); size_t nparams = Argument.dim(tf.parameters); if (i - j < nparams && i >= j) @@ -150,11 +160,11 @@ } ea = arg.toElem(irs); L1: - if (tybasic(ea.Ety) == TYM.TYstruct) + if (tybasic(ea.Ety) == TYM.TYstruct || tybasic(ea.Ety) == TYarray) { ea = el_una(OPER.OPstrpar, TYM.TYstruct, ea); ea.Enumbytes = ea.E1.Enumbytes; - assert(ea.Enumbytes); + //assert(ea.Enumbytes); } if (reverse) ep = el_param(ep,ea); @@ -170,10 +180,12 @@ // Don't have one, so create one type* tt; - if (tf.next.toBasetype().ty == TY.Tstruct) - tt = tf.next.toCtype(); + Type tret2 = tf.next; // in dmd tret is shadowed here, so -> tret2 + if (tret2.toBasetype().ty == Tstruct || + tret2.toBasetype().ty == Tsarray) + tt = tret2.toCtype(); else - tt = type_fake(tf.next.totym()); + tt = type_fake(tret2.totym()); Symbol* stmp = symbol_genauto(tt); ehidden = el_ptr(stmp); @@ -284,9 +296,9 @@ e = el_una(op,tyret,ep); } else if (ep) - e = el_bin(tf.ispure ? OPER.OPcallns : OPER.OPcall, tyret, ec, ep); + e = el_bin((tf.ispure && tf.isnothrow) ? OPER.OPcallns : OPER.OPcall, tyret, ec, ep); else - e = el_una(tf.ispure ? OPER.OPucallns : OPER.OPucall, tyret, ec); + e = el_una((tf.ispure && tf.isnothrow) ? OPER.OPucallns : OPER.OPucall, tyret, ec); if (retmethod == RET.RETstack) { @@ -792,7 +804,6 @@ * edim number of times to write evalue to eptr[] * tb type of evalue */ - elem* setArray(elem* eptr, elem* edim, Type tb, elem* evalue, IRState* irs, int op) { int r; @@ -852,7 +863,7 @@ edim = el_bin(OPER.OPmul, TYM.TYuint, edim, el_long(TYM.TYuint, sz)); } - if (tybasic(evalue.Ety) == TYM.TYstruct) + if (tybasic(evalue.Ety) == TYM.TYstruct || tybasic(evalue.Ety) == TYarray) { evalue = el_una(OPER.OPstrpar, TYM.TYstruct, evalue); evalue.Enumbytes = evalue.E1.Enumbytes; @@ -987,7 +998,7 @@ break; case TY.Tsarray: - e = el_una(OPER.OPaddr, TYM.TYnptr, e); + e = addressElem(e, t); dim = cast(uint)(cast(TypeSArray)t).dim.toInteger(); e = el_pair(TYM.TYullong, el_long(TYM.TYint, dim), e); break; @@ -1062,12 +1073,13 @@ return el_combine(ef, e); } +/************************************ + */ elem* sarray_toDarray(Loc loc, Type tfrom, Type tto, elem* e) { //printf("sarray_toDarray()\n"); //elem_print(e); - elem* elen; uint dim = cast(uint)(cast(TypeSArray)tfrom).dim.toInteger(); if (tto) @@ -1084,8 +1096,8 @@ } L1: - elen = el_long(TYM.TYint, dim); - e = el_una(OPER.OPaddr, TYM.TYnptr, e); + elem* elen = el_long(TYM.TYint, dim); + e = addressElem(e, tfrom); e = el_pair(TYM.TYullong, elen, e); return e; }