1 /* 2 * reserved comment block 3 * DO NOT REMOVE OR ALTER! 4 */ 5 package com.sun.org.apache.bcel.internal.generic; 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 import java.io.*; 61 import com.sun.org.apache.bcel.internal.util.ByteSequence; 62 63 /** 64 * LDC - Push item from constant pool. 65 * 66 * <PRE>Stack: ... -> ..., item</PRE> 67 * 68 * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A> 69 */ 70 public class LDC extends CPInstruction 71 implements PushInstruction, ExceptionThrower, TypedInstruction { 72 /** 73 * Empty constructor needed for the Class.newInstance() statement in 74 * Instruction.readInstruction(). Not to be used otherwise. 75 */ LDC()76 LDC() {} 77 LDC(int index)78 public LDC(int index) { 79 super(com.sun.org.apache.bcel.internal.Constants.LDC_W, index); 80 setSize(); 81 } 82 83 // Adjust to proper size setSize()84 protected final void setSize() { 85 if(index <= com.sun.org.apache.bcel.internal.Constants.MAX_BYTE) { // Fits in one byte? 86 opcode = com.sun.org.apache.bcel.internal.Constants.LDC; 87 length = 2; 88 } else { 89 opcode = com.sun.org.apache.bcel.internal.Constants.LDC_W; 90 length = 3; 91 } 92 } 93 94 /** 95 * Dump instruction as byte code to stream out. 96 * @param out Output stream 97 */ dump(DataOutputStream out)98 public void dump(DataOutputStream out) throws IOException { 99 out.writeByte(opcode); 100 101 if(length == 2) 102 out.writeByte(index); 103 else // Applies for LDC_W 104 out.writeShort(index); 105 } 106 107 /** 108 * Set the index to constant pool and adjust size. 109 */ setIndex(int index)110 public final void setIndex(int index) { 111 super.setIndex(index); 112 setSize(); 113 } 114 115 /** 116 * Read needed data (e.g. index) from file. 117 */ initFromFile(ByteSequence bytes, boolean wide)118 protected void initFromFile(ByteSequence bytes, boolean wide) 119 throws IOException 120 { 121 length = 2; 122 index = bytes.readUnsignedByte(); 123 } 124 getValue(ConstantPoolGen cpg)125 public Object getValue(ConstantPoolGen cpg) { 126 com.sun.org.apache.bcel.internal.classfile.Constant c = cpg.getConstantPool().getConstant(index); 127 128 switch(c.getTag()) { 129 case com.sun.org.apache.bcel.internal.Constants.CONSTANT_String: 130 int i = ((com.sun.org.apache.bcel.internal.classfile.ConstantString)c).getStringIndex(); 131 c = cpg.getConstantPool().getConstant(i); 132 return ((com.sun.org.apache.bcel.internal.classfile.ConstantUtf8)c).getBytes(); 133 134 case com.sun.org.apache.bcel.internal.Constants.CONSTANT_Float: 135 return new Float(((com.sun.org.apache.bcel.internal.classfile.ConstantFloat)c).getBytes()); 136 137 case com.sun.org.apache.bcel.internal.Constants.CONSTANT_Integer: 138 return new Integer(((com.sun.org.apache.bcel.internal.classfile.ConstantInteger)c).getBytes()); 139 140 default: // Never reached 141 throw new RuntimeException("Unknown or invalid constant type at " + index); 142 } 143 } 144 getType(ConstantPoolGen cpg)145 public Type getType(ConstantPoolGen cpg) { 146 switch(cpg.getConstantPool().getConstant(index).getTag()) { 147 case com.sun.org.apache.bcel.internal.Constants.CONSTANT_String: return Type.STRING; 148 case com.sun.org.apache.bcel.internal.Constants.CONSTANT_Float: return Type.FLOAT; 149 case com.sun.org.apache.bcel.internal.Constants.CONSTANT_Integer: return Type.INT; 150 default: // Never reached 151 throw new RuntimeException("Unknown or invalid constant type at " + index); 152 } 153 } 154 getExceptions()155 public Class[] getExceptions() { 156 return com.sun.org.apache.bcel.internal.ExceptionConstants.EXCS_STRING_RESOLUTION; 157 } 158 159 /** 160 * Call corresponding visitor method(s). The order is: 161 * Call visitor methods of implemented interfaces first, then 162 * call methods according to the class hierarchy in descending order, 163 * i.e., the most specific visitXXX() call comes last. 164 * 165 * @param v Visitor object 166 */ accept(Visitor v)167 public void accept(Visitor v) { 168 v.visitStackProducer(this); 169 v.visitPushInstruction(this); 170 v.visitExceptionThrower(this); 171 v.visitTypedInstruction(this); 172 v.visitCPInstruction(this); 173 v.visitLDC(this); 174 } 175 } 176