Skip to content

Commit

Permalink
Merge pull request #218 from dmitri-gb/master
Browse files Browse the repository at this point in the history
Add support for Java 11 NestHost and NestMembers attributes (JEP-181)
  • Loading branch information
chibash committed Sep 2, 2018
2 parents a13f51b + 797f651 commit 808dfb8
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/main/javassist/bytecode/AttributeInfo.java
Expand Up @@ -108,6 +108,10 @@ else if (nameStr.equals(LocalVariableTypeAttribute.tag))
/* Note that the names of Annotations attributes begin with 'R'. */
if (nameStr.equals(MethodParametersAttribute.tag))
return new MethodParametersAttribute(cp, name, in);
else if (nameStr.equals(NestHostAttribute.tag))
return new NestHostAttribute(cp, name, in);
else if (nameStr.equals(NestMembersAttribute.tag))
return new NestMembersAttribute(cp, name, in);
else if (nameStr.equals(AnnotationsAttribute.visibleTag)
|| nameStr.equals(AnnotationsAttribute.invisibleTag))
// RuntimeVisibleAnnotations or RuntimeInvisibleAnnotations
Expand Down
39 changes: 39 additions & 0 deletions src/main/javassist/bytecode/NestHostAttribute.java
@@ -0,0 +1,39 @@
package javassist.bytecode;

import java.io.DataInputStream;
import java.io.IOException;
import java.util.Map;

/**
* <code>NestHost_attribute</code>.
*/
public class NestHostAttribute extends AttributeInfo {
/**
* The name of this attribute <code>"NestHost"</code>.
*/
public static final String tag = "NestHost";

NestHostAttribute(ConstPool cp, int n, DataInputStream in) throws IOException {
super(cp, n, in);
}

private NestHostAttribute(ConstPool cp, int hostIndex) {
super(cp, tag, new byte[2]);
ByteArray.write16bit(hostIndex, get(), 0);
}

/**
* Makes a copy. Class names are replaced according to the
* given <code>Map</code> object.
*
* @param newCp the constant pool table used by the new copy.
* @param classnames pairs of replaced and substituted
* class names.
*/
@Override
public AttributeInfo copy(ConstPool newCp, Map<String, String> classnames) {
int hostIndex = ByteArray.readU16bit(get(), 0);
int newHostIndex = getConstPool().copy(hostIndex, newCp, classnames);
return new NestHostAttribute(newCp, newHostIndex);
}
}
49 changes: 49 additions & 0 deletions src/main/javassist/bytecode/NestMembersAttribute.java
@@ -0,0 +1,49 @@
package javassist.bytecode;

import java.io.DataInputStream;
import java.io.IOException;
import java.util.Map;

/**
* <code>NestMembers_attribute</code>.
*/
public class NestMembersAttribute extends AttributeInfo {
/**
* The name of this attribute <code>"NestMembers"</code>.
*/
public static final String tag = "NestMembers";

NestMembersAttribute(ConstPool cp, int n, DataInputStream in) throws IOException {
super(cp, n, in);
}

private NestMembersAttribute(ConstPool cp, byte[] info) {
super(cp, tag, info);
}

/**
* Makes a copy. Class names are replaced according to the
* given <code>Map</code> object.
*
* @param newCp the constant pool table used by the new copy.
* @param classnames pairs of replaced and substituted
* class names.
*/
@Override
public AttributeInfo copy(ConstPool newCp, Map<String, String> classnames) {
byte[] src = get();
byte[] dest = new byte[src.length];
ConstPool cp = getConstPool();

int n = ByteArray.readU16bit(src, 0);
ByteArray.write16bit(n, dest, 0);

for (int i = 0, j = 2; i < n; ++i, j += 2) {
int index = ByteArray.readU16bit(src, j);
int newIndex = cp.copy(index, newCp, classnames);
ByteArray.write16bit(newIndex, dest, j);
}

return new NestMembersAttribute(newCp, dest);
}
}

0 comments on commit 808dfb8

Please sign in to comment.