/* * Fernflower - The Analytical Java Decompiler * http://www.reversed-java.com * * (C) 2008 - 2010, Stiver * * This software is NEITHER public domain NOR free software * as per GNU License. See license.txt for more details. * * This software is distributed WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. */ package de.fernflower.modules.decompiler.exps; import java.util.ArrayList; import java.util.List; import de.fernflower.code.CodeConstants; import de.fernflower.main.DecompilerContext; import de.fernflower.main.ClassesProcessor.ClassNode; import de.fernflower.main.rels.MethodWrapper; import de.fernflower.modules.decompiler.ExprProcessor; import de.fernflower.modules.decompiler.vars.CheckTypesResult; import de.fernflower.struct.attr.StructExceptionsAttribute; import de.fernflower.struct.gen.VarType; import de.fernflower.util.InterpreterUtil; public class ExitExprent extends Exprent { public static final int EXIT_RETURN = 0; public static final int EXIT_THROW = 1; // return or throw statement private int exittype; private Exprent value; private VarType rettype; { this.type = EXPRENT_EXIT; } public ExitExprent(int exittype, Exprent value, VarType rettype) { this.exittype = exittype; this.value = value; this.rettype = rettype; } public Exprent copy() { return new ExitExprent(exittype, value==null?null:value.copy(), rettype); } public CheckTypesResult checkExprTypeBounds() { CheckTypesResult result = new CheckTypesResult(); if(exittype == EXIT_RETURN && rettype.type!=CodeConstants.TYPE_VOID) { result.addMinTypeExprent(value, VarType.getMinTypeInFamily(rettype.type_family)); result.addMaxTypeExprent(value, rettype); } return result; } public List getAllExprents() { List lst = new ArrayList(); if(value != null) { lst.add(value); } return lst; } public String toJava(int indent) { if(exittype == EXIT_RETURN) { StringBuilder buffer = new StringBuilder(); if(rettype.type!=CodeConstants.TYPE_VOID) { buffer.append(" "); ExprProcessor.getCastedExprent(value, rettype, buffer, indent, false); } return "return"+buffer.toString(); } else { MethodWrapper meth = (MethodWrapper)DecompilerContext.getProperty(DecompilerContext.CURRENT_METHOD_WRAPPER); ClassNode node = ((ClassNode)DecompilerContext.getProperty(DecompilerContext.CURRENT_CLASSNODE)); if(meth != null && node != null) { StructExceptionsAttribute attr = (StructExceptionsAttribute)meth.methodStruct.getAttributes().getWithKey("Exceptions"); if(attr != null) { String classname = null; for(int i=0;i