1 /*
   2  * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
   3  * @LastModified: Oct 2017
   4  */
   5 /*
   6  * Licensed to the Apache Software Foundation (ASF) under one or more
   7  * contributor license agreements.  See the NOTICE file distributed with
   8  * this work for additional information regarding copyright ownership.
   9  * The ASF licenses this file to You under the Apache License, Version 2.0
  10  * (the "License"); you may not use this file except in compliance with
  11  * the License.  You may obtain a copy of the License at
  12  *
  13  *      http://www.apache.org/licenses/LICENSE-2.0
  14  *
  15  * Unless required by applicable law or agreed to in writing, software
  16  * distributed under the License is distributed on an "AS IS" BASIS,
  17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18  * See the License for the specific language governing permissions and
  19  * limitations under the License.
  20  */
  21 
  22 package com.sun.org.apache.bcel.internal.generic;
  23 
  24 import com.sun.org.apache.bcel.internal.ExceptionConst;
  25 import com.sun.org.apache.bcel.internal.util.ByteSequence;
  26 import java.io.DataOutputStream;
  27 import java.io.IOException;
  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  * @version $Id: NEWARRAY.java 1747278 2016-06-07 17:28:43Z britter $
  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 the Class.newInstance() statement in
  44      * Instruction.readInstruction(). Not to be used otherwise.
  45      */
  46     NEWARRAY() {
  47     }
  48 
  49 
  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 
  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
  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      */
  75     public final byte getTypecode() {
  76         return type;
  77     }
  78 
  79 
  80     /**
  81      * @return type of constructed array
  82      */
  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
  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
 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
 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
 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 }