1 /* 2 * reserved comment block 3 * DO NOT REMOVE OR ALTER! 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 java.io.DataOutputStream; 25 import java.io.IOException; 26 27 import com.sun.org.apache.bcel.internal.classfile.ConstantUtf8; 28 import com.sun.org.apache.bcel.internal.classfile.ElementValue; 29 import com.sun.org.apache.bcel.internal.classfile.EnumElementValue; 30 31 /** 32 * @since 6.0 33 */ 34 public class EnumElementValueGen extends ElementValueGen 35 { 36 // For enum types, these two indices point to the type and value 37 private int typeIdx; 38 39 private int valueIdx; 40 41 /** 42 * This ctor assumes the constant pool already contains the right type and 43 * value - as indicated by typeIdx and valueIdx. This ctor is used for 44 * deserialization 45 */ EnumElementValueGen(final int typeIdx, final int valueIdx, final ConstantPoolGen cpool)46 protected EnumElementValueGen(final int typeIdx, final int valueIdx, 47 final ConstantPoolGen cpool) 48 { 49 super(ElementValueGen.ENUM_CONSTANT, cpool); 50 if (super.getElementValueType() != ENUM_CONSTANT) { 51 throw new RuntimeException( 52 "Only element values of type enum can be built with this ctor - type specified: " 53 + super.getElementValueType()); 54 } 55 this.typeIdx = typeIdx; 56 this.valueIdx = valueIdx; 57 } 58 59 /** 60 * Return immutable variant of this EnumElementValue 61 */ 62 @Override getElementValue()63 public ElementValue getElementValue() 64 { 65 System.err.println("Duplicating value: " + getEnumTypeString() + ":" 66 + getEnumValueString()); 67 return new EnumElementValue(super.getElementValueType(), typeIdx, valueIdx, 68 getConstantPool().getConstantPool()); 69 } 70 EnumElementValueGen(final ObjectType t, final String value, final ConstantPoolGen cpool)71 public EnumElementValueGen(final ObjectType t, final String value, final ConstantPoolGen cpool) 72 { 73 super(ElementValueGen.ENUM_CONSTANT, cpool); 74 typeIdx = cpool.addUtf8(t.getSignature());// was addClass(t); 75 valueIdx = cpool.addUtf8(value);// was addString(value); 76 } 77 EnumElementValueGen(final EnumElementValue value, final ConstantPoolGen cpool, final boolean copyPoolEntries)78 public EnumElementValueGen(final EnumElementValue value, final ConstantPoolGen cpool, 79 final boolean copyPoolEntries) 80 { 81 super(ENUM_CONSTANT, cpool); 82 if (copyPoolEntries) 83 { 84 typeIdx = cpool.addUtf8(value.getEnumTypeString());// was 85 // addClass(value.getEnumTypeString()); 86 valueIdx = cpool.addUtf8(value.getEnumValueString()); // was 87 // addString(value.getEnumValueString()); 88 } 89 else 90 { 91 typeIdx = value.getTypeIndex(); 92 valueIdx = value.getValueIndex(); 93 } 94 } 95 96 @Override dump(final DataOutputStream dos)97 public void dump(final DataOutputStream dos) throws IOException 98 { 99 dos.writeByte(super.getElementValueType()); // u1 type of value (ENUM_CONSTANT == 'e') 100 dos.writeShort(typeIdx); // u2 101 dos.writeShort(valueIdx); // u2 102 } 103 104 @Override stringifyValue()105 public String stringifyValue() 106 { 107 final ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(valueIdx); 108 return cu8.getBytes(); 109 // ConstantString cu8 = 110 // (ConstantString)getConstantPool().getConstant(valueIdx); 111 // return 112 // ((ConstantUtf8)getConstantPool().getConstant(cu8.getStringIndex())).getBytes(); 113 } 114 115 // BCELBUG: Should we need to call utility.signatureToString() on the output 116 // here? getEnumTypeString()117 public String getEnumTypeString() 118 { 119 // Constant cc = getConstantPool().getConstant(typeIdx); 120 // ConstantClass cu8 = 121 // (ConstantClass)getConstantPool().getConstant(typeIdx); 122 // return 123 // ((ConstantUtf8)getConstantPool().getConstant(cu8.getNameIndex())).getBytes(); 124 return ((ConstantUtf8) getConstantPool().getConstant(typeIdx)) 125 .getBytes(); 126 // return Utility.signatureToString(cu8.getBytes()); 127 } 128 getEnumValueString()129 public String getEnumValueString() 130 { 131 return ((ConstantUtf8) getConstantPool().getConstant(valueIdx)).getBytes(); 132 // ConstantString cu8 = 133 // (ConstantString)getConstantPool().getConstant(valueIdx); 134 // return 135 // ((ConstantUtf8)getConstantPool().getConstant(cu8.getStringIndex())).getBytes(); 136 } 137 getValueIndex()138 public int getValueIndex() 139 { 140 return valueIdx; 141 } 142 getTypeIndex()143 public int getTypeIndex() 144 { 145 return typeIdx; 146 } 147 } 148