< prev index next >
src/java.base/share/classes/jdk/internal/org/objectweb/asm/util/ASMifier.java
Print this page
rev 47452 : imported patch jdk-new-asmv6.patch
@@ -108,19 +108,24 @@
* Pseudo access flag used to distinguish inner class flags.
*/
private static final int ACCESS_INNER = 1048576;
/**
+ * Pseudo access flag used to distinguish module requires/exports flags.
+ */
+ private static final int ACCESS_MODULE = 2097152;
+
+ /**
* Constructs a new {@link ASMifier}. <i>Subclasses must not use this
* constructor</i>. Instead, they must use the
* {@link #ASMifier(int, String, int)} version.
*
* @throws IllegalStateException
* If a subclass calls this constructor.
*/
public ASMifier() {
- this(Opcodes.ASM5, "cw", 0);
+ this(Opcodes.ASM6, "cw", 0);
if (getClass() != ASMifier.class) {
throw new IllegalStateException();
}
}
@@ -127,11 +132,11 @@
/**
* Constructs a new {@link ASMifier}.
*
* @param api
* the ASM API version implemented by this class. Must be one of
- * {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
+ * {@link Opcodes#ASM4}, {@link Opcodes#ASM5} or {@link Opcodes#ASM6}.
* @param name
* the name of the visitor variable in the produced code.
* @param id
* identifier of the annotation visitor variable in the produced
* code.
@@ -194,18 +199,22 @@
@Override
public void visit(final int version, final int access, final String name,
final String signature, final String superName,
final String[] interfaces) {
String simpleName;
+ if (name == null) {
+ simpleName = "module-info";
+ } else {
int n = name.lastIndexOf('/');
if (n == -1) {
simpleName = name;
} else {
text.add("package asm." + name.substring(0, n).replace('/', '.')
+ ";\n");
- simpleName = name.substring(n + 1);
+ simpleName = name.substring(n + 1).replace('-', '_');
}
+ }
text.add("import java.util.*;\n");
text.add("import jdk.internal.org.objectweb.asm.*;\n");
text.add("public class " + simpleName + "Dump implements Opcodes {\n\n");
text.add("public static byte[] dump () throws Exception {\n\n");
text.add("ClassWriter cw = new ClassWriter(0);\n");
@@ -235,10 +244,16 @@
buf.append("V1_6");
break;
case Opcodes.V1_7:
buf.append("V1_7");
break;
+ case Opcodes.V1_8:
+ buf.append("V1_8");
+ break;
+ case Opcodes.V9:
+ buf.append("V9");
+ break;
default:
buf.append(version);
break;
}
buf.append(", ");
@@ -274,10 +289,28 @@
buf.append(");\n\n");
text.add(buf.toString());
}
@Override
+ public Printer visitModule(final String name, final int flags,
+ final String version) {
+ buf.setLength(0);
+ buf.append("ModuleVisitor mdv = cw.visitModule(");
+ appendConstant(name);
+ buf.append(", ");
+ appendAccess(flags | ACCESS_MODULE);
+ buf.append(", ");
+ appendConstant(version);
+ buf.append(");\n\n");
+ text.add(buf.toString());
+ ASMifier a = createASMifier("mdv", 0);
+ text.add(a.getText());
+ text.add("}\n");
+ return a;
+ }
+
+ @Override
public void visitOuterClass(final String owner, final String name,
final String desc) {
buf.setLength(0);
buf.append("cw.visitOuterClass(");
appendConstant(owner);
@@ -384,10 +417,112 @@
text.add("}\n");
text.add("}\n");
}
// ------------------------------------------------------------------------
+ // Module
+ // ------------------------------------------------------------------------
+
+ @Override
+ public void visitMainClass(String mainClass) {
+ buf.setLength(0);
+ buf.append("mdv.visitMainClass(");
+ appendConstant(buf, mainClass);
+ buf.append(");\n");
+ text.add(buf.toString());
+ }
+
+ @Override
+ public void visitPackage(String packaze) {
+ buf.setLength(0);
+ buf.append("mdv.visitPackage(");
+ appendConstant(buf, packaze);
+ buf.append(");\n");
+ text.add(buf.toString());
+ }
+
+ @Override
+ public void visitRequire(String module, int access, String version) {
+ buf.setLength(0);
+ buf.append("mdv.visitRequire(");
+ appendConstant(buf, module);
+ buf.append(", ");
+ appendAccess(access | ACCESS_MODULE);
+ buf.append(", ");
+ appendConstant(buf, version);
+ buf.append(");\n");
+ text.add(buf.toString());
+ }
+
+ @Override
+ public void visitExport(String packaze, int access, String... modules) {
+ buf.setLength(0);
+ buf.append("mdv.visitExport(");
+ appendConstant(buf, packaze);
+ buf.append(", ");
+ appendAccess(access | ACCESS_MODULE);
+ if (modules != null && modules.length > 0) {
+ buf.append(", new String[] {");
+ for (int i = 0; i < modules.length; ++i) {
+ buf.append(i == 0 ? " " : ", ");
+ appendConstant(modules[i]);
+ }
+ buf.append(" }");
+ }
+ buf.append(");\n");
+ text.add(buf.toString());
+ }
+
+ @Override
+ public void visitOpen(String packaze, int access, String... modules) {
+ buf.setLength(0);
+ buf.append("mdv.visitOpen(");
+ appendConstant(buf, packaze);
+ buf.append(", ");
+ appendAccess(access | ACCESS_MODULE);
+ if (modules != null && modules.length > 0) {
+ buf.append(", new String[] {");
+ for (int i = 0; i < modules.length; ++i) {
+ buf.append(i == 0 ? " " : ", ");
+ appendConstant(modules[i]);
+ }
+ buf.append(" }");
+ }
+ buf.append(");\n");
+ text.add(buf.toString());
+ }
+
+ @Override
+ public void visitUse(String service) {
+ buf.setLength(0);
+ buf.append("mdv.visitUse(");
+ appendConstant(buf, service);
+ buf.append(");\n");
+ text.add(buf.toString());
+ }
+
+ @Override
+ public void visitProvide(String service, String... providers) {
+ buf.setLength(0);
+ buf.append("mdv.visitProvide(");
+ appendConstant(buf, service);
+ buf.append(", new String[] {");
+ for (int i = 0; i < providers.length; ++i) {
+ buf.append(i == 0 ? " " : ", ");
+ appendConstant(providers[i]);
+ }
+ buf.append(" });\n");
+ text.add(buf.toString());
+ }
+
+ @Override
+ public void visitModuleEnd() {
+ text.add("mdv.visitEnd();\n");
+ }
+
+
+ // ------------------------------------------------------------------------
// Annotations
// ------------------------------------------------------------------------
@Override
public void visit(final String name, final Object value) {
@@ -970,11 +1105,11 @@
// ------------------------------------------------------------------------
// Utility methods
// ------------------------------------------------------------------------
protected ASMifier createASMifier(final String name, final int id) {
- return new ASMifier(Opcodes.ASM5, name, id);
+ return new ASMifier(Opcodes.ASM6, name, id);
}
/**
* Appends a string representation of the given access modifiers to
* {@link #buf buf}.
@@ -998,45 +1133,53 @@
}
if ((access & Opcodes.ACC_FINAL) != 0) {
if (!first) {
buf.append(" + ");
}
+ if ((access & ACCESS_MODULE) == 0) {
buf.append("ACC_FINAL");
+ } else {
+ buf.append("ACC_TRANSITIVE");
+ }
first = false;
}
if ((access & Opcodes.ACC_STATIC) != 0) {
if (!first) {
buf.append(" + ");
}
buf.append("ACC_STATIC");
first = false;
}
- if ((access & Opcodes.ACC_SYNCHRONIZED) != 0) {
+ if ((access & (Opcodes.ACC_SYNCHRONIZED | Opcodes.ACC_SUPER | Opcodes.ACC_TRANSITIVE)) != 0) {
if (!first) {
buf.append(" + ");
}
if ((access & ACCESS_CLASS) == 0) {
+ if ((access & ACCESS_MODULE) == 0) {
buf.append("ACC_SYNCHRONIZED");
} else {
+ buf.append("ACC_TRANSITIVE");
+ }
+ } else {
buf.append("ACC_SUPER");
}
first = false;
}
- if ((access & Opcodes.ACC_VOLATILE) != 0
- && (access & ACCESS_FIELD) != 0) {
+ if ((access & (Opcodes.ACC_VOLATILE | Opcodes.ACC_BRIDGE | Opcodes.ACC_STATIC_PHASE)) != 0) {
if (!first) {
buf.append(" + ");
}
+ if ((access & ACCESS_FIELD) == 0) {
+ if ((access & ACCESS_MODULE) == 0) {
+ buf.append("ACC_BRIDGE");
+ } else {
+ buf.append("ACC_STATIC_PHASE");
+ }
+ } else {
buf.append("ACC_VOLATILE");
- first = false;
}
- if ((access & Opcodes.ACC_BRIDGE) != 0 && (access & ACCESS_CLASS) == 0
- && (access & ACCESS_FIELD) == 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_BRIDGE");
+
first = false;
}
if ((access & Opcodes.ACC_VARARGS) != 0 && (access & ACCESS_CLASS) == 0
&& (access & ACCESS_FIELD) == 0) {
if (!first) {
@@ -1111,15 +1254,19 @@
buf.append(" + ");
}
buf.append("ACC_DEPRECATED");
first = false;
}
- if ((access & Opcodes.ACC_MANDATED) != 0) {
+ if ((access & (Opcodes.ACC_MANDATED | Opcodes.ACC_MODULE)) != 0) {
if (!first) {
buf.append(" + ");
}
+ if ((access & ACCESS_CLASS) == 0) {
buf.append("ACC_MANDATED");
+ } else {
+ buf.append("ACC_MODULE");
+ }
first = false;
}
if (first) {
buf.append('0');
}
@@ -1161,11 +1308,12 @@
Handle h = (Handle) cst;
buf.append("Opcodes.").append(HANDLE_TAG[h.getTag()])
.append(", \"");
buf.append(h.getOwner()).append("\", \"");
buf.append(h.getName()).append("\", \"");
- buf.append(h.getDesc()).append("\")");
+ buf.append(h.getDesc()).append("\", ");
+ buf.append(h.isInterface()).append(")");
} else if (cst instanceof Byte) {
buf.append("new Byte((byte)").append(cst).append(')');
} else if (cst instanceof Boolean) {
buf.append(((Boolean) cst).booleanValue() ? "Boolean.TRUE"
: "Boolean.FALSE");
< prev index next >