001 package serp.bytecode;
002
003 import serp.bytecode.lowlevel.*;
004 import serp.bytecode.visitor.*;
005
006 /**
007 * An if instruction such as <code>ifnull, ifeq</code>, etc.
008 *
009 * @author Abe White
010 */
011 public class IfInstruction extends JumpInstruction {
012 IfInstruction(Code owner, int opcode) {
013 super(owner, opcode);
014 }
015
016 public int getStackChange() {
017 switch (getOpcode()) {
018 case Constants.IFACMPEQ:
019 case Constants.IFACMPNE:
020 case Constants.IFICMPEQ:
021 case Constants.IFICMPNE:
022 case Constants.IFICMPLT:
023 case Constants.IFICMPGT:
024 case Constants.IFICMPLE:
025 case Constants.IFICMPGE:
026 return -2;
027 case Constants.IFEQ:
028 case Constants.IFNE:
029 case Constants.IFLT:
030 case Constants.IFGT:
031 case Constants.IFLE:
032 case Constants.IFGE:
033 case Constants.IFNULL:
034 case Constants.IFNONNULL:
035 return -1;
036 default:
037 return super.getStackChange();
038 }
039 }
040
041 int getLength() {
042 return super.getLength() + 2;
043 }
044
045 public String getTypeName() {
046 switch (getOpcode()) {
047 case Constants.IFACMPEQ:
048 case Constants.IFACMPNE:
049 case Constants.IFNULL:
050 case Constants.IFNONNULL:
051 return "java.lang.Object";
052 default:
053 return "I";
054 }
055 }
056
057 public void acceptVisit(BCVisitor visit) {
058 visit.enterIfInstruction(this);
059 visit.exitIfInstruction(this);
060 }
061 }