]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetApply.java
SCL compiler generates line numbers to bytecode
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / ssa / statements / LetApply.java
index 210e3ded3243fc20755dd4553dd19bd309f0d0ba..b4c2955385954515a8a516d7d4dd855c9a2d20db 100644 (file)
@@ -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,8 +364,17 @@ public class LetApply extends LetStatement implements ValRefBinder {
                
         SSABlock headBlock = getParent();
         SSAFunction thisFunction = headBlock.getParent();
-        if(thisFunction == function)
-            return;
+        {
+            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);
@@ -403,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();