changeset 108:6da99741178e

e2ir.c changes, mainly accounts for static arrays being value types now
author Trass3r
date Tue, 31 Aug 2010 21:41:01 +0200
parents d8f19d85fadb
children ceda59b4d255
files dmd/AssocArrayLiteralExp.d dmd/CatAssignExp.d dmd/DeleteExp.d dmd/OverExp.d dmd/RemoveExp.d dmd/StringExp.d dmd/SymOffExp.d dmd/SymbolExp.d dmd/VarExp.d dmd/codegen/Util.d
diffstat 10 files changed, 63 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- 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));
 
--- 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;
--- 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;
--- 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;
 	}
 }
 
--- 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;
--- 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)
 		{
--- 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
+	}
+}
 }
 
--- 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
--- 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());
--- 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;
 }