diff nworker.rhope @ 91:bcdc326b3d6e

Added basic support for list literals in compiler. Updated todo list.
author Mike Pavone <pavone@retrodev.com>
date Sat, 31 Jul 2010 17:17:23 -0400
parents 5a195ee08eac
children e73a93fb5de1
line wrap: on
line diff
--- a/nworker.rhope	Sat Jul 31 15:08:15 2010 -0400
+++ b/nworker.rhope	Sat Jul 31 17:17:23 2010 -0400
@@ -632,6 +632,46 @@
 	out <- [worker]_Dependency Groups[no deps, no deps, [()]Append[no deps]]
 }
 
+Const Name[val,node index,worker name:out]
+{
+	If[[Type Of[val]] = ["Type Instance"]]
+	{
+		//TODO: Support parametric types
+		datstring <- [val]Name >>
+	}{
+		If[[Type Of[val]] = ["Machine Integer"]]
+		{
+			If[[val]Signed? >>]
+			{ s <- "i" }
+			{ s <- "u" }
+			datstring <- [[[val]Value >>]Append[s]]Append[[val]Size >>]
+		}{
+			If[[Type Of[val]] = ["Worker Literal"]]
+			{
+				If[[[[val]Args >>]Length] > [0]]
+				{
+					datstring <- [[["Arg "]Append[node index]]Append[" "]]Append[worker name]
+				}{
+					datstring <- [val]Name >>
+				}
+			}{
+				If[[Type Of[val]] = ["List"]]
+				{
+					If[[[val]Length] > [0]]
+					{
+						datstring <- [[["Arg "]Append[node index]]Append[" "]]Append[worker name]
+					}{
+						datstring <- "Empty"
+					}
+				}{
+					datstring <- val
+				}
+			}
+		}
+	}
+	out <- [[Type Of[val]]Append["_"]]Append[datstring]
+}
+
 Format Input@NWorker[worker,noderef:out]
 {
 	node <- [[worker]Nodes >>]Index[[noderef]Index >>]
@@ -658,32 +698,7 @@
 				{
 					out <- AddRef[ [[["__result_"]Append[[noderef]Index >>]]Append["_"]]Append[[noderef]IO Num >>] ]
 				}{
-					If[[Type Of[[node]Data >>]] = ["Type Instance"]]
-					{
-						//TODO: Support parametric types
-						datstring <- [[node]Data >>]Name >>
-					}{
-						If[[Type Of[[node]Data >>]] = ["Machine Integer"]]
-						{
-							If[[[node]Data >>]Signed? >>]
-							{ s <- "i" }
-							{ s <- "u" }
-							datstring <- [[[[node]Data >>]Value >>]Append[s]]Append[[[node]Data >>]Size >>]
-						}{
-							If[[Type Of[[node]Data >>]] = ["Worker Literal"]]
-							{
-								If[[[[[node]Data >>]Args >>]Length] > [0]]
-								{
-									datstring <- [[["Arg "]Append[[noderef]Index >>]]Append[" "]]Append[[worker]Name >>]
-								}{
-									datstring <- [[node]Data >>]Name >>
-								}
-							}{
-								datstring <- [node]Data >>
-							}
-						}
-					}
-					out <- Constant[[[Type Of[[node]Data >>]]Append["_"]]Append[datstring]]
+					out <- Constant[Const Name[[node]Data >>, [noderef]Index >>, [worker]Name >>]]
 				}
 			}
 		}
@@ -837,33 +852,7 @@
 		}{
 			If[[[node]Type >>] = ["const"]]
 			{
-				//TODO: Handle list constants
-				If[[Type Of[[node]Data >>]] = ["Type Instance"]]
-				{
-					//TODO: Support parametric types
-					datstring <- [[node]Data >>]Name >>
-				}{
-					If[[Type Of[[node]Data >>]] = ["Machine Integer"]]
-					{
-						If[[[node]Data >>]Signed? >>]
-						{ s <- "i" }
-						{ s <- "u" }
-						datstring <- [[[[node]Data >>]Value >>]Append[s]]Append[[[node]Data >>]Size >>]
-					}{
-						If[[Type Of[[node]Data >>]] = ["Worker Literal"]]
-						{
-							If[[[[[node]Data >>]Args >>]Length] > [0]]
-							{
-								datstring <- [[["Arg "]Append[node index]]Append[" "]]Append[[worker]Name >>]
-							}{
-								datstring <- [[node]Data >>]Name >>
-							}
-						}{
-							datstring <- [node]Data >>
-						}
-					}
-				}
-				constname <- [[Type Of[[node]Data >>]]Append["_"]]Append[datstring]
+				constname <- Const Name[[node]Data >>, node index, [worker]Name >>]
 				withconst <- [func]Register Constant[constname, [node]Data >>]
 				[conditions]For Backend
 				{