X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Fcodegen%2Fssa%2Fstatements%2FLetApply.java;h=b4c2955385954515a8a516d7d4dd855c9a2d20db;hb=refs%2Fchanges%2F34%2F1534%2F3;hp=400cb6e4e373f78c480e8fc37c1da3dc203a47f2;hpb=fad36d463b75c3a9944d875fc627c3533f6da74d;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetApply.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetApply.java index 400cb6e4e..b4c295538 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetApply.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetApply.java @@ -15,6 +15,7 @@ import org.simantics.scl.compiler.internal.codegen.ssa.SSAExit; import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction; import org.simantics.scl.compiler.internal.codegen.ssa.SSAStatement; import org.simantics.scl.compiler.internal.codegen.ssa.binders.BoundVarBinder; +import org.simantics.scl.compiler.internal.codegen.ssa.binders.ClosureBinder; import org.simantics.scl.compiler.internal.codegen.ssa.binders.ValRefBinder; import org.simantics.scl.compiler.internal.codegen.ssa.exits.Jump; import org.simantics.scl.compiler.internal.codegen.ssa.exits.Switch; @@ -30,8 +31,12 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; import org.simantics.scl.compiler.types.util.MultiFunction; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class LetApply extends LetStatement implements ValRefBinder { + private static final Logger LOGGER = LoggerFactory.getLogger(LetApply.class); + private ValRef function; private ValRef[] parameters; Type effect; @@ -50,7 +55,7 @@ public class LetApply extends LetStatement implements ValRefBinder { } public void push(MethodBuilder mb) { - //mb.getCodeBuilder().mapLineNumber(lineNumber); + int oldLineNumber = mb.lineNumber(lineNumber); Val f = getFunction().getBinding(); Val[] ps = ValRef.getBindings(getParameters()); if(f instanceof Constant) { @@ -65,11 +70,13 @@ public class LetApply extends LetStatement implements ValRefBinder { mb.genericApply(ps.length); mb.unbox(target.getType()); } + mb.lineNumber(oldLineNumber); } @Override public void generateCode(MethodBuilder mb) { if(!target.generateOnFly) { + mb.lineNumber(lineNumber); push(mb); mb.store(target); } @@ -96,6 +103,7 @@ public class LetApply extends LetStatement implements ValRefBinder { public void bodyToString(PrintingContext context) { if(context.getErrorMarker() == this) context.append("!> "); + context.append("L" + lineNumber + ": "); if(hasEffect()) { context.append("<"); context.append(effect); @@ -356,6 +364,17 @@ public class LetApply extends LetStatement implements ValRefBinder { SSABlock headBlock = getParent(); SSAFunction thisFunction = headBlock.getParent(); + { + SSAFunction curParent=thisFunction; + while(true) { + if(curParent == function) + return; + ClosureBinder binder = curParent.getParent(); + if(binder == null) + break; + curParent = binder.getParentFunction(); + } + } /*System.out.println("--- INLINING -------------------------------"); System.out.println(thisFunction); @@ -401,8 +420,7 @@ public class LetApply extends LetStatement implements ValRefBinder { // Merge blocks thisFunction.mergeBlocks(function); - headBlock.setExit(new Jump(function.getFirstBlock().createOccurrence(), - parameters)); + headBlock.setExit(new Jump(lineNumber, function.getFirstBlock().createOccurrence(), parameters)); function.getReturnCont().replaceWith(tailBlock); this.function.remove(); @@ -488,4 +506,11 @@ public class LetApply extends LetStatement implements ValRefBinder { for(ValRef parameter : parameters) visitor.visit(parameter); } + + @Override + public void cleanup() { + function.remove(); + for(ValRef parameter : parameters) + parameter.remove(); + } }