View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   https://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.bcel.generic;
20  
21  import java.io.DataOutputStream;
22  import java.io.IOException;
23  
24  import org.apache.bcel.ExceptionConst;
25  import org.apache.bcel.util.ByteSequence;
26  
27  /**
28   * NEWARRAY - Create new array of basic type (int, short, ...)
29   *
30   * <pre>
31   * Stack: ..., count -&gt; ..., arrayref
32   * </pre>
33   *
34   * type must be one of T_INT, T_SHORT, ...
35   */
36  public class NEWARRAY extends Instruction implements AllocationInstruction, ExceptionThrower, StackProducer {
37  
38      private byte type;
39  
40      /**
41       * Empty constructor needed for Instruction.readInstruction. Not to be used otherwise.
42       */
43      NEWARRAY() {
44      }
45  
46      /**
47       * Constructs a NEWARRAY instruction.
48       *
49       * @param type element type of array.
50       */
51      public NEWARRAY(final BasicType type) {
52          this(type.getType());
53      }
54  
55      /**
56       * Constructs a NEWARRAY instruction.
57       *
58       * @param type element type code.
59       */
60      public NEWARRAY(final byte type) {
61          super(org.apache.bcel.Const.NEWARRAY, (short) 2);
62          this.type = type;
63      }
64  
65      /**
66       * Call corresponding visitor method(s). The order is: Call visitor methods of implemented interfaces first, then call
67       * methods according to the class hierarchy in descending order, that is, the most specific visitXXX() call comes last.
68       *
69       * @param v Visitor object.
70       */
71      @Override
72      public void accept(final Visitor v) {
73          v.visitAllocationInstruction(this);
74          v.visitExceptionThrower(this);
75          v.visitStackProducer(this);
76          v.visitNEWARRAY(this);
77      }
78  
79      /**
80       * Dumps instruction as byte code to stream out.
81       *
82       * @param out Output stream.
83       */
84      @Override
85      public void dump(final DataOutputStream out) throws IOException {
86          out.writeByte(super.getOpcode());
87          out.writeByte(type);
88      }
89  
90      @Override
91      public Class<?>[] getExceptions() {
92          return new Class[] {ExceptionConst.NEGATIVE_ARRAY_SIZE_EXCEPTION};
93      }
94  
95      /**
96       * Gets the type of the constructed array.
97       *
98       * @return type of constructed array.
99       */
100     public final Type getType() {
101         return new ArrayType(BasicType.getType(type), 1);
102     }
103 
104     /**
105      * Gets the type code.
106      *
107      * @return numeric code for basic element type.
108      */
109     public final byte getTypecode() {
110         return type;
111     }
112 
113     /**
114      * Reads needed data (for example index) from file.
115      */
116     @Override
117     protected void initFromFile(final ByteSequence bytes, final boolean wide) throws IOException {
118         type = bytes.readByte();
119         super.setLength(2);
120     }
121 
122     /**
123      * @return mnemonic for instruction.
124      */
125     @Override
126     public String toString(final boolean verbose) {
127         return super.toString(verbose) + " " + org.apache.bcel.Const.getTypeName(type);
128     }
129 }