diff dmd/ClassDeclaration.d @ 125:767a01c2a272

BaseClasses -> Vector
author Eldar Insafutdinov <e.insafutdinov@gmail.com>
date Fri, 03 Sep 2010 22:17:54 +0100
parents e28b18c23469
children 1765f3ef917d
line wrap: on
line diff
--- a/dmd/ClassDeclaration.d	Fri Sep 03 21:39:37 2010 +0400
+++ b/dmd/ClassDeclaration.d	Fri Sep 03 22:17:54 2010 +0100
@@ -295,11 +295,11 @@
 		cd.storage_class |= storage_class;
 
 		cd.baseclasses.setDim(this.baseclasses.dim);
-		for (int i = 0; i < cd.baseclasses.dim; i++)
+		for (size_t i = 0; i < cd.baseclasses.dim; i++)
 		{
-			BaseClass b = cast(BaseClass)this.baseclasses.data[i];
-			BaseClass b2 = new BaseClass(b.type.syntaxCopy(), b.protection);
-			cd.baseclasses.data[i] = cast(void*)b2;
+			auto b = this.baseclasses[i];
+			auto b2 = new BaseClass(b.type.syntaxCopy(), b.protection);
+			cd.baseclasses[i] = b2;
 		}
 
 		ScopeDsymbol.syntaxCopy(cd);
@@ -364,9 +364,9 @@
 		error("cannot create C++ classes");
 
 		// Expand any tuples in baseclasses[]
-		for (int i = 0; i < baseclasses.dim; )
+		for (size_t i = 0; i < baseclasses.dim; )
 		{	
-			BaseClass b = cast(BaseClass)baseclasses.data[i];
+			auto b = baseclasses[i];
 		//printf("test1 %s %s\n", toChars(), b.type.toChars());
 			b.type = b.type.semantic(loc, sc);
 		//printf("test2\n");
@@ -382,7 +382,7 @@
 				{	
 					Argument arg = Argument.getNth(tup.arguments, j);
 					b = new BaseClass(arg.type, protection);
-					baseclasses.insert(i + j, cast(void*)b);
+					baseclasses.insert(i + j, b);
 				}
 			}
 			else
@@ -396,7 +396,7 @@
 			BaseClass b;
 			Type tb;
 
-			b = cast(BaseClass)baseclasses.data[0];
+			b = baseclasses[0];
 			//b.type = b.type.semantic(loc, sc);
 			tb = b.type.toBasetype();
 			if (tb.ty != TY.Tclass)
@@ -464,7 +464,7 @@
 		BaseClass b;
 		Type tb;
 
-		b = cast(BaseClass)baseclasses.data[i];
+		b = baseclasses[i];
 		b.type = b.type.semantic(loc, sc);
 		tb = b.type.toBasetype();
 		if (tb.ty == TY.Tclass)
@@ -493,7 +493,7 @@
 			// Check for duplicate interfaces
 			for (size_t j = (baseClass ? 1 : 0); j < i; j++)
 			{
-			BaseClass b2 = cast(BaseClass)baseclasses.data[j];
+			auto b2 = baseclasses[j];
 			if (b2.base == tc.sym)
 				error("inherits from duplicate interface %s", b2.base.toChars());
 			}
@@ -538,7 +538,7 @@
 			}
 			bt = tbase.semantic(loc, sc).toBasetype();
 			b = new BaseClass(bt, PROT.PROTpublic);
-			baseclasses.shift(cast(void*)b);
+			baseclasses.shift(b);
 			assert(b.type.ty == TY.Tclass);
 			tc = cast(TypeClass)(b.type);
 			baseClass = tc.sym;
@@ -547,7 +547,7 @@
 		}
 
 		interfaces_dim = baseclasses.dim;
-		interfaces = cast(BaseClass*)baseclasses.data;
+		interfaces = baseclasses.ptr;
 
 		if (baseClass)
 		{
@@ -764,9 +764,8 @@
 }
 
 		// Allocate instance of each new interface
-		for (int i = 0; i < vtblInterfaces.dim; i++)
+		foreach (b; vtblInterfaces)
 		{
-			BaseClass b = cast(BaseClass)vtblInterfaces.data[i];
 			uint thissize = PTRSIZE;
 
 			alignmember(structalign, thissize, &sc.offset);
@@ -813,10 +812,8 @@
 			if (baseclasses.dim)
 				buf.writestring(" : ");
 		}
