]> source.dussan.org Git - javassist.git/commitdiff
Add support for Java 11 NestHost and NestMembers attributes 218/head
authorDmitri Gabbasov <dmitri666@gmail.com>
Thu, 23 Aug 2018 13:16:44 +0000 (16:16 +0300)
committerDmitri Gabbasov <dmitri666@gmail.com>
Thu, 23 Aug 2018 17:22:12 +0000 (20:22 +0300)
src/main/javassist/bytecode/AttributeInfo.java
src/main/javassist/bytecode/NestHostAttribute.java [new file with mode: 0644]
src/main/javassist/bytecode/NestMembersAttribute.java [new file with mode: 0644]

index 4bfd0dbb7e175976c72f49cc473131441c2b64ee..be6e2a216d94c671b5eb01a24e6c5d96f0bb4f9f 100644 (file)
@@ -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 (file)
index 0000000..ae9f1e5
--- /dev/null
@@ -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 (file)
index 0000000..679dc28
--- /dev/null
@@ -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);
+    }
+}