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