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 }