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;
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;
}
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) {
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);
}
public void bodyToString(PrintingContext context) {
if(context.getErrorMarker() == this)
context.append("!> ");
+ context.append("L" + lineNumber + ": ");
if(hasEffect()) {
context.append("<");
context.append(effect);
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);
// 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();
for(ValRef parameter : parameters)
visitor.visit(parameter);
}
+
+ @Override
+ public void cleanup() {
+ function.remove();
+ for(ValRef parameter : parameters)
+ parameter.remove();
+ }
}