Browse Source

Merge pull request #272 from richbolen/JASSIST-270

JASSIST-270:  Add support for the new Dynamic constant (17) created in java 11
tags/rel_3_26_0_ga
Shigeru Chiba 4 years ago
parent
commit
3dcbf5e391
No account linked to committer's email address
2 changed files with 177 additions and 49 deletions
  1. 1
    1
      pom.xml
  2. 176
    48
      src/main/javassist/bytecode/ConstPool.java

+ 1
- 1
pom.xml View File

Javassist (JAVA programming ASSISTant) makes Java bytecode manipulation Javassist (JAVA programming ASSISTant) makes Java bytecode manipulation
simple. It is a class library for editing bytecodes in Java. simple. It is a class library for editing bytecodes in Java.
</description> </description>
<version>3.25.0-GA</version>
<version>3.25.1-GA</version>
<name>Javassist</name> <name>Javassist</name>
<url>http://www.javassist.org/</url> <url>http://www.javassist.org/</url>



+ 176
- 48
src/main/javassist/bytecode/ConstPool.java View File

public static final int CONST_MethodType = MethodTypeInfo.tag; public static final int CONST_MethodType = MethodTypeInfo.tag;


/** /**
* <code>CONSTANT_MethodHandle</code>
* <code>CONSTANT_Dynamic</code>
*/
public static final int CONST_Dynamic = DynamicInfo.tag;

/**
* <code>CONSTANT_InvokeDynamic</code>
*/ */
public static final int CONST_InvokeDynamic = InvokeDynamicInfo.tag; public static final int CONST_InvokeDynamic = InvokeDynamicInfo.tag;


return mtinfo.descriptor; return mtinfo.descriptor;
} }


/**
* Reads the <code>bootstrap_method_attr_index</code> field of the
* <code>CONSTANT_InvokeDynamic_info</code> structure
* at the given index.
*
* @since 3.17
*/
public int getInvokeDynamicBootstrap(int index)
{
InvokeDynamicInfo iv = (InvokeDynamicInfo)getItem(index);
return iv.bootstrap;
}

/**
* Reads the <code>name_and_type_index</code> field of the
* <code>CONSTANT_InvokeDynamic_info</code> structure
* at the given index.
*
* @since 3.17
*/
public int getInvokeDynamicNameAndType(int index)
{
InvokeDynamicInfo iv = (InvokeDynamicInfo)getItem(index);
return iv.nameAndType;
}

/**
* Reads the <code>descriptor_index</code> field of the
* <code>CONSTANT_NameAndType_info</code> structure
* indirectly specified by the given index.
*
* @param index an index to a <code>CONSTANT_InvokeDynamic_info</code>.
* @return the descriptor of the method.
* @since 3.17
*/
public String getInvokeDynamicType(int index)
{
InvokeDynamicInfo iv = (InvokeDynamicInfo)getItem(index);
if (iv == null)
return null;
NameAndTypeInfo n = (NameAndTypeInfo)getItem(iv.nameAndType);
if(n == null)
return null;
return getUtf8Info(n.typeDescriptor);
}

/**
/**
* Reads the <code>bootstrap_method_attr_index</code> field of the
* <code>CONSTANT_InvokeDynamic_info</code> structure
* at the given index.
*
* @since 3.17
*/
public int getInvokeDynamicBootstrap(int index)
{
InvokeDynamicInfo iv = (InvokeDynamicInfo)getItem(index);
return iv.bootstrap;
}

/**
* Reads the <code>name_and_type_index</code> field of the
* <code>CONSTANT_InvokeDynamic_info</code> structure
* at the given index.
*
* @since 3.17
*/
public int getInvokeDynamicNameAndType(int index)
{
InvokeDynamicInfo iv = (InvokeDynamicInfo)getItem(index);
return iv.nameAndType;
}

/**
* Reads the <code>descriptor_index</code> field of the
* <code>CONSTANT_NameAndType_info</code> structure
* indirectly specified by the given index.
*
* @param index an index to a <code>CONSTANT_InvokeDynamic_info</code>.
* @return the descriptor of the method.
* @since 3.17
*/
public String getInvokeDynamicType(int index)
{
InvokeDynamicInfo iv = (InvokeDynamicInfo)getItem(index);
if (iv == null)
return null;
NameAndTypeInfo n = (NameAndTypeInfo)getItem(iv.nameAndType);
if(n == null)
return null;
return getUtf8Info(n.typeDescriptor);
}

