001 package serp.bytecode; 002 003 import java.io.*; 004 005 import serp.bytecode.visitor.*; 006 007 /** 008 * The <code>multianewarray</code> instruction, which creates a new 009 * multi-dimensional array. 010 * 011 * @author Abe White 012 */ 013 public class MultiANewArrayInstruction extends ClassInstruction { 014 private int _dims = -1; 015 016 MultiANewArrayInstruction(Code owner) { 017 super(owner, Constants.MULTIANEWARRAY); 018 } 019 020 int getLength() { 021 return super.getLength() + 1; 022 } 023 024 public int getStackChange() { 025 return -_dims + 1; 026 } 027 028 /** 029 * Return the dimensions of the array, or -1 if not set. 030 */ 031 public int getDimensions() { 032 return _dims; 033 } 034 035 /** 036 * Set the dimensions of the array. 037 * 038 * @return this instruction, for method chaining 039 */ 040 public MultiANewArrayInstruction setDimensions(int dims) { 041 _dims = dims; 042 return this; 043 } 044 045 /** 046 * Two MultiANewArray instructions are equal if they have the same 047 * type and dimensions, or if the type and dimensions of either is unset. 048 */ 049 public boolean equalsInstruction(Instruction other) { 050 if (other == this) 051 return true; 052 if (!(other instanceof MultiANewArrayInstruction)) 053 return false; 054 if (!super.equalsInstruction(other)) 055 return false; 056 057 MultiANewArrayInstruction ins = (MultiANewArrayInstruction) other; 058 int dims = getDimensions(); 059 int otherDims = ins.getDimensions(); 060 return dims == -1 || otherDims == -1 || dims == otherDims; 061 } 062 063 public void acceptVisit(BCVisitor visit) { 064 visit.enterMultiANewArrayInstruction(this); 065 visit.exitMultiANewArrayInstruction(this); 066 } 067 068 void read(Instruction orig) { 069 super.read(orig); 070 _dims = ((MultiANewArrayInstruction) orig).getDimensions(); 071 } 072 073 void read(DataInput in) throws IOException { 074 super.read(in); 075 _dims = in.readUnsignedByte(); 076 } 077 078 void write(DataOutput out) throws IOException { 079 super.write(out); 080 out.writeByte(_dims); 081 } 082 }