package org.simantics.scl.compiler.internal.codegen.ssa.exits; import java.util.ArrayList; import org.cojen.classfile.TypeDesc; import org.simantics.scl.compiler.internal.codegen.continuations.Cont; import org.simantics.scl.compiler.internal.codegen.continuations.ContRef; import org.simantics.scl.compiler.internal.codegen.references.Val; import org.simantics.scl.compiler.internal.codegen.references.ValRef; import org.simantics.scl.compiler.internal.codegen.ssa.SSABlock; 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.utils.CopyContext; import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder; import org.simantics.scl.compiler.internal.codegen.utils.PrintingContext; import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; public class Throw extends SSAExit { private static final TypeDesc RuntimeException = TypeDesc.forClass(RuntimeException.class); String description; public Throw(String description) { this.description = description; } @Override public void toString(PrintingContext context) { context.append("throw\n"); //context.append(exception); } @Override public void generateCode(MethodBuilder mb) { //mb.push(exception.getBinding()); //cb.mapLineNumber(location); mb.newObject(RuntimeException); mb.dup(); mb.loadConstant(description); mb.invokeConstructor(RuntimeException, new TypeDesc[] {TypeDesc.STRING}); mb.throwObject(); } @Override public void validate(SSAValidationContext context) { } @Override public void destroy() { // TODO } @Override public SSAExit copy(CopyContext context) { return new Throw(description); } @Override public void replace(TVar[] vars, Type[] replacements) { } @Override public void collectFreeVariables(SSAFunction function, ArrayList vars) { } @Override public Cont addParametersInFrontOf(ContRef contRef, Val[] newParameters, Val[] oldParameters, Cont proxy) { return proxy; } @Override public SSABlock[] getSuccessors() { return SSABlock.EMPTY_ARRAY; } }