001 package serp.bytecode; 002 003 import java.io.*; 004 005 import serp.bytecode.visitor.*; 006 007 /** 008 * The <code>iinc</code> instruction. 009 * 010 * @author Abe White 011 */ 012 public class IIncInstruction extends LocalVariableInstruction { 013 private int _inc = 0; 014 015 IIncInstruction(Code owner) { 016 super(owner, Constants.IINC); 017 } 018 019 int getLength() { 020 return super.getLength() + 2; 021 } 022 023 /** 024 * Return the increment for this IINC instruction. 025 */ 026 public int getIncrement() { 027 return _inc; 028 } 029 030 /** 031 * Set the increment on this IINC instruction. 032 * 033 * @return this Instruction, for method chaining 034 */ 035 public IIncInstruction setIncrement(int val) { 036 _inc = val; 037 return this; 038 } 039 040 public boolean equalsInstruction(Instruction other) { 041 if (this == other) 042 return true; 043 if (!(other instanceof IIncInstruction)) 044 return false; 045 if (!super.equalsInstruction(other)) 046 return false; 047 048 IIncInstruction ins = (IIncInstruction) other; 049 return getIncrement() == 0 || ins.getIncrement() == 0 050 || getIncrement() == ins.getIncrement(); 051 } 052 053 public void acceptVisit(BCVisitor visit) { 054 visit.enterIIncInstruction(this); 055 visit.exitIIncInstruction(this); 056 } 057 058 void read(Instruction other) { 059 super.read(other); 060 _inc = ((IIncInstruction) other).getIncrement(); 061 } 062 063 void read(DataInput in) throws IOException { 064 super.read(in); 065 setLocal(in.readUnsignedByte()); 066 _inc = in.readByte(); 067 } 068 069 void write(DataOutput out) throws IOException { 070 super.write(out); 071 out.writeByte(getLocal()); 072 out.writeByte(_inc); 073 } 074 }