1 package serp.bytecode; 2 3 import java.io.*; 4 5 import serp.bytecode.visitor.*; 6 7 /*** 8 * The <code>multianewarray</code> instruction, which creates a new 9 * multi-dimensional array. 10 * 11 * @author Abe White 12 */ 13 public class MultiANewArrayInstruction extends ClassInstruction { 14 private int _dims = -1; 15 16 MultiANewArrayInstruction(Code owner) { 17 super(owner, Constants.MULTIANEWARRAY); 18 } 19 20 int getLength() { 21 return super.getLength() + 1; 22 } 23 24 public int getStackChange() { 25 return -_dims + 1; 26 } 27 28 /*** 29 * Return the dimensions of the array, or -1 if not set. 30 */ 31 public int getDimensions() { 32 return _dims; 33 } 34 35 /*** 36 * Set the dimensions of the array. 37 * 38 * @return this instruction, for method chaining 39 */ 40 public MultiANewArrayInstruction setDimensions(int dims) { 41 _dims = dims; 42 return this; 43 } 44 45 /*** 46 * Two MultiANewArray instructions are equal if they have the same 47 * type and dimensions, or if the type and dimensions of either is unset. 48 */ 49 public boolean equalsInstruction(Instruction other) { 50 if (other == this) 51 return true; 52 if (!(other instanceof MultiANewArrayInstruction)) 53 return false; 54 if (!super.equalsInstruction(other)) 55 return false; 56 57 MultiANewArrayInstruction ins = (MultiANewArrayInstruction) other; 58 int dims = getDimensions(); 59 int otherDims = ins.getDimensions(); 60 return dims == -1 || otherDims == -1 || dims == otherDims; 61 } 62 63 public void acceptVisit(BCVisitor visit) { 64 visit.enterMultiANewArrayInstruction(this); 65 visit.exitMultiANewArrayInstruction(this); 66 } 67 68 void read(Instruction orig) { 69 super.read(orig); 70 _dims = ((MultiANewArrayInstruction) orig).getDimensions(); 71 } 72 73 void read(DataInput in) throws IOException { 74 super.read(in); 75 _dims = in.readUnsignedByte(); 76 } 77 78 void write(DataOutput out) throws IOException { 79 super.write(out); 80 out.writeByte(_dims); 81 } 82 }