| /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under |
| * the terms of the Common Public License v1.0 which accompanies this distribution, |
| * and is available at http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * $Id: CONSTANT_info.java,v 1.1.1.1 2004/05/09 16:57:48 vlad_r Exp $ |
| */ |
| package com.vladium.jcd.cls.constant; |
| |
| import java.io.IOException; |
| |
| import com.vladium.jcd.compiler.IClassFormatOutput; |
| import com.vladium.jcd.lib.UDataInputStream; |
| import com.vladium.jcd.lib.UDataOutputStream; |
| |
| // ---------------------------------------------------------------------------- |
| /** |
| * An abstract base for all other CONSTANT_XXX_info structures. See $4.4 in VM |
| * spec 1.0 for all such structure definitions. |
| * |
| * @author (C) 2001, Vlad Roubtsov |
| */ |
| public |
| abstract class CONSTANT_info implements Cloneable, IClassFormatOutput |
| { |
| // public: ................................................................ |
| |
| |
| /** |
| * Returns the tag byte for this CONSTANT type [this data is |
| * static class data]. |
| */ |
| public abstract byte tag (); |
| |
| // Visitor: |
| |
| public abstract Object accept (ICONSTANTVisitor visitor, Object ctx); |
| |
| public abstract String toString (); |
| |
| /** |
| * Returns the number of constant pool index slots occupied by this |
| * CONSTANT type. This implementation defaults to returning '1'. |
| * |
| * @see CONSTANT_Long_info |
| * @see CONSTANT_Long_info |
| * |
| * @return int |
| */ |
| public int width () |
| { |
| return 1; |
| } |
| |
| |
| /** |
| * Virtual constructor method for all CONSTANT_XXX_info structures. |
| */ |
| public static CONSTANT_info new_CONSTANT_info (final UDataInputStream bytes) |
| throws IOException |
| { |
| byte tag = bytes.readByte (); |
| |
| switch (tag) |
| { |
| case CONSTANT_Utf8_info.TAG: |
| return new CONSTANT_Utf8_info (bytes); |
| |
| case CONSTANT_Integer_info.TAG: |
| return new CONSTANT_Integer_info (bytes); |
| |
| case CONSTANT_Float_info.TAG: |
| return new CONSTANT_Float_info (bytes); |
| |
| case CONSTANT_Long_info.TAG: |
| return new CONSTANT_Long_info (bytes); |
| |
| case CONSTANT_Double_info.TAG: |
| return new CONSTANT_Double_info (bytes); |
| |
| |
| case CONSTANT_Class_info.TAG: |
| return new CONSTANT_Class_info (bytes); |
| |
| case CONSTANT_String_info.TAG: |
| return new CONSTANT_String_info (bytes); |
| |
| |
| case CONSTANT_Fieldref_info.TAG: |
| return new CONSTANT_Fieldref_info (bytes); |
| |
| case CONSTANT_Methodref_info.TAG: |
| return new CONSTANT_Methodref_info (bytes); |
| |
| case CONSTANT_InterfaceMethodref_info.TAG: |
| return new CONSTANT_InterfaceMethodref_info (bytes); |
| |
| |
| case CONSTANT_NameAndType_info.TAG: |
| return new CONSTANT_NameAndType_info (bytes); |
| |
| default: throw new IllegalStateException ("CONSTANT_info: invalid tag value [" + tag + ']'); |
| |
| } // end of switch |
| } |
| |
| // Cloneable: |
| |
| /** |
| * Chains to super.clone() and removes CloneNotSupportedException |
| * from the method signature. |
| */ |
| public Object clone () |
| { |
| try |
| { |
| return super.clone (); |
| } |
| catch (CloneNotSupportedException e) |
| { |
| throw new InternalError (e.toString ()); |
| } |
| } |
| |
| // IClassFormatOutput: |
| |
| public void writeInClassFormat (final UDataOutputStream out) throws IOException |
| { |
| out.writeByte (tag ()); |
| } |
| |
| public static String tagToString (final CONSTANT_info constant) |
| { |
| switch (constant.tag ()) |
| { |
| case CONSTANT_Utf8_info.TAG: |
| return "CONSTANT_Utf8"; |
| |
| case CONSTANT_Integer_info.TAG: |
| return "CONSTANT_Integer"; |
| |
| case CONSTANT_Float_info.TAG: |
| return "CONSTANT_Float"; |
| |
| case CONSTANT_Long_info.TAG: |
| return "CONSTANT_Long"; |
| |
| case CONSTANT_Double_info.TAG: |
| return "CONSTANT_Double"; |
| |
| |
| case CONSTANT_Class_info.TAG: |
| return "CONSTANT_Class"; |
| |
| case CONSTANT_String_info.TAG: |
| return "CONSTANT_String"; |
| |
| |
| case CONSTANT_Fieldref_info.TAG: |
| return "CONSTANT_Fieldref"; |
| |
| case CONSTANT_Methodref_info.TAG: |
| return "CONSTANT_Methodref"; |
| |
| case CONSTANT_InterfaceMethodref_info.TAG: |
| return "CONSTANT_InterfaceMethodref"; |
| |
| |
| case CONSTANT_NameAndType_info.TAG: |
| return "CONSTANT_NameAndType"; |
| |
| default: throw new IllegalStateException ("CONSTANT_info: invalid tag value [" + constant.tag () + ']'); |
| |
| } // end of switch |
| } |
| |
| // protected: ............................................................. |
| |
| /* |
| protected static final byte CONSTANT_Utf8 = 1; |
| protected static final byte CONSTANT_Integer = 3; |
| protected static final byte CONSTANT_Float = 4; |
| protected static final byte CONSTANT_Long = 5; |
| protected static final byte CONSTANT_Double = 6; |
| protected static final byte CONSTANT_Class = 7; |
| protected static final byte CONSTANT_String = 8; |
| protected static final byte CONSTANT_Fieldref = 9; |
| protected static final byte CONSTANT_Methodref = 10; |
| protected static final byte CONSTANT_InterfaceMethodref = 11; |
| protected static final byte CONSTANT_NameAndType = 12; |
| */ |
| |
| protected CONSTANT_info () |
| { |
| } |
| |
| // package: ............................................................... |
| |
| // private: ............................................................... |
| |
| } // end of class |
| // ---------------------------------------------------------------------------- |