blob: c078847aac10c9b93480f2b9e4647a065ae41732 [file] [log] [blame]
/* 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
// ----------------------------------------------------------------------------