Quellcode durchsuchen

Mscript code generator refactorings.

au@andreasunger.net vor 14 Jahren
Ursprung
Commit
700bf53cfd
18 geänderte Dateien mit 337 neuen und 256 gelöschten Zeilen
  1. 2 2
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c.ide.core/src/org/eclipselabs/mscript/codegen/c/ide/core/launch/CodegenProcess.java
  2. 31 34
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/CompoundGenerator.java
  3. 52 54
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/ExpressionGenerator.java
  4. 1 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/ICompoundGenerator.java
  5. 1 2
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/IExpressionGenerator.java
  6. 1 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/IFunctionGenerator.java
  7. 3 4
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/IMscriptGeneratorContext.java
  8. 70 72
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/MscriptGenerator.java
  9. 31 16
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/MscriptGeneratorContext.java
  10. 1 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/internal/VariableAccessStrategy.java
  11. 10 11
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/internal/RoundFunctionGenerator.java
  12. 7 8
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/internal/SumFunctionGenerator.java
  13. 14 16
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/internal/util/CastToFixedPointHelper.java
  14. 10 12
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/internal/util/CastToFloatingPointHelper.java
  15. 2 2
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/internal/util/Caster.java
  16. 16 19
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/util/MscriptGeneratorUtil.java
  17. 2 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.common/META-INF/MANIFEST.MF
  18. 83 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.common/src/org/eclipselabs/mscript/common/util/PrintAppendable.java

+ 2 - 2
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c.ide.core/src/org/eclipselabs/mscript/codegen/c/ide/core/launch/CodegenProcess.java

