changeset 7:89cc05dbdae1

Implementing TemplateAliasParameter and TemplateValueParameter
author dkoroskin <>
date Mon, 14 Dec 2009 14:50:03 +0300
parents 69d413ef14ad
children d42cd5917df4
files commands.txt dmd/TemplateAliasParameter.d dmd/TemplateValueParameter.d dmd/templates/Util.d
diffstat 4 files changed, 112 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/commands.txt	Tue Dec 08 21:40:08 2009 +0300
+++ b/commands.txt	Mon Dec 14 14:50:03 2009 +0300
@@ -14,10 +14,10 @@
 -version=SEH
 -version=OMFOBJ
 -version=SNAN_DEFAULT_INIT
--ofddmd.exe
+-ofC:\dmd_2.032\windows\bin\dmd.exe
 bridge.obj
 ddmd.def
-dmd.lib
+C:\dmd_2.032\src\dmd\dmd.lib
 main.d
 win32\windef.d
 win32\winuser.d
@@ -42,6 +42,7 @@
 dmd\CatAssignExp.d
 dmd\Port.d
 dmd\declaration\MATCH.d
+dmd\templates\Util.d
 dmd\expression\Util.d
 dmd\expression\Add.d
 dmd\expression\Xor.d
--- a/dmd/TemplateAliasParameter.d	Tue Dec 08 21:40:08 2009 +0300
+++ b/dmd/TemplateAliasParameter.d	Mon Dec 14 14:50:03 2009 +0300
@@ -12,6 +12,8 @@
 import dmd.HdrGenState;
 import dmd.Dsymbol;
 
+import dmd.templates.Util;
+
 class TemplateAliasParameter : TemplateParameter
 {
     /* Syntax:
@@ -26,18 +28,26 @@
 
     this(Loc loc, Identifier ident, Type specType, Object specAlias, Object defaultAlias)
 	{
-		assert(false);
 		super(loc, ident);
+
+		this.specType = specType;
+		this.specAlias = specAlias;
+		this.defaultAlias = defaultAlias;
 	}
 
     TemplateAliasParameter isTemplateAliasParameter()
 	{
-		assert(false);
+		return this;
 	}
 	
     TemplateParameter syntaxCopy()
 	{
-		assert(false);
+		TemplateAliasParameter tp = new TemplateAliasParameter(loc, ident, specType, specAlias, defaultAlias);
+		if (tp.specType)
+			tp.specType = specType.syntaxCopy();
+		tp.specAlias = objectSyntaxCopy(specAlias);
+		tp.defaultAlias = objectSyntaxCopy(defaultAlias);
+		return tp;
 	}
 	
     void declareParameter(Scope sc)
--- a/dmd/TemplateValueParameter.d	Tue Dec 08 21:40:08 2009 +0300
+++ b/dmd/TemplateValueParameter.d	Mon Dec 14 14:50:03 2009 +0300
@@ -11,6 +11,12 @@
 import dmd.OutBuffer;
 import dmd.HdrGenState;
 import dmd.MATCH;
+import dmd.VarDeclaration;
+import dmd.STC;
+import dmd.Util;
+import dmd.TY;
+import dmd.WANT;
+import dmd.TOK;
 
 class TemplateValueParameter : TemplateParameter
 {
@@ -26,28 +32,71 @@
 
     this(Loc loc, Identifier ident, Type valType, Expression specValue, Expression defaultValue)
 	{
-		assert(false);
 		super(loc, ident);
+		
+		this.valType = valType;
+		this.specValue = specValue;
+		this.defaultValue = defaultValue;
 	}
 
     TemplateValueParameter isTemplateValueParameter()
 	{
-		assert(false);
+		return this;
 	}
 	
     TemplateParameter syntaxCopy()
 	{
-		assert(false);
+		TemplateValueParameter tp = new TemplateValueParameter(loc, ident, valType, specValue, defaultValue);
+		tp.valType = valType.syntaxCopy();
+		if (specValue)
+			tp.specValue = specValue.syntaxCopy();
+		if (defaultValue)
+			tp.defaultValue = defaultValue.syntaxCopy();
+		return tp;
 	}
 
     void declareParameter(Scope sc)
 	{
-		assert(false);
+		VarDeclaration v = new VarDeclaration(loc, valType, ident, null);
+		v.storage_class = STC.STCtemplateparameter;
+		if (!sc.insert(v))
+			error(loc, "parameter '%s' multiply defined", ident.toChars());
+		sparam = v;
 	}
 
-    void semantic(Scope)
+    void semantic(Scope sc)
 	{
-		assert(false);
+		sparam.semantic(sc);
+		valType = valType.semantic(loc, sc);
+		if (!(valType.isintegral() || valType.isfloating() || valType.isString()) && valType.ty != TY.Tident)
+			error(loc, "arithmetic/string type expected for value-parameter, not %s", valType.toChars());
+
+		if (specValue)
+		{   
+			Expression e = specValue;
+
+			e = e.semantic(sc);
+			e = e.implicitCastTo(sc, valType);
+			e = e.optimize(WANTvalue | WANTinterpret);
+			if (e.op == TOKint64 || e.op == TOKfloat64 ||
+				e.op == TOKcomplex80 || e.op == TOKnull || e.op == TOKstring)
+				specValue = e;
+			//e.toInteger();
+		}
+
+static if (false) {	// defer semantic analysis to arg match
+		if (defaultValue)
+		{   
+			Expression e = defaultValue;
+
+			e = e.semantic(sc);
+			e = e.implicitCastTo(sc, valType);
+			e = e.optimize(WANTvalue | WANTinterpret);
+			if (e.op == TOKint64)
+				defaultValue = e;
+			//e.toInteger();
+		}
+}
 	}
 
     void print(Object oarg, Object oded)
@@ -70,9 +119,25 @@
 		assert(false);
 	}
 
-    bool overloadMatch(TemplateParameter)
+    bool overloadMatch(TemplateParameter tp)
 	{
-		assert(false);
+		TemplateValueParameter tvp = tp.isTemplateValueParameter();
+
+		if (tvp)
+		{
+			if (valType != tvp.valType)
+				return false;
+
+			if (valType && !valType.equals(tvp.valType))
+				return false;
+
+			if (specValue != tvp.specValue)
+				return false;
+
+			return true;			// match
+		}
+
+		return false;
 	}
 
     MATCH matchArg(Scope sc, Objects tiargs, int i, TemplateParameters parameters, Objects dedtypes, Declaration* psparam, int flags)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmd/templates/Util.d	Mon Dec 14 14:50:03 2009 +0300
@@ -0,0 +1,23 @@
+module dmd.templates.Util;
+
+import dmd.Dsymbol;
+import dmd.Type;
+import dmd.Expression;
+
+version (DMDV2) {
+	Object objectSyntaxCopy(Object o)
+	{
+		if (!o)
+			return null;
+
+		Type t = isType(o);
+		if (t)
+			return t.syntaxCopy();
+
+		Expression e = isExpression(o);
+		if (e)
+			return e.syntaxCopy();
+
+		return o;
+	}
+}
\ No newline at end of file