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