/* * 03/21/2010 * * Copyright (C) 2010 Robert Futrell * robert_futrell at users.sourceforge.net * http://fifesoft.com/rsyntaxtextarea * * This library is distributed under a modified BSD license. See the included * RSTALanguageSupport.License.txt file for details. */ package org.fife.rsta.ac.java.classreader.constantpool; import java.io.DataInputStream; import java.io.IOException; import org.fife.rsta.ac.java.classreader.*; public class ConstantPoolInfoFactory implements ConstantTypes { /** * Private constructor to prevent instantiation. */ private ConstantPoolInfoFactory() { } public static ConstantPoolInfo readConstantPoolInfo(ClassFile cf, DataInputStream in) throws IOException { ConstantPoolInfo cpi = null; int tag = in.read(); switch (tag) { case CONSTANT_Class: int nameIndex = in.readUnsignedShort(); cpi = new ConstantClassInfo(nameIndex); break; case CONSTANT_Double: int highBytes = in.readInt(); int lowBytes = in.readInt(); cpi = new ConstantDoubleInfo(highBytes, lowBytes); break; case CONSTANT_Fieldref: int classIndex = in.readUnsignedShort(); int nameAndTypeIndex = in.readUnsignedShort(); cpi = new ConstantFieldrefInfo(classIndex, nameAndTypeIndex); break; case CONSTANT_Float: int bytes = in.readInt(); cpi = new ConstantFloatInfo(bytes); break; case CONSTANT_Integer: bytes = in.readInt(); cpi = new ConstantIntegerInfo(bytes); break; case CONSTANT_InterfaceMethodref: classIndex = in.readUnsignedShort(); nameAndTypeIndex = in.readUnsignedShort(); cpi = new ConstantInterfaceMethodrefInfo(classIndex, nameAndTypeIndex); break; case CONSTANT_Long: highBytes = in.readInt(); lowBytes = in.readInt(); cpi = new ConstantLongInfo(highBytes, lowBytes); break; case CONSTANT_Methodref: classIndex = in.readUnsignedShort(); nameAndTypeIndex = in.readUnsignedShort(); cpi = new ConstantMethodrefInfo(classIndex, nameAndTypeIndex); break; case CONSTANT_NameAndType: nameIndex = in.readUnsignedShort(); int descriptorIndex = in.readUnsignedShort(); cpi = new ConstantNameAndTypeInfo(nameIndex, descriptorIndex); break; case CONSTANT_String: int stringIndex = in.readUnsignedShort(); cpi = new ConstantStringInfo(cf, stringIndex); break; case CONSTANT_Utf8: int count = in.readUnsignedShort(); byte[] byteArray = new byte[count]; in.readFully(byteArray); cpi = new ConstantUtf8Info(byteArray); break; default: throw new IOException("Unknown tag for constant pool info: " + tag); } return cpi; } }