aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShigeru Chiba <chibash@users.noreply.github.com>2018-09-02 19:36:51 +0900
committerGitHub <noreply@github.com>2018-09-02 19:36:51 +0900
commit808dfb862f2967534e9250060b895eb0c8762cb9 (patch)
tree950a39e850cc46fbbd3a193cbf3e38c746eeea13
parenta13f51b8d12510152bffe1fc7bd1f4a1ca16fefb (diff)
parent797f6511059f8c93d3ea876c0f4c4ed13e9f846b (diff)
downloadjavassist-808dfb862f2967534e9250060b895eb0c8762cb9.tar.gz
javassist-808dfb862f2967534e9250060b895eb0c8762cb9.zip
Merge pull request #218 from dmitri-gb/master
Add support for Java 11 NestHost and NestMembers attributes (JEP-181)
-rw-r--r--src/main/javassist/bytecode/AttributeInfo.java4
-rw-r--r--src/main/javassist/bytecode/NestHostAttribute.java39
-rw-r--r--src/main/javassist/bytecode/NestMembersAttribute.java49
3 files changed, 92 insertions, 0 deletions
diff --git a/src/main/javassist/bytecode/AttributeInfo.java b/src/main/javassist/bytecode/AttributeInfo.java
index 4bfd0dbb..be6e2a21 100644
--- a/src/main/javassist/bytecode/AttributeInfo.java
+++ b/src/main/javassist/bytecode/AttributeInfo.java
@@ -108,6 +108,10 @@ public class AttributeInfo {
/* 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
diff --git a/src/main/javassist/bytecode/NestHostAttribute.java b/src/main/javassist/bytecode/NestHostAttribute.java
new file mode 100644
index 00000000..ae9f1e5d
--- /dev/null
+++ b/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);
+ }
+}
diff --git a/src/main/javassist/bytecode/NestMembersAttribute.java b/src/main/javassist/bytecode/NestMembersAttribute.java
new file mode 100644
index 00000000..679dc28c
--- /dev/null
+++ b/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);
+ }
+}