001package serp.bytecode;
002
003import java.io.*;
004
005import 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 */
013public 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}