X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Ftop%2FExpressionEvaluator.java;h=b51b188cda117823c4d8b0308f13eb607615aa91;hb=refs%2Fchanges%2F34%2F1534%2F3;hp=2b42bc7bab865c75d8873ba8150504eb6aa47cc6;hpb=4cf5be9db5c87ae991cf406cdcb9f7a62b76cb67;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java index 2b42bc7ba..b51b188cd 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java @@ -42,12 +42,12 @@ import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter; import org.simantics.scl.compiler.internal.codegen.writer.ExternalConstant; import org.simantics.scl.compiler.internal.codegen.writer.ModuleWriter; import org.simantics.scl.compiler.internal.elaboration.decomposed.DecomposedExpression; -import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator; import org.simantics.scl.compiler.internal.interpreted.IExpression; import org.simantics.scl.compiler.internal.parsing.exceptions.SCLSyntaxErrorException; import org.simantics.scl.compiler.internal.parsing.parser.SCLBlockParser; import org.simantics.scl.compiler.internal.parsing.parser.SCLParserImpl; import org.simantics.scl.compiler.internal.parsing.parser.SCLParserOptions; +import org.simantics.scl.compiler.internal.parsing.utils.LineLocators; import org.simantics.scl.compiler.runtime.MutableClassLoader; import org.simantics.scl.compiler.runtime.RuntimeEnvironment; import org.simantics.scl.compiler.types.TVar; @@ -203,6 +203,7 @@ public class ExpressionEvaluator { // Parse expression if(expressionText != null) { + compilationContext.lineLocator = LineLocators.createLineLocator(expressionText); try { switch(parseMode) { case BLOCK: { @@ -231,12 +232,14 @@ public class ExpressionEvaluator { throw new SCLExpressionCompilationException(errorLog.getErrors()); } } + else + compilationContext.lineLocator = LineLocators.DUMMY_LOCATOR; // Store local variables ArrayList lvTypes = new ArrayList(); if(expression instanceof EBlock) { EBlock block = (EBlock)expression; - if(localStorage != null && !(block.getStatements().getLast() instanceof GuardStatement)) { + if(localStorage != null && !(block.getLast() instanceof GuardStatement)) { THashSet localVariables = new THashSet(); ListIterator it = block.getStatements().listIterator(); while(it.hasNext()) { @@ -264,13 +267,13 @@ public class ExpressionEvaluator { localStorage.store(variableName, null, type); } } - if(!(block.getStatements().getLast() instanceof GuardStatement)) + if(!(block.getLast() instanceof GuardStatement)) block.addStatement(new GuardStatement(new EConstant(Builtins.TUPLE_CONSTRUCTORS[0]))); } // Elaboration { - TranslationContext context = new TranslationContext(compilationContext, localEnvironment); + TranslationContext context = new TranslationContext(compilationContext, localEnvironment, "expression"); expression = expression.resolve(context); if(!errorLog.hasNoErrors()) throw new SCLExpressionCompilationException(errorLog.getErrors()); @@ -300,9 +303,9 @@ public class ExpressionEvaluator { if(!errorLog.hasNoErrors()) throw new SCLExpressionCompilationException(errorLog.getErrors()); if(decorateExpression && Types.canonical(expectedEffect) != Types.NO_EFFECTS) { - ExpressionDecorator decorator = + ToplevelEffectDecorator decorator = new ToplevelEffectDecorator(errorLog, environment); - expression = expression.decorate(decorator); + expression = expression.accept(decorator); } expression = context.solveConstraints(environment, expression); expressionType = expression.getType(); @@ -365,9 +368,9 @@ public class ExpressionEvaluator { } // Convert to SSA - ModuleWriter mw = new ModuleWriter(namingPolicy.getModuleClassName()); + ModuleWriter mw = new ModuleWriter(namingPolicy.getModuleClassName(), compilationContext.lineLocator); DecomposedExpression decomposed = - DecomposedExpression.decompose(expression); + DecomposedExpression.decompose(errorLog, expression); SCLConstant constant = new SCLConstant( Name.create(moduleName, COMPUTATION_METHOD_NAME), @@ -388,9 +391,10 @@ public class ExpressionEvaluator { IVal[] parameterVals = w.getParameters(); for(int i=0;i classes = moduleBuilder.getClasses(); + ssaModule.cleanup(); // Load generated code and execute try {