Package serp.bytecode.lowlevel
Class ConstantPool
- java.lang.Object
-
- serp.bytecode.lowlevel.ConstantPool
-
- All Implemented Interfaces:
VisitAcceptor
public class ConstantPool extends java.lang.Object implements VisitAcceptor
A bytecode constant pool, containing entries for all strings, constants, classes, etc referenced in the class structure and method opcodes. In keeping with the low-level bytecode representation, all pool indexes are 1-based andLongEntry
s andDoubleEntry
s each occupy two indexes in the pool.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
ConstantPool.ClassKey
Key for class entries.private static class
ConstantPool.DoublePtrKey
Base class key for entries with two ptr to other entries.private static class
ConstantPool.FieldKey
Key for field entries.private static class
ConstantPool.InterfaceMethodKey
Key for interface method entries.private static class
ConstantPool.InvokeDynamicKey
Key for method entries.private static class
ConstantPool.MethodKey
Key for method entries.private static class
ConstantPool.NameAndTypeKey
Key for name and type entries.private static class
ConstantPool.PtrKey
Base class key for entries with one ptr to another entry.private static class
ConstantPool.StringKey
Key for string entries.
-
Constructor Summary
Constructors Constructor Description ConstantPool()
Default constructor.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
acceptVisit(BCVisitor visit)
Accept a visit from aBCVisitor
, calling the appropriate methods to notify the visitor that it has entered this entity, and to provide it with the proper callbacks for each sub-entity owned by this one.private int
addEntry(java.lang.Object key, Entry entry)
Add an entry to the pool using the given key.int
addEntry(Entry entry)
Add an entry to the pool.void
clear()
Clear all entries from the pool.private int
find(java.lang.Object key)
Returns the constant pool index of the entry with the given key.int
findClassEntry(java.lang.String name, boolean add)
Return the constant pool index of theClassEntry
for the given class name, or 0 if it does not exist.private int
findComplexEntry(java.lang.String owner, java.lang.String name, java.lang.String desc, int type, boolean add)
Return the constant pool index of theComplexEntry
for the given name, descriptor, and owner class name.int
findDoubleEntry(double value, boolean add)
Return the constant pool index of theDoubleEntry
for the given value, or 0 if it does not exist.int
findFieldEntry(java.lang.String owner, java.lang.String name, java.lang.String desc, boolean add)
Return the constant pool index of theFieldEntry
for the given name, descriptor, and owner class name.int
findFloatEntry(float value, boolean add)
Return the constant pool index of theFloatEntry
for the given value, or 0 if it does not exist.int
findIntEntry(int value, boolean add)
Return the constant pool index of theIntEntry
for the given value, or 0 if it does not exist.int
findInterfaceMethodEntry(java.lang.String owner, java.lang.String name, java.lang.String desc, boolean add)
Return the constant pool index of theInterfaceMethodEntry
for the given name, descriptor, and owner class name.int
findInvokeDynamicEntry(int bootstrapMethodIndex, java.lang.String name, java.lang.String desc, boolean add)
int
findLongEntry(long value, boolean add)
Return the constant pool index of theLongEntry
for the given value, or 0 if it does not exist.int
findMethodEntry(java.lang.String owner, java.lang.String name, java.lang.String desc, boolean add)
Return the constant pool index of theMethodEntry
for the given name, descriptor, and owner class name.int
findNameAndTypeEntry(java.lang.String name, java.lang.String desc, boolean add)
Return the constant pool index of theNameAndTypeEntry
for the given name and descriptor, or 0 if it does not exist.int
findStringEntry(java.lang.String value, boolean add)
Return the constant pool index of theStringEntry
for the given string value, or 0 if it does not exist.int
findUTF8Entry(java.lang.String value, boolean add)
Return the index of theUTF8Entry
with the given value, or 0 if it does not exist.Entry[]
getEntries()
Return all the entries in the pool.Entry
getEntry(int index)
Retrieve the entry at the specified 1-based index.(package private) static java.lang.Object
getKey(Entry entry)
Return the hash key used for the specified entry.int
indexOf(Entry entry)
Return the index of the given entry, or 0 if it is not in the pool.(package private) void
modifyEntry(java.lang.Object origKey, Entry entry)
Called by constant pool entries when they are mutated.void
read(java.io.DataInput in)
Fill the constant pool from the given bytecode stream.boolean
removeEntry(Entry entry)
Remove the given entry from the pool.int
size()
Return the number of places occupied in the pool, including the fact that long and double entries occupy two places.void
write(java.io.DataOutput out)
Write the constant pool to the given bytecode stream.
-
-
-
Method Detail
-
getEntries
public Entry[] getEntries()
Return all the entries in the pool.
-
getEntry
public Entry getEntry(int index)
Retrieve the entry at the specified 1-based index.- Throws:
java.lang.IndexOutOfBoundsException
- if index is invalid, including the case that it points to the second slot of a long or double entry
-
indexOf
public int indexOf(Entry entry)
Return the index of the given entry, or 0 if it is not in the pool.
-
addEntry
public int addEntry(Entry entry)
Add an entry to the pool.- Returns:
- the index at which the entry was added
-
addEntry
private int addEntry(java.lang.Object key, Entry entry)
Add an entry to the pool using the given key.
-
removeEntry
public boolean removeEntry(Entry entry)
Remove the given entry from the pool.- Returns:
- false if the entry is not in the pool, true otherwise
-
clear
public void clear()
Clear all entries from the pool.
-
size
public int size()
Return the number of places occupied in the pool, including the fact that long and double entries occupy two places.
-
findUTF8Entry
public int findUTF8Entry(java.lang.String value, boolean add)
Return the index of theUTF8Entry
with the given value, or 0 if it does not exist.- Parameters:
add
- if true, the entry will be added if it does not already exist, and the new entry's index returned
-
findDoubleEntry
public int findDoubleEntry(double value, boolean add)
Return the constant pool index of theDoubleEntry
for the given value, or 0 if it does not exist.- Parameters:
value
- the value to findadd
- if true, the entry will be added if it does not already exist, and the new entry's index returned
-
findFloatEntry
public int findFloatEntry(float value, boolean add)
Return the constant pool index of theFloatEntry
for the given value, or 0 if it does not exist.- Parameters:
value
- the value to findadd
- if true, the entry will be added if it does not already exist, and the new entry's index returned
-
findIntEntry
public int findIntEntry(int value, boolean add)
Return the constant pool index of theIntEntry
for the given value, or 0 if it does not exist.- Parameters:
value
- the value to findadd
- if true, the entry will be added if it does not already exist, and the new entry's index returned
-
findLongEntry
public int findLongEntry(long value, boolean add)
Return the constant pool index of theLongEntry
for the given value, or 0 if it does not exist.- Parameters:
value
- the value to findadd
- if true, the entry will be added if it does not already exist, and the new entry's index returned
-
findStringEntry
public int findStringEntry(java.lang.String value, boolean add)
Return the constant pool index of theStringEntry
for the given string value, or 0 if it does not exist.- Parameters:
value
- the value to findadd
- if true, the entry will be added if it does not already exist, and the new entry's index returned
-
findClassEntry
public int findClassEntry(java.lang.String name, boolean add)
Return the constant pool index of theClassEntry
for the given class name, or 0 if it does not exist.- Parameters:
name
- the class name in internal formadd
- if true, the entry will be added if it does not already exist, and the new entry's index returned
-
findNameAndTypeEntry
public int findNameAndTypeEntry(java.lang.String name, java.lang.String desc, boolean add)
Return the constant pool index of theNameAndTypeEntry
for the given name and descriptor, or 0 if it does not exist.- Parameters:
name
- the name of the entitydesc
- the descriptor of the entity in internal formadd
- if true, the entry will be added if it does not already exist, and the new entry's index returned
-
findFieldEntry
public int findFieldEntry(java.lang.String owner, java.lang.String name, java.lang.String desc, boolean add)
Return the constant pool index of theFieldEntry
for the given name, descriptor, and owner class name.- Parameters:
owner
- the name of the field's owning class in internal formname
- the name of the fielddesc
- the descriptor of the field in internal formadd
- if true, the entry will be added if it does not already exist, and the new entry's index returned
-
findMethodEntry
public int findMethodEntry(java.lang.String owner, java.lang.String name, java.lang.String desc, boolean add)
Return the constant pool index of theMethodEntry
for the given name, descriptor, and owner class name.- Parameters:
owner
- the name of the method's owning class in internal formname
- the name of the methoddesc
- the descriptor of the method in internal formadd
- if true, the entry will be added if it does not already exist, and the new entry's index returned
-
findInterfaceMethodEntry
public int findInterfaceMethodEntry(java.lang.String owner, java.lang.String name, java.lang.String desc, boolean add)
Return the constant pool index of theInterfaceMethodEntry
for the given name, descriptor, and owner class name.- Parameters:
owner
- the name of the method's owning class in internal formname
- the name of the methoddesc
- the descriptor of the method in internal formadd
- if true, the entry will be added if it does not already exist, and the new entry's index returned
-
findInvokeDynamicEntry
public int findInvokeDynamicEntry(int bootstrapMethodIndex, java.lang.String name, java.lang.String desc, boolean add)
-
findComplexEntry
private int findComplexEntry(java.lang.String owner, java.lang.String name, java.lang.String desc, int type, boolean add)
Return the constant pool index of theComplexEntry
for the given name, descriptor, and owner class name.- Parameters:
owner
- the name of the owning class in internal formname
- the name of the entitydesc
- the descriptor of the entity in internal formtype
- the type of entry: field, method, interface methodadd
- if true, the entry will be added if it does not already exist, and the new entry's index returned
-
acceptVisit
public void acceptVisit(BCVisitor visit)
Description copied from interface:VisitAcceptor
Accept a visit from aBCVisitor
, calling the appropriate methods to notify the visitor that it has entered this entity, and to provide it with the proper callbacks for each sub-entity owned by this one.- Specified by:
acceptVisit
in interfaceVisitAcceptor
-
read
public void read(java.io.DataInput in) throws java.io.IOException
Fill the constant pool from the given bytecode stream.- Throws:
java.io.IOException
-
write
public void write(java.io.DataOutput out) throws java.io.IOException
Write the constant pool to the given bytecode stream.- Throws:
java.io.IOException
-
modifyEntry
void modifyEntry(java.lang.Object origKey, Entry entry)
Called by constant pool entries when they are mutated.
-
find
private int find(java.lang.Object key)
Returns the constant pool index of the entry with the given key.
-
getKey
static java.lang.Object getKey(Entry entry)
Return the hash key used for the specified entry.
-
-