changeset 125:767a01c2a272

BaseClasses -> Vector
author Eldar Insafutdinov <e.insafutdinov@gmail.com>
date Fri, 03 Sep 2010 22:17:54 +0100
parents 731ab26f07bf
children 1765f3ef917d
files dmd/AggregateDeclaration.d dmd/ArrayTypes.d dmd/BaseClass.d dmd/ClassDeclaration.d dmd/InterfaceDeclaration.d dmd/IsExp.d dmd/Parser.d
diffstat 7 files changed, 39 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/AggregateDeclaration.d	Fri Sep 03 21:39:37 2010 +0400
+++ b/dmd/AggregateDeclaration.d	Fri Sep 03 22:17:54 2010 +0100
@@ -109,9 +109,8 @@
 			ClassDeclaration cdthis = dthis.isClassDeclaration();
 			if (cdthis)
 			{
-				for (int i = 0; i < cdthis.baseclasses.dim; i++)
+				foreach (b; cdthis.baseclasses)
 				{   
-					BaseClass b = cast(BaseClass)cdthis.baseclasses.data[i];
 					PROT access = b.base.getAccess(smember);
 
 					if (access >= PROT.PROTprotected || accessCheckX(smember, sfunc, b.base, cdscope))
@@ -127,10 +126,8 @@
 			ClassDeclaration cdthis = dthis.isClassDeclaration();
 			if (cdthis)
 			{
-				for (int i = 0; i < cdthis.baseclasses.dim; i++)
+				foreach (b; cdthis.baseclasses)
 				{   
-					BaseClass b = cast(BaseClass)cdthis.baseclasses.data[i];
-
 					if (accessCheckX(smember, sfunc, b.base, cdscope))
 						return true;
 				}
--- a/dmd/ArrayTypes.d	Fri Sep 03 21:39:37 2010 +0400
+++ b/dmd/ArrayTypes.d	Fri Sep 03 22:17:54 2010 +0100
@@ -4,12 +4,12 @@
 import dmd.Array;
 import dmd.TemplateParameter;
 import dmd.Statement;
+import dmd.BaseClass;
 
 alias Vector!Object Objects;
 alias Vector!TemplateParameter TemplateParameters;
 alias Vector!Statement Statements;
-
-class BaseClasses : Array { final typeof(this) copy() { auto a = new typeof(this); copyTo(a); return a; } }
+alias Vector!BaseClass BaseClasses;
 
 class ClassDeclarations : Array { final typeof(this) copy() { auto a = new typeof(this); copyTo(a); return a; } }
 
--- a/dmd/BaseClass.d	Fri Sep 03 21:39:37 2010 +0400
+++ b/dmd/BaseClass.d	Fri Sep 03 22:17:54 2010 +0100
@@ -133,7 +133,7 @@
 			baseInterfaces[i] = b;
 
 			if (i)				// single inheritance is i==0
-				vtblInterfaces.push(cast(void*)b);	// only need for M.I.
+				vtblInterfaces.push(b);	// only need for M.I.
 			b.copyBaseInterfaces(vtblInterfaces);
 		}
 		//printf("-copyBaseInterfaces\n");
--- 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)
 			{
--- a/dmd/InterfaceDeclaration.d	Fri Sep 03 21:39:37 2010 +0400
+++ b/dmd/InterfaceDeclaration.d	Fri Sep 03 22:17:54 2010 +0100
@@ -104,7 +104,7 @@
 		// Expand any tuples in baseclasses[]
 		for (size_t i = 0; i < baseclasses.dim; )
 		{	
-			BaseClass b = cast(BaseClass)baseclasses.data[0];
+			auto b = baseclasses[0];
 			b.type = b.type.semantic(loc, sc);
 			Type tb = b.type.toBasetype();
 
@@ -116,7 +116,7 @@
 				for (size_t j = 0; j < dim; j++)
 				{	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
@@ -133,7 +133,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)
@@ -151,7 +151,7 @@
 				// Check for duplicate interfaces
 				for (size_t j = 0; j < i; j++)
 				{
-					BaseClass b2 = cast(BaseClass)baseclasses.data[j];
+					auto b2 = baseclasses[j];
 					if (b2.base is tc.sym)
 						error("inherits from duplicate interface %s", b2.base.toChars());
 				}
@@ -188,7 +188,7 @@
 		}
 
 		interfaces_dim = baseclasses.dim;
-		interfaces = cast(BaseClass*)baseclasses.data;
+		interfaces = baseclasses.ptr;
 
 		interfaceSemantic(sc);
 
@@ -480,9 +480,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;
 
 			// ClassInfo
--- a/dmd/IsExp.d	Fri Sep 03 21:39:37 2010 +0400
+++ b/dmd/IsExp.d	Fri Sep 03 22:17:54 2010 +0100
@@ -166,9 +166,8 @@
 					{   ClassDeclaration cd = (cast(TypeClass)targ).sym;
 						Arguments args = new Arguments;
 						args.reserve(cd.baseclasses.dim);
-						for (size_t i = 0; i < cd.baseclasses.dim; i++)
+						foreach (b; cd.baseclasses)
 						{	
-							BaseClass b = cast(BaseClass)cd.baseclasses.data[i];
 							args.push(cast(void*)new Argument(STCin, b.type, null, null));
 						}
 						tded = new TypeTuple(args);
--- a/dmd/Parser.d	Fri Sep 03 21:39:37 2010 +0400
+++ b/dmd/Parser.d	Fri Sep 03 22:17:54 2010 +0100
@@ -2146,8 +2146,8 @@
 			}
 			if (token.value == TOK.TOKidentifier)
 			{
-				BaseClass b = new BaseClass(parseBasicType(), protection);
-				baseclasses.push(cast(void*)b);
+				auto b = new BaseClass(parseBasicType(), protection);
+				baseclasses.push(b);
 				if (token.value != TOK.TOKcomma)
 					break;
 			}