1 /*
   2  * reserved comment block
   3  * DO NOT REMOVE OR ALTER!
   4  */
   5 package com.sun.org.apache.bcel.internal.classfile;
   6 
   7 /* ====================================================================
   8  * The Apache Software License, Version 1.1
   9  *
  10  * Copyright (c) 2001 The Apache Software Foundation.  All rights
  11  * reserved.
  12  *
  13  * Redistribution and use in source and binary forms, with or without
  14  * modification, are permitted provided that the following conditions
  15  * are met:
  16  *
  17  * 1. Redistributions of source code must retain the above copyright
  18  *    notice, this list of conditions and the following disclaimer.
  19  *
  20  * 2. Redistributions in binary form must reproduce the above copyright
  21  *    notice, this list of conditions and the following disclaimer in
  22  *    the documentation and/or other materials provided with the
  23  *    distribution.
  24  *
  25  * 3. The end-user documentation included with the redistribution,
  26  *    if any, must include the following acknowledgment:
  27  *       "This product includes software developed by the
  28  *        Apache Software Foundation (http://www.apache.org/)."
  29  *    Alternately, this acknowledgment may appear in the software itself,
  30  *    if and wherever such third-party acknowledgments normally appear.
  31  *
  32  * 4. The names "Apache" and "Apache Software Foundation" and
  33  *    "Apache BCEL" must not be used to endorse or promote products
  34  *    derived from this software without prior written permission. For
  35  *    written permission, please contact apache@apache.org.
  36  *
  37  * 5. Products derived from this software may not be called "Apache",
  38  *    "Apache BCEL", nor may "Apache" appear in their name, without
  39  *    prior written permission of the Apache Software Foundation.
  40  *
  41  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  42  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  43  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  44  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  45  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  46  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  47  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  48  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  49  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  50  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  51  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  52  * SUCH DAMAGE.
  53  * ====================================================================
  54  *
  55  * This software consists of voluntary contributions made by many
  56  * individuals on behalf of the Apache Software Foundation.  For more
  57  * information on the Apache Software Foundation, please see
  58  * <http://www.apache.org/>.
  59  */
  60 
  61 import  com.sun.org.apache.bcel.internal.Constants;
  62 import  java.io.*;
  63 
  64 /**
  65  * This class represents the type of a local variable or item on stack
  66  * used in the StackMap entries.
  67  *
  68  * @author  <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
  69  * @see     StackMapEntry
  70  * @see     StackMap
  71  * @see     Constants
  72  */
  73 public final class StackMapType implements Cloneable {
  74   private byte         type;
  75   private int          index = -1; // Index to CONSTANT_Class or offset
  76   private ConstantPool constant_pool;
  77 
  78   /**
  79    * Construct object from file stream.
  80    * @param file Input stream
  81    * @throws IOException
  82    */
  83   StackMapType(DataInputStream file, ConstantPool constant_pool) throws IOException
  84   {
  85     this(file.readByte(), -1, constant_pool);
  86 
  87     if(hasIndex())
  88       setIndex(file.readShort());
  89 
  90     setConstantPool(constant_pool);
  91   }
  92 
  93   /**
  94    * @param type type tag as defined in the Constants interface
  95    * @param index index to constant pool, or byte code offset
  96    */
  97   public StackMapType(byte type, int index, ConstantPool constant_pool) {
  98     setType(type);
  99     setIndex(index);
 100     setConstantPool(constant_pool);
 101   }
 102 
 103   public void setType(byte t) {
 104     if((t < Constants.ITEM_Bogus) || (t > Constants.ITEM_NewObject))
 105       throw new RuntimeException("Illegal type for StackMapType: " + t);
 106     type = t;
 107   }
 108 
 109   public byte getType()       { return type; }
 110   public void setIndex(int t) { index = t; }
 111 
 112   /** @return index to constant pool if type == ITEM_Object, or offset
 113    * in byte code, if type == ITEM_NewObject, and -1 otherwise
 114    */
 115   public int  getIndex()      { return index; }
 116 
 117   /**
 118    * Dump type entries to file.
 119    *
 120    * @param file Output file stream
 121    * @throws IOException
 122    */
 123   public final void dump(DataOutputStream file) throws IOException
 124   {
 125     file.writeByte(type);
 126     if(hasIndex())
 127       file.writeShort(getIndex());
 128   }
 129 
 130   /** @return true, if type is either ITEM_Object or ITEM_NewObject
 131    */
 132   public final boolean hasIndex() {
 133     return ((type == Constants.ITEM_Object) ||
 134             (type == Constants.ITEM_NewObject));
 135   }
 136 
 137   private String printIndex() {
 138     if(type == Constants.ITEM_Object)
 139       return ", class=" + constant_pool.constantToString(index, Constants.CONSTANT_Class);
 140     else if(type == Constants.ITEM_NewObject)
 141       return ", offset=" + index;
 142     else
 143       return "";
 144   }
 145 
 146   /**
 147    * @return String representation
 148    */
 149   public final String toString() {
 150     return "(type=" + Constants.ITEM_NAMES[type] + printIndex() + ")";
 151   }
 152 
 153   /**
 154    * @return deep copy of this object
 155    */
 156   public StackMapType copy() {
 157     try {
 158       return (StackMapType)clone();
 159     } catch(CloneNotSupportedException e) {}
 160 
 161     return null;
 162   }
 163 
 164   /**
 165    * @return Constant pool used by this object.
 166    */
 167   public final ConstantPool getConstantPool() { return constant_pool; }
 168 
 169   /**
 170    * @param constant_pool Constant pool to be used for this object.
 171    */
 172   public final void setConstantPool(ConstantPool constant_pool) {
 173     this.constant_pool = constant_pool;
 174   }
 175 }