@@ -226,7 +226,7 @@ public class CodegenProcess implements IProcess {
 	private class HeaderGeneratorThread extends GeneratorThread {
 		
 		public void generate() {
-			MscriptGenerator generator = new MscriptGenerator(functionDefinition, new MscriptGeneratorContext(staticEvaluationContext, computationModel, writer));
+			MscriptGenerator generator = new MscriptGenerator(functionDefinition, new MscriptGeneratorContext(writer, computationModel, staticEvaluationContext));
 			generator.generateHeaderCode();
 		}
 		
@@ -235,7 +235,7 @@ public class CodegenProcess implements IProcess {
 	private class ImplementationGeneratorThread extends GeneratorThread {
 		
 		public void generate() {
-			MscriptGenerator generator = new MscriptGenerator(functionDefinition, new MscriptGeneratorContext(staticEvaluationContext, computationModel, writer));
+			MscriptGenerator generator = new MscriptGenerator(functionDefinition, new MscriptGeneratorContext(writer, computationModel, staticEvaluationContext));
 			generator.generateImplementationCode();
 		}
 		

+ 31 - 34
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/CompoundGenerator.java

@@ -11,11 +11,10 @@
 
 package org.eclipselabs.mscript.codegen.c;
 
-import java.io.PrintWriter;
-
 import org.eclipse.emf.ecore.EObject;
 import org.eclipselabs.mscript.codegen.c.internal.VariableAccessGenerator;
 import org.eclipselabs.mscript.codegen.c.util.MscriptGeneratorUtil;
+import org.eclipselabs.mscript.common.util.PrintAppendable;
 import org.eclipselabs.mscript.language.il.Assignment;
 import org.eclipselabs.mscript.language.il.Compound;
 import org.eclipselabs.mscript.language.il.ForeachStatement;
@@ -41,24 +40,22 @@ public class CompoundGenerator implements ICompoundGenerator {
 	/* (non-Javadoc)
 	 * @see org.eclipselabs.mscript.codegen.c.ICompoundGenerator#generate(org.eclipselabs.mscript.codegen.c.IMscriptGeneratorContext, org.eclipselabs.mscript.language.il.Compound, org.eclipselabs.mscript.codegen.c.IVariableAccessStrategy)
 	 */
-	public void generate(IMscriptGeneratorContext context, IVariableAccessStrategy variableAccessStrategy, Compound compound) {
-		new CompoundGeneratorSwitch(context, variableAccessStrategy).doSwitch(compound);
+	public void generate(IMscriptGeneratorContext context, Compound compound) {
+		new CompoundGeneratorSwitch(context).doSwitch(compound);
 	}
 	
 	private class CompoundGeneratorSwitch extends ILSwitch<Boolean> {
 
 		private IMscriptGeneratorContext context;
-		private IVariableAccessStrategy variableAccessStrategy;
 
-		private PrintWriter writer;
+		private PrintAppendable out;
 
 		/**
 		 * 
 		 */
-		public CompoundGeneratorSwitch(IMscriptGeneratorContext context, IVariableAccessStrategy variableAccessStrategy) {
+		public CompoundGeneratorSwitch(IMscriptGeneratorContext context) {
 			this.context = context;
-			this.variableAccessStrategy = variableAccessStrategy;
-			this.writer = new PrintWriter(context.getWriter());
+			out = new PrintAppendable(context.getAppendable());
 		}
 		
 		/* (non-Javadoc)
@@ -68,17 +65,17 @@ public class CompoundGenerator implements ICompoundGenerator {
 		public Boolean caseCompound(Compound compound) {
 			boolean block = compound instanceof Statement;
 			if (block) {
-				writer.print("{\n");
+				out.print("{\n");
 			}
 			for (LocalVariableDeclaration localVariableDeclaration : compound.getLocalVariableDeclarations()) {
-				writer.print(MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), localVariableDeclaration.getDataType(), localVariableDeclaration.getName(), false));
-				writer.print(";\n");
+				out.print(MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), localVariableDeclaration.getDataType(), localVariableDeclaration.getName(), false));
+				out.print(";\n");
 			}
 			for (Statement statement : compound.getStatements()) {
 				doSwitch(statement);
 			}
 			if (block) {
-				writer.print("}\n");
+				out.print("}\n");
 			}
 			return true;
 		}
@@ -99,7 +96,7 @@ public class CompoundGenerator implements ICompoundGenerator {
 		 */
 		@Override
 		public Boolean caseAssignment(Assignment assignment) {
-			writeAssignment(assignment.getTarget().getDataType(), new VariableAccessGenerator(context.getComputationModel(), variableAccessStrategy, assignment).generate(), assignment.getAssignedExpression());
+			writeAssignment(assignment.getTarget().getDataType(), new VariableAccessGenerator(context.getComputationModel(), context.getVariableAccessStrategy(), assignment).generate(), assignment.getAssignedExpression());
 			return true;
 		}
 		
@@ -108,11 +105,11 @@ public class CompoundGenerator implements ICompoundGenerator {
 		 */
 		@Override
 		public Boolean caseIfStatement(IfStatement ifStatement) {
-			writer.print("if (");
+			out.print("if (");
 			doSwitch(ifStatement.getCondition());
-			writer.print(")\n");
+			out.print(")\n");
 			doSwitch(ifStatement.getThenStatement());
-			writer.print("else\n");
+			out.print("else\n");
 			doSwitch(ifStatement.getElseStatement());
 			return true;
 		}
@@ -136,15 +133,15 @@ public class CompoundGenerator implements ICompoundGenerator {
 			String itVarDecl = MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), iterationVariableDeclaration.getDataType(), itVarName, false);
 			int size = TypeSystemUtil.getArraySize(collectionArrayType);
 			
-			writer.println("{");
-			writer.printf("%s %s_i;\n", MscriptGeneratorUtil.getIndexCDataType(context.getComputationModel(), size), itVarName);
-			writer.printf("for (%s_i = 0; %s_i < %d; ++%s_i) {\n", itVarName, itVarName, size, itVarName);
-			writer.printf("%s = (", itVarDecl);
+			out.println("{");
+			out.printf("%s %s_i;\n", MscriptGeneratorUtil.getIndexCDataType(context.getComputationModel(), size), itVarName);
+			out.printf("for (%s_i = 0; %s_i < %d; ++%s_i) {\n", itVarName, itVarName, size, itVarName);
+			out.printf("%s = (", itVarDecl);
 			doSwitch(foreachStatement.getCollectionExpression());
-			writer.printf(")[%s_i];\n", itVarName);
+			out.printf(")[%s_i];\n", itVarName);
 			doSwitch(foreachStatement.getBody());
-			writer.println("}");
-			writer.println("}");
+			out.println("}");
+			out.println("}");
 			
 			return true;
 		}
@@ -155,7 +152,7 @@ public class CompoundGenerator implements ICompoundGenerator {
 		@Override
 		public Boolean defaultCase(EObject object) {
 			if (object instanceof Expression) {
-				expressionGenerator.generate(context, variableAccessStrategy, (Expression) object);
+				expressionGenerator.generate(context, (Expression) object);
 				return true;
 			}
 			return super.defaultCase(object);
@@ -167,27 +164,27 @@ public class CompoundGenerator implements ICompoundGenerator {
 				arrayType = (ArrayType) targetDataType;
 			}
 			if (arrayType != null) {
-				writer.print("memcpy(");
+				out.print("memcpy(");
 			}
-			writer.print(target);
+			out.print(target);
 			if (arrayType != null) {
-				writer.print(", ");
+				out.print(", ");
 			} else {
-				writer.print(" = ");
+				out.print(" = ");
 			}
 			cast(targetDataType, assignedExpression);
 			if (arrayType != null) {
-				writer.printf(", sizeof (%s)", MscriptGeneratorUtil.getCDataType(context.getComputationModel(), arrayType.getElementType()));
+				out.printf(", sizeof (%s)", MscriptGeneratorUtil.getCDataType(context.getComputationModel(), arrayType.getElementType()));
 				for (ArrayDimension arrayDimension : arrayType.getDimensions()) {
-					writer.printf(" * %d", arrayDimension.getSize());
+					out.printf(" * %d", arrayDimension.getSize());
 				}
-				writer.print(")");
+				out.print(")");
 			}
-			writer.print(";\n");
+			out.print(";\n");
 		}
 		
 		private void cast(DataType targetDataType, Expression expression) {
-			MscriptGeneratorUtil.cast(context, variableAccessStrategy, expression, targetDataType);
+			MscriptGeneratorUtil.cast(context, expression, targetDataType);
 		}
 		
 		private DataType getDataType(Expression expression) {

+ 52 - 54
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/ExpressionGenerator.java

@@ -11,7 +11,6 @@
 
 package org.eclipselabs.mscript.codegen.c;
 
-import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -20,6 +19,7 @@ import org.eclipselabs.mscript.codegen.c.internal.VariableAccessGenerator;
 import org.eclipselabs.mscript.codegen.c.internal.util.CastToFixedPointHelper;
 import org.eclipselabs.mscript.codegen.c.internal.util.CastToFloatingPointHelper;
 import org.eclipselabs.mscript.codegen.c.util.MscriptGeneratorUtil;
+import org.eclipselabs.mscript.common.util.PrintAppendable;
 import org.eclipselabs.mscript.computation.computationmodel.FixedPointFormat;
 import org.eclipselabs.mscript.computation.computationmodel.FixedPointOperation;
 import org.eclipselabs.mscript.computation.computationmodel.FixedPointOperationKind;
@@ -57,22 +57,20 @@ public class ExpressionGenerator implements IExpressionGenerator {
 	/* (non-Javadoc)
 	 * @see org.eclipselabs.mscript.codegen.c.IExpressionGenerator#generate(org.eclipselabs.mscript.codegen.c.IMscriptGeneratorContext, org.eclipselabs.mscript.codegen.c.IVariableAccessStrategy, org.eclipselabs.mscript.language.ast.Expression)
 	 */
-	public void generate(IMscriptGeneratorContext context, IVariableAccessStrategy variableAccessStrategy, Expression expression) {
-		new ExpressionGeneratorSwitch(context, variableAccessStrategy).doSwitch(expression);
+	public void generate(IMscriptGeneratorContext context, Expression expression) {
+		new ExpressionGeneratorSwitch(context).doSwitch(expression);
 	}
 	
 	private static class ExpressionGeneratorSwitch extends AstSwitch<Boolean> {
 
 		private IMscriptGeneratorContext context;
-		private IVariableAccessStrategy variableAccessStrategy;
 		private IBuiltinFunctionGeneratorLookupTable builtinFunctionGeneratorLookupTable = new BuiltinFunctionGeneratorLookupTable();
 		
-		private PrintWriter writer;
+		private PrintAppendable out;
 
-		public ExpressionGeneratorSwitch(IMscriptGeneratorContext context, IVariableAccessStrategy variableAccessStrategy) {
+		public ExpressionGeneratorSwitch(IMscriptGeneratorContext context) {
 			this.context = context;
-			this.variableAccessStrategy = variableAccessStrategy;
-			writer = new PrintWriter(context.getWriter());
+			out = new PrintAppendable(context.getAppendable());
 		}
 	
 		/* (non-Javadoc)
@@ -80,11 +78,11 @@ public class ExpressionGenerator implements IExpressionGenerator {
 		 */
 		@Override
 		public Boolean caseImpliesExpression(ImpliesExpression impliesExpression) {
-			writer.print("(!(");
+			out.print("(!(");
 			doSwitch(impliesExpression.getLeftOperand());
-			writer.print(") || ");
+			out.print(") || ");
 			doSwitch(impliesExpression.getRightOperand());
-			writer.print(")");
+			out.print(")");
 			return true;
 		}
 		
@@ -94,7 +92,7 @@ public class ExpressionGenerator implements IExpressionGenerator {
 		@Override
 		public Boolean caseLogicalOrExpression(LogicalOrExpression logicalOrExpression) {
 			doSwitch(logicalOrExpression.getLeftOperand());
-			writer.print(" || ");
+			out.print(" || ");
 			doSwitch(logicalOrExpression.getRightOperand());
 			return true;
 		}
@@ -105,7 +103,7 @@ public class ExpressionGenerator implements IExpressionGenerator {
 		@Override
 		public Boolean caseLogicalAndExpression(LogicalAndExpression logicalAndExpression) {
 			doSwitch(logicalAndExpression.getLeftOperand());
-			writer.print(" && ");
+			out.print(" && ");
 			doSwitch(logicalAndExpression.getRightOperand());
 			return true;
 		}
@@ -141,16 +139,16 @@ public class ExpressionGenerator implements IExpressionGenerator {
 				
 				NumberFormat widestNumberFormat = ComputationModelUtil.getWidestNumberFormat(numberFormat1, numberFormat2);
 	
-				MscriptGeneratorUtil.castNumericType(context, variableAccessStrategy, widestNumberFormat, leftOperand);
-				writer.print(" ");
-				writer.print(operator);
-				writer.print(" ");
-				MscriptGeneratorUtil.castNumericType(context, variableAccessStrategy, widestNumberFormat, rightOperand);
+				MscriptGeneratorUtil.castNumericType(context, widestNumberFormat, leftOperand);
+				out.print(" ");
+				out.print(operator);
+				out.print(" ");
+				MscriptGeneratorUtil.castNumericType(context, widestNumberFormat, rightOperand);
 			} else {
 				doSwitch(leftOperand);
-				writer.print(" ");
-				writer.print(operator);
-				writer.print(" ");
+				out.print(" ");
+				out.print(operator);
+				out.print(" ");
 				doSwitch(rightOperand);
 			}
 		}
@@ -163,11 +161,11 @@ public class ExpressionGenerator implements IExpressionGenerator {
 			DataType dataType = getDataType(additiveExpression);
 			NumberFormat numberFormat = context.getComputationModel().getNumberFormat(dataType);
 	
-			MscriptGeneratorUtil.castNumericType(context, variableAccessStrategy, numberFormat, additiveExpression.getLeftOperand());
-			writer.print(" ");
-			writer.print(additiveExpression.getOperator().getLiteral());
-			writer.print(" ");
-			MscriptGeneratorUtil.castNumericType(context, variableAccessStrategy, numberFormat, additiveExpression.getRightOperand());
+			MscriptGeneratorUtil.castNumericType(context, numberFormat, additiveExpression.getLeftOperand());
+			out.print(" ");
+			out.print(additiveExpression.getOperator().getLiteral());
+			out.print(" ");
+			MscriptGeneratorUtil.castNumericType(context, numberFormat, additiveExpression.getRightOperand());
 			
 			return true;
 		}
@@ -191,9 +189,9 @@ public class ExpressionGenerator implements IExpressionGenerator {
 		
 		private void writeFloatingPointMultiplicativeExpression(MultiplicativeOperator operator, Expression leftOperand, Expression rightOperand, FloatingPointFormat floatingPointFormat) {
 			castToFloatingPoint(leftOperand, floatingPointFormat);
-			writer.print(" ");
-			writer.print(operator.getLiteral());
-			writer.print(" ");
+			out.print(" ");
+			out.print(operator.getLiteral());
+			out.print(" ");
 			castToFloatingPoint(rightOperand, floatingPointFormat);
 		}
 		
@@ -216,29 +214,29 @@ public class ExpressionGenerator implements IExpressionGenerator {
 			boolean hasIntermediateWordSize = operation.getIntermediateWordSize() != fixedPointFormat.getWordSize();
 		
 			if (hasIntermediateWordSize) {
-				writer.printf("(int%d_t) ", fixedPointFormat.getWordSize());
+				out.printf("(int%d_t) ", fixedPointFormat.getWordSize());
 			}
 			
 			if (hasIntermediateWordSize || fixedPointFormat.getFractionLength() > 0) {
-				writer.print("(");
+				out.print("(");
 			}
 			
 			castToFixedPoint(leftOperand, operation.getIntermediateWordSize(), fixedPointFormat.getFractionLength());
 			
-			writer.print(" * ");
+			out.print(" * ");
 			
 			if (fixedPointFormat.getFractionLength() > 0) {
-				writer.print("(");
+				out.print("(");
 			}
 	
 			castToFixedPoint(rightOperand, operation.getIntermediateWordSize(), fixedPointFormat.getFractionLength());
 			
 			if (fixedPointFormat.getFractionLength() > 0) {
-				writer.printf(") >> %d", fixedPointFormat.getFractionLength());
+				out.printf(") >> %d", fixedPointFormat.getFractionLength());
 			}
 	
 			if (hasIntermediateWordSize || fixedPointFormat.getFractionLength() > 0) {
-				writer.print(")");
+				out.print(")");
 			}
 		}
 	
@@ -248,30 +246,30 @@ public class ExpressionGenerator implements IExpressionGenerator {
 			boolean hasIntermediateWordSize = operation.getIntermediateWordSize() != fixedPointFormat.getWordSize();
 		
 			if (hasIntermediateWordSize) {
-				writer.printf("(int%d_t) (", fixedPointFormat.getWordSize());
+				out.printf("(int%d_t) (", fixedPointFormat.getWordSize());
 			}
 			
 			if (fixedPointFormat.getFractionLength() > 0) {
-				writer.print("((");
+				out.print("((");
 			}
 	
 			castToFixedPoint(leftOperand, operation.getIntermediateWordSize(), fixedPointFormat.getFractionLength());
 			
 			if (fixedPointFormat.getFractionLength() > 0) {
-				writer.printf(") << %d)", fixedPointFormat.getFractionLength());
+				out.printf(") << %d)", fixedPointFormat.getFractionLength());
 			}
 	
-			writer.print(" / ");
+			out.print(" / ");
 			
 			castToFixedPoint(rightOperand, operation.getIntermediateWordSize(), fixedPointFormat.getFractionLength());
 			
 			if (hasIntermediateWordSize) {
-				writer.print(")");
+				out.print(")");
 			}
 		}
 		
 		private void castToFloatingPoint(final Expression expression, FloatingPointFormat floatingPointFormat) {
-			new CastToFloatingPointHelper(context.getComputationModel(), context.getWriter(), getDataType(expression), floatingPointFormat) {
+			new CastToFloatingPointHelper(context.getComputationModel(), context.getAppendable(), getDataType(expression), floatingPointFormat) {
 				
 				@Override
 				protected void writeExpression() {
@@ -282,7 +280,7 @@ public class ExpressionGenerator implements IExpressionGenerator {
 		}
 	
 		private void castToFixedPoint(final Expression expression, int wordSize, int fractionLength) {
-			new CastToFixedPointHelper(context.getComputationModel(), context.getWriter(), getDataType(expression), wordSize, fractionLength) {
+			new CastToFixedPointHelper(context.getComputationModel(), context.getAppendable(), getDataType(expression), wordSize, fractionLength) {
 				
 				@Override
 				protected void writeExpression() {
@@ -297,9 +295,9 @@ public class ExpressionGenerator implements IExpressionGenerator {
 		 */
 		@Override
 		public Boolean caseParenthesizedExpression(ParenthesizedExpression parenthesizedExpression) {
-			writer.print("(");
+			out.print("(");
 			doSwitch(parenthesizedExpression.getExpressions().get(0));
-			writer.print(")");
+			out.print(")");
 			return true;
 		}
 		
@@ -308,7 +306,7 @@ public class ExpressionGenerator implements IExpressionGenerator {
 		 */
 		@Override
 		public Boolean caseUnaryExpression(UnaryExpression unaryExpression) {
-			writer.print(unaryExpression.getOperator().getLiteral());
+			out.print(unaryExpression.getOperator().getLiteral());
 			doSwitch(unaryExpression.getOperand());
 			return true;
 		}
@@ -321,7 +319,7 @@ public class ExpressionGenerator implements IExpressionGenerator {
 			@Override
 			public Boolean caseRealLiteral(RealLiteral realLiteral) {
 				DataType dataType = getDataType(realLiteral);
-				writer.print(MscriptGeneratorUtil.getLiteralString(context.getComputationModel(), dataType, realLiteral.getValue()));
+				out.print(MscriptGeneratorUtil.getLiteralString(context.getComputationModel(), dataType, realLiteral.getValue()));
 				return true;
 			}
 		
@@ -331,7 +329,7 @@ public class ExpressionGenerator implements IExpressionGenerator {
 			@Override
 			public Boolean caseIntegerLiteral(IntegerLiteral integerLiteral) {
 				DataType dataType = getDataType(integerLiteral);
-				writer.print(MscriptGeneratorUtil.getLiteralString(context.getComputationModel(), dataType, integerLiteral.getValue()));
+				out.print(MscriptGeneratorUtil.getLiteralString(context.getComputationModel(), dataType, integerLiteral.getValue()));
 				return true;
 			}
 			
@@ -340,7 +338,7 @@ public class ExpressionGenerator implements IExpressionGenerator {
 			 */
 			@Override
 			public Boolean caseBooleanLiteral(BooleanLiteral booleanLiteral) {
-				writer.print(booleanLiteral.isTrue() ? "1" : "0");
+				out.print(booleanLiteral.isTrue() ? "1" : "0");
 				return true;
 			}
 			
@@ -349,7 +347,7 @@ public class ExpressionGenerator implements IExpressionGenerator {
 			 */
 			@Override
 			public Boolean caseStringLiteral(StringLiteral stringLiteral) {
-				writer.print("\"" + stringLiteral.getValue() + "\"");
+				out.print("\"" + stringLiteral.getValue() + "\"");
 				return true;
 			}
 		
@@ -370,7 +368,7 @@ public class ExpressionGenerator implements IExpressionGenerator {
 			if (descriptor != null) {
 				IFunctionGenerator generator = builtinFunctionGeneratorLookupTable.getFunctionGenerator(descriptor);
 				if (generator != null) {
-					generator.generate(context, variableAccessStrategy, functionCall.getArguments());
+					generator.generate(context, functionCall.getArguments());
 				}
 			}
 
@@ -400,13 +398,13 @@ public class ExpressionGenerator implements IExpressionGenerator {
 			
 			public Boolean caseVariableReference(VariableReference variableReference) {
 				// TODO: redesign is needed here
-				String variableAccessString = new VariableAccessGenerator(context.getComputationModel(), variableAccessStrategy, variableReference).generate();
-				writer.print(variableAccessString);
+				String variableAccessString = new VariableAccessGenerator(context.getComputationModel(), context.getVariableAccessStrategy(), variableReference).generate();
+				out.print(variableAccessString);
 				if (!(variableReference.getTarget() instanceof TemplateVariableDeclaration)) {
 					for (Expression expression : variableReference.getArrayIndices()) {
-						writer.print("[");
+						out.print("[");
 						ExpressionGeneratorSwitch.this.doSwitch(expression);
-						writer.print("]");
+						out.print("]");
 					}
 				}
 				return true;

+ 1 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/ICompoundGenerator.java

@@ -19,6 +19,6 @@ import org.eclipselabs.mscript.language.il.Compound;
  */
 public interface ICompoundGenerator {
 
-	void generate(IMscriptGeneratorContext context, IVariableAccessStrategy variableAccessStrategy, Compound compound);
+	void generate(IMscriptGeneratorContext context, Compound compound);
 
 }

+ 1 - 2
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/IExpressionGenerator.java

@@ -19,7 +19,6 @@ import org.eclipselabs.mscript.typesystem.Expression;
  */
 public interface IExpressionGenerator {
 
-	void generate(IMscriptGeneratorContext context, IVariableAccessStrategy variableAccessStrategy,
-			Expression expression);
+	void generate(IMscriptGeneratorContext context, Expression expression);
 
 }

+ 1 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/IFunctionGenerator.java

@@ -21,6 +21,6 @@ import org.eclipselabs.mscript.typesystem.Expression;
  */
 public interface IFunctionGenerator {
 
-	void generate(IMscriptGeneratorContext context, IVariableAccessStrategy variableAccessStrategy, List<? extends Expression> arguments);
+	void generate(IMscriptGeneratorContext context, List<? extends Expression> arguments);
 	
 }

+ 3 - 4
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/IMscriptGeneratorContext.java

@@ -11,8 +11,6 @@
 
 package org.eclipselabs.mscript.codegen.c;
 
-import java.io.Writer;
-
 import org.eclipselabs.mscript.computation.computationmodel.ComputationModel;
 import org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext;
 
@@ -24,8 +22,9 @@ import org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext;
  */
 public interface IMscriptGeneratorContext {
 
-	IStaticEvaluationContext getStaticEvaluationContext();
+	Appendable getAppendable();
 	ComputationModel getComputationModel();
-	Writer getWriter();
+	IStaticEvaluationContext getStaticEvaluationContext();
+	IVariableAccessStrategy getVariableAccessStrategy();
 	
 }

+ 70 - 72
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/MscriptGenerator.java

@@ -11,12 +11,11 @@
 
 package org.eclipselabs.mscript.codegen.c;
 
-import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.eclipselabs.mscript.codegen.c.internal.VariableAccessStrategy;
 import org.eclipselabs.mscript.codegen.c.util.MscriptGeneratorUtil;
+import org.eclipselabs.mscript.common.util.PrintAppendable;
 import org.eclipselabs.mscript.language.il.ComputationCompound;
 import org.eclipselabs.mscript.language.il.ILFunctionDefinition;
 import org.eclipselabs.mscript.language.il.InputVariableDeclaration;
@@ -38,7 +37,7 @@ public class MscriptGenerator {
 	
 	private IMscriptGeneratorContext context;
 	
-	private PrintWriter writer;
+	private PrintAppendable out;
 	
 	/**
 	 * 
@@ -46,41 +45,41 @@ public class MscriptGenerator {
 	public MscriptGenerator(ILFunctionDefinition functionDefinition, IMscriptGeneratorContext context) {
 		this.functionDefinition = functionDefinition;
 		this.context = context;
-		this.writer = new PrintWriter(context.getWriter());
+		out = new PrintAppendable(context.getAppendable());
 	}
 	
 	public void generateHeaderCode() {
-		writer.printf("#ifndef %s_H_\n", functionDefinition.getName().toUpperCase());
-		writer.printf("#define %s_H_\n", functionDefinition.getName().toUpperCase());
-		writer.println();
+		out.printf("#ifndef %s_H_\n", functionDefinition.getName().toUpperCase());
+		out.printf("#define %s_H_\n", functionDefinition.getName().toUpperCase());
+		out.println();
 		generateHeaderIncludes();
-		writer.println();
-		writer.println("#ifdef __cplusplus");
-		writer.println("extern \"C\" {");
-		writer.println("#endif /* __cplusplus */");
-		writer.println();
+		out.println();
+		out.println("#ifdef __cplusplus");
+		out.println("extern \"C\" {");
+		out.println("#endif /* __cplusplus */");
+		out.println();
 		
 		if (functionDefinition.isStateful()) {
 			generateContextStructure();
 		}
 
-		writer.println();
+		out.println();
 		generateFunctionPrototypes();
-		writer.println();
+		out.println();
 
-		writer.println("#ifdef __cplusplus");
-		writer.println("}");
-		writer.println("#endif /* __cplusplus */");
-		writer.println();
-		writer.printf("#endif /* %s_H_ */\n", functionDefinition.getName().toUpperCase());
+		out.println("#ifdef __cplusplus");
+		out.println("}");
+		out.println("#endif /* __cplusplus */");
+		out.println();
+		out.printf("#endif /* %s_H_ */\n", functionDefinition.getName().toUpperCase());
 	}
 	
 	public void generateHeaderIncludes() {
-		writer.println("#include <stdint.h>");
+		out.println("#include <stdint.h>");
 	}
 	
 	public void generateContextStructure() {
-		writer.printf("typedef struct {\n");
+		out.printf("typedef struct {\n");
 		for (InputVariableDeclaration inputVariableDeclaration : functionDefinition.getInputVariableDeclarations()) {
 			if (inputVariableDeclaration.getCircularBufferSize() > 1) {
 				writeContextStructureMember(inputVariableDeclaration);
@@ -94,7 +93,7 @@ public class MscriptGenerator {
 		for (InstanceVariableDeclaration instanceVariableDeclaration : functionDefinition.getInstanceVariableDeclarations()) {
 			writeContextStructureMember(instanceVariableDeclaration);
 		}
-		writer.printf("} %s_Context;\n", functionDefinition.getName());
+		out.printf("} %s_Context;\n", functionDefinition.getName());
 	}
 	
 	private void writeContextStructureMember(StatefulVariableDeclaration variableDeclaration) {
@@ -102,12 +101,12 @@ public class MscriptGenerator {
 		DataType dataType = variableDeclaration.getDataType();
 		if (variableDeclaration.getCircularBufferSize() > 1) {
 			int bufferSize = variableDeclaration.getCircularBufferSize();
-			writer.printf("%s[%d];\n",
+			out.printf("%s[%d];\n",
 					MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), dataType, name, false),
 					bufferSize);
-			writer.printf("%s %s_index;\n", MscriptGeneratorUtil.getIndexCDataType(context.getComputationModel(), 2 * bufferSize), name);
+			out.printf("%s %s_index;\n", MscriptGeneratorUtil.getIndexCDataType(context.getComputationModel(), 2 * bufferSize), name);
 		} else {
-			writer.printf("%s;\n",
+			out.printf("%s;\n",
 					MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), dataType, name, false));
 		}
 	}
@@ -115,48 +114,47 @@ public class MscriptGenerator {
 	public void generateFunctionPrototypes() {
 		if (functionDefinition.isStateful()) {
 			generateInitializeFunctionHeader();
-			writer.println(";");
+			out.println(";");
 			generateComputeOutputsFunctionHeader();
-			writer.println(";");
+			out.println(";");
 			generateUpdateFunctionHeader();
-			writer.println(";");
+			out.println(";");
 		} else {
 			generateStatelessFunctionHeader();
-			writer.println(";");
+			out.println(";");
 		}
 	}
 
 	public void generateImplementationCode() {
 		generateImplementationIncludes();
-		writer.println();
+		out.println();
 		generateFunctionImplementations();
 	}
 	
 	public void generateImplementationIncludes() {
-		writer.println("#include <math.h>");
-		writer.println("#include <string.h>");
-		writer.printf("#include \"%s.h\"\n", functionDefinition.getName());
+		out.println("#include <math.h>");
+		out.println("#include <string.h>");
+		out.printf("#include \"%s.h\"\n", functionDefinition.getName());
 	}
 	
 	public void generateFunctionImplementations() {
-		IVariableAccessStrategy variableAccessStrategy = new VariableAccessStrategy();
 		if (functionDefinition.isStateful()) {
-			generateInitializeFunctionImplementation(variableAccessStrategy);
+			generateInitializeFunctionImplementation();
 
-			writer.println();
+			out.println();
 
-			generateComputeOutputsImplementation(variableAccessStrategy);
+			generateComputeOutputsImplementation();
 
-			writer.println();
+			out.println();
 
-			generateUpdateFunctionImplementation(variableAccessStrategy);
+			generateUpdateFunctionImplementation();
 		} else {
 			generateStatelessFunctionHeader();
-			writer.println(" {");
+			out.println(" {");
 			for (ComputationCompound compound : functionDefinition.getComputationCompounds()) {
-				compoundGenerator.generate(context, variableAccessStrategy, compound);
+				compoundGenerator.generate(context, compound);
 			}
-			writer.println("}");
+			out.println("}");
 		}
 	}
 
@@ -164,26 +162,26 @@ public class MscriptGenerator {
 	 * 
 	 */
 	private void generateInitializeFunctionHeader() {
-		writer.printf("void %s_initialize(%s_Context *context)", functionDefinition.getName(), functionDefinition.getName());
+		out.printf("void %s_initialize(%s_Context *context)", functionDefinition.getName(), functionDefinition.getName());
 	}
 
 	/**
 	 * @param variableAccessStrategy
 	 */
-	private void generateInitializeFunctionImplementation(IVariableAccessStrategy variableAccessStrategy) {
+	private void generateInitializeFunctionImplementation() {
 		generateInitializeFunctionHeader();
-		writer.println(" {");
+		out.println(" {");
 		generateInitializeIndexStatements(functionDefinition.getInputVariableDeclarations());
 		generateInitializeIndexStatements(functionDefinition.getOutputVariableDeclarations());
 		generateInitializeIndexStatements(functionDefinition.getInstanceVariableDeclarations());
-		compoundGenerator.generate(context, variableAccessStrategy, functionDefinition.getInitializationCompound());
-		writer.println("}");
+		compoundGenerator.generate(context, functionDefinition.getInitializationCompound());
+		out.println("}");
 	}
 
 	private void generateInitializeIndexStatements(List<? extends StatefulVariableDeclaration> statefulVariableDeclarations) {
 		for (StatefulVariableDeclaration statefulVariableDeclaration : statefulVariableDeclarations) {
 			if (statefulVariableDeclaration.getCircularBufferSize() > 1) {
-				writer.printf("context->%s_index = 0;\n", statefulVariableDeclaration.getName());
+				out.printf("context->%s_index = 0;\n", statefulVariableDeclaration.getName());
 			}
 		}
 	}
@@ -192,25 +190,25 @@ public class MscriptGenerator {
 	 * 
 	 */
 	private void generateComputeOutputsFunctionHeader() {
-		writer.printf("void %s(%s_Context *context", functionDefinition.getName(), functionDefinition.getName());
+		out.printf("void %s(%s_Context *context", functionDefinition.getName(), functionDefinition.getName());
 		for (InputVariableDeclaration inputVariableDeclaration : ILUtil.getDirectFeedthroughInputs(functionDefinition)) {
-			writer.printf(", %s", MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), inputVariableDeclaration.getDataType(), inputVariableDeclaration.getName(), false));
+			out.printf(", %s", MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), inputVariableDeclaration.getDataType(), inputVariableDeclaration.getName(), false));
 		}
 		for (OutputVariableDeclaration outputVariableDeclaration: functionDefinition.getOutputVariableDeclarations()) {
-			writer.printf(", %s", MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), outputVariableDeclaration.getDataType(), outputVariableDeclaration.getName(), true));
+			out.printf(", %s", MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), outputVariableDeclaration.getDataType(), outputVariableDeclaration.getName(), true));
 		}
-		writer.print(")");
+		out.print(")");
 	}
 
 	/**
 	 * @param variableAccessStrategy
 	 */
-	private void generateComputeOutputsImplementation(IVariableAccessStrategy variableAccessStrategy) {
+	private void generateComputeOutputsImplementation() {
 		generateComputeOutputsFunctionHeader();
-		writer.println(" {");
+		out.println(" {");
 		for (ComputationCompound compound : functionDefinition.getComputationCompounds()) {
 			if (!compound.getOutputs().isEmpty()) {
-				compoundGenerator.generate(context, variableAccessStrategy, compound);
+				compoundGenerator.generate(context, compound);
 			}
 		}
 		
@@ -223,32 +221,32 @@ public class MscriptGenerator {
 		for (OutputVariableDeclaration outputVariableDeclaration : functionDefinition.getOutputVariableDeclarations()) {
 			if (outputVariableDeclaration.getCircularBufferSize() > 1) {
 				String name = outputVariableDeclaration.getName();
-				writer.printf("context->%s[context->%s_index] = *%s;\n", name, name, name);
+				out.printf("context->%s[context->%s_index] = *%s;\n", name, name, name);
 			}
 		}
-		writer.println("}");
+		out.println("}");
 	}
 
 	/**
 	 * 
 	 */
 	private void generateUpdateFunctionHeader() {
-		writer.printf("void %s_update(%s_Context *context", functionDefinition.getName(), functionDefinition.getName());
+		out.printf("void %s_update(%s_Context *context", functionDefinition.getName(), functionDefinition.getName());
 		for (InputVariableDeclaration inputVariableDeclaration : getUpdateCodeInputs()) {
-			writer.printf(", %s", MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), inputVariableDeclaration.getDataType(), inputVariableDeclaration.getName(), false));
+			out.printf(", %s", MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), inputVariableDeclaration.getDataType(), inputVariableDeclaration.getName(), false));
 		}
-		writer.print(")");
+		out.print(")");
 	}
 
 	/**
 	 * @param variableAccessStrategy
 	 */
-	private void generateUpdateFunctionImplementation(IVariableAccessStrategy variableAccessStrategy) {
+	private void generateUpdateFunctionImplementation() {
 		generateUpdateFunctionHeader();
-		writer.println(" {");
+		out.println(" {");
 		for (ComputationCompound compound : functionDefinition.getComputationCompounds()) {
 			if (compound.getOutputs().isEmpty()) {
-				compoundGenerator.generate(context, variableAccessStrategy, compound);
+				compoundGenerator.generate(context, compound);
 			}
 		}
 		for (InputVariableDeclaration inputVariableDeclaration : getUpdateCodeInputs()) {
@@ -259,7 +257,7 @@ public class MscriptGenerator {
 		generateUpdateIndexStatements(functionDefinition.getInputVariableDeclarations());
 		generateUpdateIndexStatements(functionDefinition.getOutputVariableDeclarations());
 		generateUpdateIndexStatements(functionDefinition.getInstanceVariableDeclarations());
-		writer.println("}");
+		out.println("}");
 	}
 	
 	private List<InputVariableDeclaration> getUpdateCodeInputs() {
@@ -270,7 +268,7 @@ public class MscriptGenerator {
 
 	private void generateUpdateInputContextStatement(InputVariableDeclaration inputVariableDeclaration) {
 		String name = inputVariableDeclaration.getName();
-		writer.printf("context->%s[context->%s_index] = %s;\n", name, name, name);
+		out.printf("context->%s[context->%s_index] = %s;\n", name, name, name);
 	}
 
 	/**
@@ -280,7 +278,7 @@ public class MscriptGenerator {
 		for (StatefulVariableDeclaration statefulVariableDeclaration : statefulVariableDeclarations) {
 			if (statefulVariableDeclaration.getCircularBufferSize() > 1) {
 				String name = statefulVariableDeclaration.getName();
-				writer.printf("context->%s_index = (context->%s_index + 1) %% %d;\n", name, name, statefulVariableDeclaration.getCircularBufferSize());
+				out.printf("context->%s_index = (context->%s_index + 1) %% %d;\n", name, name, statefulVariableDeclaration.getCircularBufferSize());
 			}
 		}
 	}
@@ -289,25 +287,25 @@ public class MscriptGenerator {
 	 * 
 	 */
 	private void generateStatelessFunctionHeader() {
-		writer.printf("void %s(", functionDefinition.getName(), functionDefinition.getName());
+		out.printf("void %s(", functionDefinition.getName(), functionDefinition.getName());
 		boolean first = true;
 		for (InputVariableDeclaration inputVariableDeclaration: functionDefinition.getInputVariableDeclarations()) {
 			if (first) {
 				first = false;
 			} else {
-				writer.print(", ");
+				out.print(", ");
 			}
-			writer.print(MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), inputVariableDeclaration.getDataType(), inputVariableDeclaration.getName(), false));
+			out.print(MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), inputVariableDeclaration.getDataType(), inputVariableDeclaration.getName(), false));
 		}
 		for (OutputVariableDeclaration outputVariableDeclaration: functionDefinition.getOutputVariableDeclarations()) {
 			if (first) {
 				first = false;
 			} else {
-				writer.print(", ");
+				out.print(", ");
 			}
-			writer.print(MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), outputVariableDeclaration.getDataType(), outputVariableDeclaration.getName(), true));
+			out.print(MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), outputVariableDeclaration.getDataType(), outputVariableDeclaration.getName(), true));
 		}
-		writer.print(")");
+		out.print(")");
 	}
 	
 }

+ 31 - 16
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/MscriptGeneratorContext.java

@@ -11,8 +11,7 @@
 
 package org.eclipselabs.mscript.codegen.c;
 
-import java.io.Writer;
-
+import org.eclipselabs.mscript.codegen.c.internal.DefaultVariableAccessStrategy;
 import org.eclipselabs.mscript.computation.computationmodel.ComputationModel;
 import org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext;
 
@@ -22,26 +21,35 @@ import org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext;
  */
 public class MscriptGeneratorContext implements IMscriptGeneratorContext {
 
-	private IStaticEvaluationContext staticEvaluationContext;
+	private Appendable appendable;
 	private ComputationModel computationModel;
-	private Writer writer;
+	private IStaticEvaluationContext staticEvaluationContext;
+	private IVariableAccessStrategy variableAccessStrategy;
 	
 	/**
 	 * 
 	 */
-	public MscriptGeneratorContext(IStaticEvaluationContext staticEvaluationContext, ComputationModel computationModel, Writer writer) {
-		this.staticEvaluationContext = staticEvaluationContext;
-		this.computationModel = computationModel;
-		this.writer = writer;
+	public MscriptGeneratorContext(Appendable appendable, ComputationModel computationModel, IStaticEvaluationContext staticEvaluationContext) {
+		this(appendable, computationModel, staticEvaluationContext, new DefaultVariableAccessStrategy());
 	}
 	
 	/**
-	 * @return the staticEvaluationContext
+	 * 
 	 */
-	public IStaticEvaluationContext getStaticEvaluationContext() {
-		return staticEvaluationContext;
+	public MscriptGeneratorContext(Appendable appendable, ComputationModel computationModel, IStaticEvaluationContext staticEvaluationContext, IVariableAccessStrategy variableAccessStrategy) {
+		this.appendable = appendable;
+		this.computationModel = computationModel;
+		this.staticEvaluationContext = staticEvaluationContext;
+		this.variableAccessStrategy = variableAccessStrategy;
 	}
-	
+
+	/* (non-Javadoc)
+	 * @see org.eclipselabs.mscript.codegen.c.IGeneratorContext#getWriter()
+	 */
+	public Appendable getAppendable() {
+		return appendable;
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipselabs.mscript.codegen.c.IGeneratorContext#getComputationModel()
 	 */
@@ -49,11 +57,18 @@ public class MscriptGeneratorContext implements IMscriptGeneratorContext {
 		return computationModel;
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipselabs.mscript.codegen.c.IGeneratorContext#getWriter()
+	/**
+	 * @return the staticEvaluationContext
+	 */
+	public IStaticEvaluationContext getStaticEvaluationContext() {
+		return staticEvaluationContext;
+	}
+
+	/**
+	 * @return the variableAccessStrategy
 	 */
-	public Writer getWriter() {
-		return writer;
+	public IVariableAccessStrategy getVariableAccessStrategy() {
+		return variableAccessStrategy;
 	}
 
 }

+ 1 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/internal/VariableAccessStrategy.java

@@ -23,7 +23,7 @@ import org.eclipselabs.mscript.language.il.util.ILSwitch;
  * @author Andreas Unger
  *
  */
-public class VariableAccessStrategy implements IVariableAccessStrategy {
+public class DefaultVariableAccessStrategy implements IVariableAccessStrategy {
 
 	/* (non-Javadoc)
 	 * @see org.eclipselabs.mscript.codegen.c.IVariableAccessStrategy#getVariableAccessString(org.eclipselabs.mscript.language.il.VariableAccess)

+ 10 - 11
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/internal/RoundFunctionGenerator.java

@@ -11,7 +11,6 @@
 
 package org.eclipselabs.mscript.codegen.c.internal;
 
-import java.io.PrintWriter;
 import java.util.List;
 
 import org.eclipse.emf.ecore.util.EcoreUtil;
@@ -19,9 +18,9 @@ import org.eclipselabs.mscript.codegen.c.ExpressionGenerator;
 import org.eclipselabs.mscript.codegen.c.IExpressionGenerator;
 import org.eclipselabs.mscript.codegen.c.IFunctionGenerator;
 import org.eclipselabs.mscript.codegen.c.IMscriptGeneratorContext;
-import org.eclipselabs.mscript.codegen.c.IVariableAccessStrategy;
 import org.eclipselabs.mscript.codegen.c.internal.util.Caster;
 import org.eclipselabs.mscript.codegen.c.util.MscriptGeneratorUtil;
+import org.eclipselabs.mscript.common.util.PrintAppendable;
 import org.eclipselabs.mscript.computation.computationmodel.FixedPointFormat;
 import org.eclipselabs.mscript.computation.computationmodel.FloatingPointFormat;
 import org.eclipselabs.mscript.computation.computationmodel.NumberFormat;
@@ -42,8 +41,8 @@ public class RoundFunctionGenerator implements IFunctionGenerator {
 	/* (non-Javadoc)
 	 * @see org.eclipselabs.mscript.codegen.c.IFunctionGenerator#generate(java.util.List)
 	 */
-	public void generate(final IMscriptGeneratorContext context, final IVariableAccessStrategy variableAccessStrategy, List<? extends Expression> arguments) {
-		final PrintWriter writer = new PrintWriter(context.getWriter());
+	public void generate(final IMscriptGeneratorContext context, List<? extends Expression> arguments) {
+		final PrintAppendable out = new PrintAppendable(context.getAppendable());
 		
 		final Expression argument = arguments.get(0);
 		
@@ -66,13 +65,13 @@ public class RoundFunctionGenerator implements IFunctionGenerator {
 				@Override
 				protected void writeExpression() {
 					if (fractionLength > 0) {
-						writer.print("((");
-						expressionGenerator.generate(context, variableAccessStrategy, argument);
-						writer.printf(") + %d) & (%s) 0x%x", 1L << fractionLength - 1,
+						out.print("((");
+						expressionGenerator.generate(context, argument);
+						out.printf(") + %d) & (%s) 0x%x", 1L << fractionLength - 1,
 								MscriptGeneratorUtil.getCDataType(context.getComputationModel(), argumentDataType),
 								(1L << fixedPointFormat.getWordSize()) - 1 >>> fractionLength << fractionLength);
 					} else {
-						expressionGenerator.generate(context, variableAccessStrategy, argument);
+						expressionGenerator.generate(context, argument);
 					}
 				}
 				
@@ -82,9 +81,9 @@ public class RoundFunctionGenerator implements IFunctionGenerator {
 				
 				@Override
 				protected void writeExpression() {
-					writer.print("floor((");
-					expressionGenerator.generate(context, variableAccessStrategy, argument);
-					writer.print(") + 0.5)");
+					out.print("floor((");
+					expressionGenerator.generate(context, argument);
+					out.print(") + 0.5)");
 				}
 				
 			}.cast(context, argumentDataType, resultDataType);

+ 7 - 8
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/internal/SumFunctionGenerator.java

@@ -11,14 +11,13 @@
 
 package org.eclipselabs.mscript.codegen.c.internal;
 
-import java.io.PrintWriter;
 import java.util.List;
 
 import org.eclipselabs.mscript.codegen.c.ExpressionGenerator;
 import org.eclipselabs.mscript.codegen.c.IExpressionGenerator;
 import org.eclipselabs.mscript.codegen.c.IFunctionGenerator;
 import org.eclipselabs.mscript.codegen.c.IMscriptGeneratorContext;
-import org.eclipselabs.mscript.codegen.c.IVariableAccessStrategy;
+import org.eclipselabs.mscript.common.util.PrintAppendable;
 import org.eclipselabs.mscript.typesystem.DataType;
 import org.eclipselabs.mscript.typesystem.Expression;
 import org.eclipselabs.mscript.typesystem.TensorType;
@@ -35,8 +34,8 @@ public class SumFunctionGenerator implements IFunctionGenerator {
 	/* (non-Javadoc)
 	 * @see org.eclipselabs.mscript.codegen.c.IFunctionGenerator#generate(java.util.List)
 	 */
-	public void generate(IMscriptGeneratorContext context, IVariableAccessStrategy variableAccessStrategy, List<? extends Expression> arguments) {
-		PrintWriter writer = new PrintWriter(context.getWriter());
+	public void generate(IMscriptGeneratorContext context, List<? extends Expression> arguments) {
+		PrintAppendable out = new PrintAppendable(context.getAppendable());
 		
 		Expression argument = arguments.get(0);
 		
@@ -50,11 +49,11 @@ public class SumFunctionGenerator implements IFunctionGenerator {
 		int arraySize = TypeSystemUtil.getArraySize(tensorType);
 		for (int i = 0; i < arraySize; ++i) {
 			if (i > 0) {
-				writer.print(" + ");
+				out.print(" + ");
 			}
-			writer.print("(");
-			expressionGenerator.generate(context, variableAccessStrategy, argument);
-			writer.printf(")[%d]", i);
+			out.print("(");
+			expressionGenerator.generate(context, argument);
+			out.printf(")[%d]", i);
 		}
 	}
 	

+ 14 - 16
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/internal/util/CastToFixedPointHelper.java

@@ -11,9 +11,7 @@
 
 package org.eclipselabs.mscript.codegen.c.internal.util;
 
-import java.io.PrintWriter;
-import java.io.Writer;
-
+import org.eclipselabs.mscript.common.util.PrintAppendable;
 import org.eclipselabs.mscript.computation.computationmodel.ComputationModel;
 import org.eclipselabs.mscript.computation.computationmodel.FixedPointFormat;
 import org.eclipselabs.mscript.computation.computationmodel.FloatingPointFormat;
@@ -24,7 +22,7 @@ import org.eclipselabs.mscript.typesystem.DataType;
 public abstract class CastToFixedPointHelper extends ComputationModelSwitch<Boolean> {
 
 	private ComputationModel computationModel;
-	private PrintWriter writer;
+	private PrintAppendable out;
 
 	private DataType expressionDataType;
 	private int wordSize;
@@ -33,12 +31,12 @@ public abstract class CastToFixedPointHelper extends ComputationModelSwitch<Bool
 	/**
 	 * 
 	 */
-	public CastToFixedPointHelper(ComputationModel computationModel, Writer writer, DataType expressionDataType, int wordSize, int fractionLength) {
+	public CastToFixedPointHelper(ComputationModel computationModel, Appendable appendable, DataType expressionDataType, int wordSize, int fractionLength) {
 		this.computationModel = computationModel;
-		this.writer = new PrintWriter(writer);
 		this.expressionDataType = expressionDataType;
 		this.wordSize = wordSize;
 		this.fractionLength = fractionLength;
+		out = new PrintAppendable(appendable);
 	}
 	
 	public void cast() {
@@ -52,13 +50,13 @@ public abstract class CastToFixedPointHelper extends ComputationModelSwitch<Bool
 	@Override
 	public Boolean caseFloatingPointFormat(FloatingPointFormat floatingPointFormat) {
 		if (fractionLength > 0) {
-			writer.printf("((%s) floor((", getCDataType());
+			out.printf("((%s) floor((", getCDataType());
 			writeExpression();
-			writer.printf(") * pow(2, %d) + 0.5))", fractionLength);
+			out.printf(") * pow(2, %d) + 0.5))", fractionLength);
 		} else {
-			writer.printf("((%s) (", getCDataType());
+			out.printf("((%s) (", getCDataType());
 			writeExpression();
-			writer.print("))");
+			out.print("))");
 		}
 		return true;
 	}
@@ -70,25 +68,25 @@ public abstract class CastToFixedPointHelper extends ComputationModelSwitch<Bool
 	public Boolean caseFixedPointFormat(FixedPointFormat fixedPointFormat) {
 		if (wordSize != fixedPointFormat.getWordSize()) {
 			if (fractionLength < fixedPointFormat.getFractionLength()) {
-				writer.printf("(%s) ((", getCDataType());
+				out.printf("(%s) ((", getCDataType());
 			} else {
-				writer.printf("((%s) (", getCDataType());
+				out.printf("((%s) (", getCDataType());
 			}
 		}
 		if (fractionLength != fixedPointFormat.getFractionLength()) {
 			if (wordSize == fixedPointFormat.getWordSize()) {
-				writer.print("((");
+				out.print("((");
 			}
 			writeExpression();
 			if (fractionLength > fixedPointFormat.getFractionLength()) {
-				writer.printf(") << %d)", fractionLength - fixedPointFormat.getFractionLength());
+				out.printf(") << %d)", fractionLength - fixedPointFormat.getFractionLength());
 			} else {
-				writer.printf(") >> %d)", fixedPointFormat.getFractionLength() - fractionLength);
+				out.printf(") >> %d)", fixedPointFormat.getFractionLength() - fractionLength);
 			}
 		} else {
 			writeExpression();
 			if (wordSize != fixedPointFormat.getWordSize()) {
-				writer.print("))");
+				out.print("))");
 			}
 		}
 		return true;

+ 10 - 12
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/internal/util/CastToFloatingPointHelper.java

@@ -11,9 +11,7 @@
 
 package org.eclipselabs.mscript.codegen.c.internal.util;
 
-import java.io.PrintWriter;
-import java.io.Writer;
-
+import org.eclipselabs.mscript.common.util.PrintAppendable;
 import org.eclipselabs.mscript.computation.computationmodel.ComputationModel;
 import org.eclipselabs.mscript.computation.computationmodel.FixedPointFormat;
 import org.eclipselabs.mscript.computation.computationmodel.FloatingPointFormat;
@@ -24,7 +22,7 @@ import org.eclipselabs.mscript.typesystem.DataType;
 public abstract class CastToFloatingPointHelper extends ComputationModelSwitch<Boolean> {
 
 	private ComputationModel computationModel;
-	private PrintWriter writer;
+	private PrintAppendable out;
 
 	private DataType expressionDataType;
 	private FloatingPointFormat targetFloatingPointFormat;
@@ -32,11 +30,11 @@ public abstract class CastToFloatingPointHelper extends ComputationModelSwitch<B
 	/**
 	 * 
 	 */
-	public CastToFloatingPointHelper(ComputationModel computationModel, Writer writer, DataType expressionDataType, FloatingPointFormat targetFloatingPointFormat) {
+	public CastToFloatingPointHelper(ComputationModel computationModel, Appendable appendable, DataType expressionDataType, FloatingPointFormat targetFloatingPointFormat) {
 		this.computationModel = computationModel;
-		this.writer = new PrintWriter(writer);
 		this.expressionDataType = expressionDataType;
 		this.targetFloatingPointFormat = targetFloatingPointFormat;
+		out = new PrintAppendable(appendable);
 	}
 	
 	public void cast() {
@@ -52,9 +50,9 @@ public abstract class CastToFloatingPointHelper extends ComputationModelSwitch<B
 		if (floatingPointFormat.getKind() == targetFloatingPointFormat.getKind()) {
 			writeExpression();
 		} else {
-			writer.printf("((%s) (", getCDataType());
+			out.printf("((%s) (", getCDataType());
 			writeExpression();
-			writer.print("))");
+			out.print("))");
 		}
 		return true;
 	}
@@ -65,13 +63,13 @@ public abstract class CastToFloatingPointHelper extends ComputationModelSwitch<B
 	@Override
 	public Boolean caseFixedPointFormat(FixedPointFormat fixedPointFormat) {
 		if (fixedPointFormat.getFractionLength() > 0) {
-			writer.printf("((%s) ((", getCDataType());
+			out.printf("((%s) ((", getCDataType());
 			writeExpression();
-			writer.printf(") * pow(2, -%d)))", fixedPointFormat.getFractionLength());
+			out.printf(") * pow(2, -%d)))", fixedPointFormat.getFractionLength());
 		} else {
-			writer.printf("((%s) (", getCDataType());
+			out.printf("((%s) (", getCDataType());
 			writeExpression();
-			writer.print("))");
+			out.print("))");
 		}
 		return true;
 	}

+ 2 - 2
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/internal/util/Caster.java

@@ -28,7 +28,7 @@ public abstract class Caster {
 		if (targetDataType instanceof NumericType) {
 			NumberFormat numberFormat = context.getComputationModel().getNumberFormat(targetDataType);
 			if (numberFormat instanceof FloatingPointFormat) {
-				new CastToFloatingPointHelper(context.getComputationModel(), context.getWriter(), expressionDataType, (FloatingPointFormat) numberFormat) {
+				new CastToFloatingPointHelper(context.getComputationModel(), context.getAppendable(), expressionDataType, (FloatingPointFormat) numberFormat) {
 					
 					@Override
 					protected void writeExpression() {
@@ -38,7 +38,7 @@ public abstract class Caster {
 				}.cast();
 			} else if (numberFormat instanceof FixedPointFormat) {
 				FixedPointFormat fixedPointFormat = (FixedPointFormat) numberFormat;
-				new CastToFixedPointHelper(context.getComputationModel(), context.getWriter(), expressionDataType, fixedPointFormat.getWordSize(), fixedPointFormat.getFractionLength()) {
+				new CastToFixedPointHelper(context.getComputationModel(), context.getAppendable(), expressionDataType, fixedPointFormat.getWordSize(), fixedPointFormat.getFractionLength()) {
 
 					@Override
 					protected void writeExpression() {

+ 16 - 19
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/util/MscriptGeneratorUtil.java

@@ -11,14 +11,11 @@
 
 package org.eclipselabs.mscript.codegen.c.util;
 
-import java.io.PrintWriter;
-import java.io.Writer;
-
 import org.eclipselabs.mscript.codegen.c.ExpressionGenerator;
 import org.eclipselabs.mscript.codegen.c.IMscriptGeneratorContext;
-import org.eclipselabs.mscript.codegen.c.IVariableAccessStrategy;
 import org.eclipselabs.mscript.codegen.c.internal.util.CastToFixedPointHelper;
 import org.eclipselabs.mscript.codegen.c.internal.util.CastToFloatingPointHelper;
+import org.eclipselabs.mscript.common.util.PrintAppendable;
 import org.eclipselabs.mscript.computation.computationmodel.ComputationModel;
 import org.eclipselabs.mscript.computation.computationmodel.FixedPointFormat;
 import org.eclipselabs.mscript.computation.computationmodel.FloatingPointFormat;
@@ -129,28 +126,28 @@ public class MscriptGeneratorUtil {
 	}
 
 	public static void cast(IMscriptGeneratorContext context, String expression, DataType expressionDataType, DataType targetDataType) {
-		cast(context.getComputationModel(), context.getWriter(), expression, expressionDataType, targetDataType);
+		cast(context.getComputationModel(), context.getAppendable(), expression, expressionDataType, targetDataType);
 	}
 	
-	public static void cast(ComputationModel computationModel, final Writer writer, final String expression, DataType expressionDataType, DataType targetDataType) {
+	public static void cast(ComputationModel computationModel, final Appendable appendable, final String expression, DataType expressionDataType, DataType targetDataType) {
 		if (targetDataType instanceof NumericType) {
 			NumberFormat numberFormat = computationModel.getNumberFormat(targetDataType);
 			if (numberFormat instanceof FloatingPointFormat) {
-				new CastToFloatingPointHelper(computationModel, writer, expressionDataType, (FloatingPointFormat) numberFormat) {
+				new CastToFloatingPointHelper(computationModel, appendable, expressionDataType, (FloatingPointFormat) numberFormat) {
 					
 					@Override
 					protected void writeExpression() {
-						new PrintWriter(writer).print(expression);
+						new PrintAppendable(appendable).print(expression);
 					}
 					
 				}.cast();
 			} else if (numberFormat instanceof FixedPointFormat) {
 				FixedPointFormat fixedPointFormat = (FixedPointFormat) numberFormat;
-				new CastToFixedPointHelper(computationModel, writer, expressionDataType, fixedPointFormat.getWordSize(), fixedPointFormat.getFractionLength()) {
+				new CastToFixedPointHelper(computationModel, appendable, expressionDataType, fixedPointFormat.getWordSize(), fixedPointFormat.getFractionLength()) {
 
 					@Override
 					protected void writeExpression() {
-						new PrintWriter(writer).print(expression);
+						new PrintAppendable(appendable).print(expression);
 					}
 					
 				}.cast();
@@ -158,37 +155,37 @@ public class MscriptGeneratorUtil {
 				throw new IllegalArgumentException();
 			}
 		} else {
-			new PrintWriter(writer).print(expression);
+			new PrintAppendable(appendable).print(expression);
 		}
 	}
 
-	public static void cast(IMscriptGeneratorContext context, IVariableAccessStrategy variableAccessStrategy, Expression expression, DataType targetDataType) {
+	public static void cast(IMscriptGeneratorContext context, Expression expression, DataType targetDataType) {
 		if (targetDataType instanceof NumericType) {
 			NumberFormat numberFormat = context.getComputationModel().getNumberFormat(targetDataType);
-			castNumericType(context, variableAccessStrategy, numberFormat, expression);
+			castNumericType(context, numberFormat, expression);
 		} else {
-			new ExpressionGenerator().generate(context, variableAccessStrategy, expression);
+			new ExpressionGenerator().generate(context, expression);
 		}
 	}
 
-	public static void castNumericType(final IMscriptGeneratorContext context, final IVariableAccessStrategy variableAccessStrategy, NumberFormat numberFormat, final Expression expression) {
+	public static void castNumericType(final IMscriptGeneratorContext context, NumberFormat numberFormat, final Expression expression) {
 		DataType expressionDataType = context.getStaticEvaluationContext().getValue(expression).getDataType();
 		if (numberFormat instanceof FloatingPointFormat) {
-			new CastToFloatingPointHelper(context.getComputationModel(), context.getWriter(), expressionDataType, (FloatingPointFormat) numberFormat) {
+			new CastToFloatingPointHelper(context.getComputationModel(), context.getAppendable(), expressionDataType, (FloatingPointFormat) numberFormat) {
 				
 				@Override
 				protected void writeExpression() {
-					new ExpressionGenerator().generate(context, variableAccessStrategy, expression);
+					new ExpressionGenerator().generate(context, expression);
 				}
 				
 			}.cast();
 		} else if (numberFormat instanceof FixedPointFormat) {
 			FixedPointFormat fixedPointFormat = (FixedPointFormat) numberFormat;
-			new CastToFixedPointHelper(context.getComputationModel(), context.getWriter(), expressionDataType, fixedPointFormat.getWordSize(), fixedPointFormat.getFractionLength()) {
+			new CastToFixedPointHelper(context.getComputationModel(), context.getAppendable(), expressionDataType, fixedPointFormat.getWordSize(), fixedPointFormat.getFractionLength()) {
 
 				@Override
 				protected void writeExpression() {
-					new ExpressionGenerator().generate(context, variableAccessStrategy, expression);
+					new ExpressionGenerator().generate(context, expression);
 				}
 				
 			}.cast();

+ 2 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.common/META-INF/MANIFEST.MF

@@ -9,4 +9,5 @@ Require-Bundle: org.eclipse.core.runtime
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipselabs.mscript.common.internal.util;x-friends:="org.eclipselabs.mscript.language,org.eclipselabs.mscript.codegen.c",
- org.eclipselabs.mscript.common.registry
+ org.eclipselabs.mscript.common.registry,
+ org.eclipselabs.mscript.common.util

+ 83 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.common/src/org/eclipselabs/mscript/common/util/PrintAppendable.java

@@ -0,0 +1,83 @@
+/****************************************************************************
+ * Copyright (c) 2008, 2011 Andreas Unger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Andreas Unger - initial API and implementation 
+ ****************************************************************************/
+
+package org.eclipselabs.mscript.common.util;
+
+import java.io.IOException;
+import java.util.Formatter;
+
+/**
+ * @author Andreas Unger
+ *
+ */
+public class PrintAppendable {
+
+	private Appendable appendable;
+	private Formatter formatter;
+	private IOException ioException;
+	
+	/**
+	 * 
+	 */
+	public PrintAppendable(Appendable appendable) {
+		this.appendable = appendable;
+	}
+	
+	public PrintAppendable print(CharSequence charSequence) {
+		try {
+			appendable.append(charSequence);
+		} catch (IOException e) {
+			ioException = e;
+		}
+		return this;
+	}
+	
+	public PrintAppendable println() {
+		try {
+			appendable.append("\n");
+		} catch (IOException e) {
+			ioException = e;
+		}
+		return this;
+	}
+
+	public PrintAppendable println(CharSequence charSequence) {
+		try {
+			appendable.append(charSequence).append("\n");
+		} catch (IOException e) {
+			ioException = e;
+		}
+		return this;
+	}
+
+	public PrintAppendable printf(String format, Object... args) {
+		IOException ioException = getFormatter().format(format, args).ioException();
+		if (ioException != null) {
+			this.ioException = ioException;
+		}
+		return this;
+	}
+
+	/**
+	 * @return the ioException
+	 */
+	public IOException getIOException() {
+		return ioException;
+	}
+	
+	private Formatter getFormatter() {
+		if (formatter == null) {
+			formatter = new Formatter(appendable);
+		}
+		return formatter;
+	}
+	
+}