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 */
18 package org.apache.bcel.generic;
19
20 import java.io.DataOutputStream;
21 import java.io.IOException;
22 import org.apache.bcel.util.ByteSequence;
23
24 /**
25 * NEWARRAY - Create new array of basic type (int, short, ...)
26 * <PRE>Stack: ..., count -> ..., arrayref</PRE>
27 * type must be one of T_INT, T_SHORT, ...
28 *
29 * @version $Id: NEWARRAY.java 1152072 2011-07-29 01:54:05Z dbrosius $
30 * @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
31 */
32 public class NEWARRAY extends Instruction implements AllocationInstruction, ExceptionThrower,
33 StackProducer {
34
35 private static final long serialVersionUID = 7048445841018649405L;
36 private byte type;
37
38
39 /**
40 * Empty constructor needed for the Class.newInstance() statement in
41 * Instruction.readInstruction(). Not to be used otherwise.
42 */
43 NEWARRAY() {
44 }
45
46
47 public NEWARRAY(byte type) {
48 super(org.apache.bcel.Constants.NEWARRAY, (short) 2);
49 this.type = type;
50 }
51
52
53 public NEWARRAY(BasicType type) {
54 this(type.getType());
55 }
56
57
58 /**
59 * Dump instruction as byte code to stream out.
60 * @param out Output stream
61 */
62 @Override
63 public void dump( DataOutputStream out ) throws IOException {
64 out.writeByte(opcode);
65 out.writeByte(type);
66 }
67
68
69 /**
70 * @return numeric code for basic element type
71 */
72 public final byte getTypecode() {
73 return type;
74 }
75
76
77 /**
78 * @return type of constructed array
79 */
80 public final Type getType() {
81 return new ArrayType(BasicType.getType(type), 1);
82 }
83
84
85 /**
86 * @return mnemonic for instruction
87 */
88 @Override
89 public String toString( boolean verbose ) {
90 return super.toString(verbose) + " " + org.apache.bcel.Constants.TYPE_NAMES[type];
91 }
92
93
94 /**
95 * Read needed data (e.g. index) from file.
96 */
97 @Override
98 protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException {
99 type = bytes.readByte();
100 length = 2;
101 }
102
103
104 public Class<?>[] getExceptions() {
105 return new Class[] {
106 org.apache.bcel.ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION
107 };
108 }
109
110
111 /**
112 * Call corresponding visitor method(s). The order is:
113 * Call visitor methods of implemented interfaces first, then
114 * call methods according to the class hierarchy in descending order,
115 * i.e., the most specific visitXXX() call comes last.
116 *
117 * @param v Visitor object
118 */
119 @Override
120 public void accept( Visitor v ) {
121 v.visitAllocationInstruction(this);
122 v.visitExceptionThrower(this);
123 v.visitStackProducer(this);
124 v.visitNEWARRAY(this);
125 }
126 }