/**
* Reads the <code>bootstrap_method_attr_index</code> field of the
* <code>CONSTANT_Dynamic_info</code> structure
* at the given index.
*
* @since 3.17
*/
public int getDynamicBootstrap(int index)
{
DynamicInfo iv = (DynamicInfo)getItem(index);
return iv.bootstrap;
}

/**
* Reads the <code>name_and_type_index</code> field of the
* <code>CONSTANT_Dynamic_info</code> structure
* at the given index.
*
* @since 3.17
*/
public int getDynamicNameAndType(int index)
{
DynamicInfo iv = (DynamicInfo)getItem(index);
return iv.nameAndType;
}

/**
* Reads the <code>descriptor_index</code> field of the
* <code>CONSTANT_NameAndType_info</code> structure
* indirectly specified by the given index.
*
* @param index an index to a <code>CONSTANT_Dynamic_info</code>.
* @return the descriptor of the method.
* @since 3.17
*/
public String getDynamicType(int index)
{
DynamicInfo iv = (DynamicInfo)getItem(index);
if (iv == null)
return null;
NameAndTypeInfo n = (NameAndTypeInfo)getItem(iv.nameAndType);
if(n == null)
return null;
return getUtf8Info(n.typeDescriptor);
}

/**
* Reads the <code>name_index</code> field of the * Reads the <code>name_index</code> field of the
* <code>CONSTANT_Module_info</code> structure at the given index. * <code>CONSTANT_Module_info</code> structure at the given index.
* *
} }


/** /**
* Adds a new <code>CONSTANT_Dynamic_info</code> structure.
*
* @param bootstrap <code>bootstrap_method_attr_index</code>.
* @param nameAndType <code>name_and_type_index</code>.
* @return the index of the added entry.
* @since 3.17
*/
public int addDynamicInfo(int bootstrap, int nameAndType) {
return addItem(new DynamicInfo(bootstrap, nameAndType, numOfItems));
}

/**
* Adds a new <code>CONSTANT_Module_info</code> * Adds a new <code>CONSTANT_Module_info</code>
* @param nameIndex the index of the Utf8 entry. * @param nameIndex the index of the Utf8 entry.
* @return the index of the added entry. * @return the index of the added entry.
case MethodTypeInfo.tag : // 16 case MethodTypeInfo.tag : // 16
info = new MethodTypeInfo(in, numOfItems); info = new MethodTypeInfo(in, numOfItems);
break; break;
case DynamicInfo.tag : // 17
info = new DynamicInfo(in, numOfItems);
break;
case InvokeDynamicInfo.tag : // 18 case InvokeDynamicInfo.tag : // 18
info = new InvokeDynamicInfo(in, numOfItems); info = new InvokeDynamicInfo(in, numOfItems);
break; break;
} }
} }


class DynamicInfo extends ConstInfo {

static final int tag = 17;
int bootstrap, nameAndType;

public DynamicInfo(int bootstrapMethod,
int ntIndex, int index) {
super(index);
bootstrap = bootstrapMethod;
nameAndType = ntIndex;
}

public DynamicInfo(DataInputStream in, int index)
throws IOException {
super(index);
bootstrap = in.readUnsignedShort();
nameAndType = in.readUnsignedShort();
}

@Override
public int hashCode() {
return (bootstrap << 16) ^ nameAndType;
}

@Override
public boolean equals(Object obj) {
if (obj instanceof DynamicInfo) {
DynamicInfo iv = (DynamicInfo) obj;
return iv.bootstrap == bootstrap
&& iv.nameAndType == nameAndType;
}
return false;
}

@Override
public int getTag() {
return tag;
}

@Override
public int copy(ConstPool src, ConstPool dest,
Map<String, String> map) {
return dest.addDynamicInfo(bootstrap,
src.getItem(nameAndType).copy(src, dest, map));
}

@Override
public void write(DataOutputStream out) throws IOException {
out.writeByte(tag);
out.writeShort(bootstrap);
out.writeShort(nameAndType);
}

@Override
public void print(PrintWriter out) {
out.print("Dynamic #");
out.print(bootstrap);
out.print(", name&type #");
out.println(nameAndType);
}
}

class ModuleInfo extends ConstInfo class ModuleInfo extends ConstInfo
{ {
static final int tag = 19; static final int tag = 19;

Loading…
Cancel
Save