-		for (int i = 0; i < baseclasses.dim; i++)
+		foreach (size_t i, BaseClass b; baseclasses)
 		{
-			BaseClass b = cast(BaseClass)baseclasses.data[i];
-
 			if (i)
 				buf.writeByte(',');
 			//buf.writestring(b.base.ident.toChars());
@@ -848,10 +845,8 @@
 		if (!cd)
 			return 0;
 		//printf("ClassDeclaration::isBaseOf2(this = '%s', cd = '%s')\n", toChars(), cd.toChars());
-		for (int i = 0; i < cd.baseclasses.dim; i++)
+		foreach (b; cd.baseclasses)
 		{	
-			BaseClass b = cast(BaseClass)cd.baseclasses.data[i];
-
 			if (b.base is this || isBaseOf2(b.base))
 				return 1;
 		}
@@ -867,10 +862,8 @@
 		if (!cd)
 			return 0;
 		//printf("ClassDeclaration::isBaseOf2(this = '%s', cd = '%s')\n", toChars(), cd.toChars());
-		for (int i = 0; i < cd.baseclasses.dim; i++)
+		foreach (b; cd.baseclasses)
 		{	
-			BaseClass b = cast(BaseClass)cd.baseclasses.data[i];
-
 			if (b.base == this || isBaseOf2(b.base))
 				return 1;
 		}
@@ -905,10 +898,8 @@
 
 			int i;
 
-			for (i = 0; i < baseclasses.dim; i++)
+			foreach (b; baseclasses)
 			{
-				BaseClass b = cast(BaseClass)baseclasses.data[i];
-
 				if (b.base)
 				{
 					if (!b.base.symtab)
@@ -1016,7 +1007,7 @@
 			if (b.base.isCPPinterface() && id)
 				id.cpp = 1;
 
-			vtblInterfaces.push(cast(void*)b);
+			vtblInterfaces.push(b);
 			b.copyBaseInterfaces(vtblInterfaces);
 		}
 	}
@@ -1121,17 +1112,14 @@
 		else
 		{
 			PROT access;
-			int i;
 
 			if (smember.isDeclaration().isStatic())
 			{
 				access_ret = smember.prot();
 			}
 
-			for (i = 0; i < baseclasses.dim; i++)
+			foreach (b; baseclasses)
 			{   
-				BaseClass b = cast(BaseClass)baseclasses.data[i];
-
 				access = b.base.getAccess(smember);
 				switch (access)
 				{
@@ -1436,9 +1424,8 @@
 		// of the fixup (*)
 
 		offset += vtblInterfaces.dim * (4 * PTRSIZE);
-		for (size_t i = 0; i < vtblInterfaces.dim; i++)
+		foreach (b; vtblInterfaces)
 		{	
-			BaseClass b = cast(BaseClass)vtblInterfaces.data[i];
 			ClassDeclaration id = b.base;
 
 			/* The layout is:
@@ -1466,9 +1453,8 @@
 		// Put out the vtblInterfaces.data[].vtbl[]
 		// This must be mirrored with ClassDeclaration.baseVtblOffset()
 		//printf("putting out %d interface vtbl[]s for '%s'\n", vtblInterfaces.dim, toChars());
-		for (size_t i = 0; i < vtblInterfaces.dim; i++)
+		foreach (size_t i, BaseClass b; vtblInterfaces)
 		{	
-			BaseClass b = cast(BaseClass)vtblInterfaces.data[i];
 			ClassDeclaration id = b.base;
 			int j;
 
@@ -1517,10 +1503,8 @@
 
 		for (cd = this.baseClass; cd; cd = cd.baseClass)
 		{
-			for (int k = 0; k < cd.vtblInterfaces.dim; k++)
+			foreach (size_t k, BaseClass bs; cd.vtblInterfaces)
 			{   
-				BaseClass bs = cast(BaseClass)cd.vtblInterfaces.data[k];
-
 				if (bs.fillVtbl(this, bvtbl, 0))
 				{
 					//printf("\toverriding vtbl[] for %s\n", bs.base.toChars());
@@ -1698,10 +1682,8 @@
 		csymoffset = CLASSINFO_SIZE;
 		csymoffset += vtblInterfaces.dim * (4 * PTRSIZE);
 
-		for (size_t i = 0; i < vtblInterfaces.dim; i++)
+		foreach (b; vtblInterfaces)
 		{
-			BaseClass b = cast(BaseClass)vtblInterfaces.data[i];
-
 			if (b == bc)
 				return csymoffset;
 			csymoffset += b.base.vtbl.dim * PTRSIZE;
@@ -1716,10 +1698,8 @@
 
 		for (cd = this.baseClass; cd; cd = cd.baseClass)
 		{
-			for (int k = 0; k < cd.vtblInterfaces.dim; k++)
+			foreach(bs; cd.vtblInterfaces)
 			{   
-				BaseClass bs = cast(BaseClass)cd.vtblInterfaces.data[k];
-
 				if (bs.fillVtbl(this, null, 0))
 				{
 					if (bc == bs)
@@ -1884,10 +1864,8 @@
 		// Interface vptr initializations
 		toSymbol();						// define csym
 
-		for (size_t i = 0; i < vtblInterfaces.dim; i++)
+		foreach (b; vtblInterfaces)
 		{	
-			BaseClass b = cast(BaseClass)vtblInterfaces.data[i];
-
 ///		version (1 || INTERFACE_VIRTUAL) {
 			for (ClassDeclaration cd2 = cd; 1; cd2 = cd2.baseClass)
 			{