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);