• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
23 import org.apache.bcel.ExceptionConst;
24 import org.apache.bcel.util.ByteSequence;
25 
26 /**
27  * NEWARRAY -  Create new array of basic type (int, short, ...)
28  * <PRE>Stack: ..., count -&gt; ..., arrayref</PRE>
29  * type must be one of T_INT, T_SHORT, ...
30  *
31  * @version $Id$
32  */
33 public class NEWARRAY extends Instruction implements AllocationInstruction, ExceptionThrower,
34         StackProducer {
35 
36     private byte type;
37 
38 
39     /**
40      * Empty constructor needed for Instruction.readInstruction.
41      * Not to be used otherwise.
42      */
NEWARRAY()43     NEWARRAY() {
44     }
45 
46 
NEWARRAY(final byte type)47     public NEWARRAY(final byte type) {
48         super(org.apache.bcel.Const.NEWARRAY, (short) 2);
49         this.type = type;
50     }
51 
52 
NEWARRAY(final BasicType type)53     public NEWARRAY(final 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
dump( final DataOutputStream out )63     public void dump( final DataOutputStream out ) throws IOException {
64         out.writeByte(super.getOpcode());
65         out.writeByte(type);
66     }
67 
68 
69     /**
70      * @return numeric code for basic element type
71      */
getTypecode()72     public final byte getTypecode() {
73         return type;
74     }
75 
76 
77     /**
78      * @return type of constructed array
79      */
getType()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
toString( final boolean verbose )89     public String toString( final boolean verbose ) {
90         return super.toString(verbose) + " " + org.apache.bcel.Const.getTypeName(type);
91     }
92 
93 
94     /**
95      * Read needed data (e.g. index) from file.
96      */
97     @Override
initFromFile( final ByteSequence bytes, final boolean wide )98     protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException {
99         type = bytes.readByte();
100         super.setLength(2);
101     }
102 
103 
104     @Override
getExceptions()105     public Class<?>[] getExceptions() {
106         return new Class[] {
107             ExceptionConst.NEGATIVE_ARRAY_SIZE_EXCEPTION
108         };
109     }
110 
111 
112     /**
113      * Call corresponding visitor method(s). The order is:
114      * Call visitor methods of implemented interfaces first, then
115      * call methods according to the class hierarchy in descending order,
116      * i.e., the most specific visitXXX() call comes last.
117      *
118      * @param v Visitor object
119      */
120     @Override
accept( final Visitor v )121     public void accept( final Visitor v ) {
122         v.visitAllocationInstruction(this);
123         v.visitExceptionThrower(this);
124         v.visitStackProducer(this);
125         v.visitNEWARRAY(this);
126     }
127 }
128