Preliminary Java 9 Support

This commit is contained in:
md_5 2017-08-18 18:10:56 +10:00
parent 2de90be7b9
commit e9311dc423
5 changed files with 35 additions and 164 deletions

View File

@ -10,7 +10,7 @@
<groupId>net.md-5</groupId> <groupId>net.md-5</groupId>
<artifactId>SpecialSource</artifactId> <artifactId>SpecialSource</artifactId>
<version>1.7.5-SNAPSHOT</version> <version>1.8.0-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>SpecialSource</name> <name>SpecialSource</name>
@ -45,7 +45,7 @@
<dependency> <dependency>
<groupId>org.ow2.asm</groupId> <groupId>org.ow2.asm</groupId>
<artifactId>asm-debug-all</artifactId> <artifactId>asm-debug-all</artifactId>
<version>5.2</version> <version>6.0_BETA</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -121,7 +121,7 @@
</execution> </execution>
</executions> </executions>
<configuration> <configuration>
<minimizeJar>true</minimizeJar> <!--<minimizeJar>true</minimizeJar>-->
<shadedArtifactAttached>true</shadedArtifactAttached> <shadedArtifactAttached>true</shadedArtifactAttached>
</configuration> </configuration>
</plugin> </plugin>

View File

@ -71,7 +71,7 @@ public class JarComparer extends ClassVisitor {
} }
public JarComparer(Jar jar) { public JarComparer(Jar jar) {
super(Opcodes.ASM5); super(Opcodes.ASM6);
this.jar = jar; this.jar = jar;
this.jarRepo = new JarRepo(jar); this.jarRepo = new JarRepo(jar);
this.inheritance = new JarProvider(jar); this.inheritance = new JarProvider(jar);
@ -166,7 +166,7 @@ public class JarComparer extends ClassVisitor {
private class MethodReferenceFinder extends MethodVisitor { private class MethodReferenceFinder extends MethodVisitor {
public MethodReferenceFinder() { public MethodReferenceFinder() {
super(Opcodes.ASM5); super(Opcodes.ASM6);
} }
@Override @Override

View File

@ -60,54 +60,26 @@ package net.md_5.specialsource;
*/ */
import net.md_5.specialsource.repo.ClassRepo; import net.md_5.specialsource.repo.ClassRepo;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Attribute; import org.objectweb.asm.Attribute;
import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import net.md_5.specialsource.CustomRemapper;
import org.objectweb.asm.Label; import org.objectweb.asm.Label;
import org.objectweb.asm.commons.RemappingAnnotationAdapter; import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.commons.ClassRemapper;
import org.objectweb.asm.commons.FieldRemapper;
import org.objectweb.asm.commons.MethodRemapper;
/** public class RemappingClassAdapter extends ClassRemapper {
* A {@link ClassVisitor} for type remapping.
*
* @author Eugene Kuleshov
*/
public class RemappingClassAdapter extends ClassVisitor {
protected final CustomRemapper remapper; protected final CustomRemapper remapper;
protected ClassRepo repo; protected ClassRepo repo;
protected String className;
public RemappingClassAdapter(final ClassVisitor cv, final CustomRemapper remapper, ClassRepo repo) { public RemappingClassAdapter(final ClassVisitor cv, final CustomRemapper remapper, ClassRepo repo) {
this(Opcodes.ASM5, cv, remapper); super(cv, remapper);
this.repo = repo; this.repo = repo;
}
protected RemappingClassAdapter(final int api, final ClassVisitor cv, final CustomRemapper remapper) {
super(api, cv);
this.remapper = remapper; this.remapper = remapper;
} }
@Override
public void visit(int version, int access, String name, String signature,
String superName, String[] interfaces) {
this.className = name;
super.visit(version, access, remapper.mapType(name), remapper
.mapSignature(signature, false), remapper.mapType(superName),
interfaces == null ? null : remapper.mapTypes(interfaces));
}
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
AnnotationVisitor av;
av = super.visitAnnotation(remapper.mapDesc(desc), visible);
return av == null ? null : createRemappingAnnotationAdapter(av);
}
@Override @Override
public MethodVisitor visitMethod(int access, String name, String desc, public MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions) { String signature, String[] exceptions) {
@ -116,8 +88,7 @@ public class RemappingClassAdapter extends ClassVisitor {
className, name, desc, access), newDesc, remapper.mapSignature( className, name, desc, access), newDesc, remapper.mapSignature(
signature, false), signature, false),
exceptions == null ? null : remapper.mapTypes(exceptions)); exceptions == null ? null : remapper.mapTypes(exceptions));
return mv == null ? null : createRemappingMethodAdapter(access, return mv == null ? null : createMethodRemapper(mv);
newDesc, mv);
} }
@Override @Override
@ -127,7 +98,7 @@ public class RemappingClassAdapter extends ClassVisitor {
remapper.mapFieldName(className, name, desc, access), remapper.mapFieldName(className, name, desc, access),
remapper.mapDesc(desc), remapper.mapSignature(signature, true), remapper.mapDesc(desc), remapper.mapSignature(signature, true),
remapper.mapValue(value)); remapper.mapValue(value));
return fv == null ? null : createRemappingFieldAdapter(fv); return fv == null ? null : createFieldRemapper(fv);
} }
@Override @Override
@ -147,8 +118,9 @@ public class RemappingClassAdapter extends ClassVisitor {
desc == null ? null : remapper.mapMethodDesc(desc)); desc == null ? null : remapper.mapMethodDesc(desc));
} }
protected FieldVisitor createRemappingFieldAdapter(FieldVisitor sup) { @Override
return new FieldVisitor(Opcodes.ASM5, sup) { protected FieldVisitor createFieldRemapper(FieldVisitor fv) {
return new FieldRemapper(fv, remapper) {
@Override @Override
public void visitAttribute(Attribute attr) { public void visitAttribute(Attribute attr) {
if (SpecialSource.kill_lvt && attr.type.equals("LocalVariableTable")) { if (SpecialSource.kill_lvt && attr.type.equals("LocalVariableTable")) {
@ -157,16 +129,15 @@ public class RemappingClassAdapter extends ClassVisitor {
if (SpecialSource.kill_generics && attr.type.equals("LocalVariableTypeTable")) { if (SpecialSource.kill_generics && attr.type.equals("LocalVariableTypeTable")) {
return; return;
} }
if (fv != null) {
fv.visitAttribute(attr); super.visitAttribute(attr);
}
} }
}; };
} }
protected MethodVisitor createRemappingMethodAdapter(int access, String newDesc, MethodVisitor sup) { @Override
MethodVisitor remap = new UnsortedRemappingMethodAdapter(access, newDesc, sup, remapper, repo); protected MethodVisitor createMethodRemapper(MethodVisitor mv) {
return new MethodVisitor(Opcodes.ASM5, remap) { return new UnsortedRemappingMethodAdapter(mv, remapper, repo) {
@Override @Override
public void visitAttribute(Attribute attr) { public void visitAttribute(Attribute attr) {
if (SpecialSource.kill_lvt && attr.type.equals("LocalVariableTable")) { if (SpecialSource.kill_lvt && attr.type.equals("LocalVariableTable")) {
@ -175,9 +146,8 @@ public class RemappingClassAdapter extends ClassVisitor {
if (SpecialSource.kill_generics && attr.type.equals("LocalVariableTypeTable")) { if (SpecialSource.kill_generics && attr.type.equals("LocalVariableTypeTable")) {
return; return;
} }
if (mv != null) {
mv.visitAttribute(attr); super.visitAttribute(attr);
}
} }
@Override @Override
@ -189,15 +159,10 @@ public class RemappingClassAdapter extends ClassVisitor {
}; };
} }
protected AnnotationVisitor createRemappingAnnotationAdapter(
AnnotationVisitor av) {
return new RemappingAnnotationAdapter(av, remapper);
}
@Override @Override
public void visitSource(String source, String debug) { public void visitSource(String source, String debug) {
if (!SpecialSource.kill_source && cv != null) { if (!SpecialSource.kill_source) {
cv.visitSource(source, debug); super.visitSource(source, debug);
} }
} }
@ -206,8 +171,7 @@ public class RemappingClassAdapter extends ClassVisitor {
if (SpecialSource.kill_generics && attr.type.equals("Signature")) { if (SpecialSource.kill_generics && attr.type.equals("Signature")) {
return; return;
} }
if (cv != null) {
cv.visitAttribute(attr); super.visitAttribute(attr);
}
} }
} }

View File

@ -32,97 +32,33 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import net.md_5.specialsource.repo.ClassRepo; import net.md_5.specialsource.repo.ClassRepo;
import net.md_5.specialsource.repo.RuntimeRepo; import net.md_5.specialsource.repo.RuntimeRepo;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Handle; import org.objectweb.asm.Handle;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type; import org.objectweb.asm.Type;
import org.objectweb.asm.commons.RemappingAnnotationAdapter; import org.objectweb.asm.commons.MethodRemapper;
import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.FieldNode; import org.objectweb.asm.tree.FieldNode;
import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.MethodNode;
/** public class UnsortedRemappingMethodAdapter extends MethodRemapper {
* A {@link LocalVariablesSorter} for type mapping.
*
* @author Eugene Kuleshov
*
* Edited 04-24-2013 LexManos: Changed super class to MethodVisitor, using
* LocalVariablesSorter caused the LV indexes to be reassigned improperly.
* Causing decompiled code to not follow a predictable pattern and not coincide
* with RetroGuard's output.
*/
public class UnsortedRemappingMethodAdapter extends MethodVisitor { //Lex: Changed LocalVariablesSorter to MethodVisitor
private static final Collection<Handle> META_FACTORIES = Arrays.asList( private static final Collection<Handle> META_FACTORIES = Arrays.asList(
new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory",
"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"), "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;", false),
new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "altMetafactory", new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "altMetafactory",
"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;") "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;", false)
); );
protected final CustomRemapper remapper; protected final CustomRemapper remapper;
private final ClassRepo classRepo; private final ClassRepo classRepo;
public UnsortedRemappingMethodAdapter(final int access, final String desc, public UnsortedRemappingMethodAdapter(final MethodVisitor mv, final CustomRemapper remapper, ClassRepo classRepo) {
final MethodVisitor mv, final CustomRemapper remapper, ClassRepo classRepo) { super(mv, remapper);
this(Opcodes.ASM5, access, desc, mv, remapper, classRepo);
}
protected UnsortedRemappingMethodAdapter(final int api, final int access,
final String desc, final MethodVisitor mv, final CustomRemapper remapper, ClassRepo classRepo) {
super(api, mv); //Lex: Removed access, desc
this.remapper = remapper; this.remapper = remapper;
this.classRepo = classRepo; this.classRepo = classRepo;
} }
@Override
public AnnotationVisitor visitAnnotationDefault() {
AnnotationVisitor av = mv.visitAnnotationDefault();
return av == null ? av : new RemappingAnnotationAdapter(av, remapper);
}
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
AnnotationVisitor av = mv.visitAnnotation(remapper.mapDesc(desc),
visible);
return av == null ? av : new RemappingAnnotationAdapter(av, remapper);
}
@Override
public AnnotationVisitor visitParameterAnnotation(int parameter,
String desc, boolean visible) {
AnnotationVisitor av = mv.visitParameterAnnotation(parameter,
remapper.mapDesc(desc), visible);
return av == null ? av : new RemappingAnnotationAdapter(av, remapper);
}
@Override
public void visitFrame(int type, int nLocal, Object[] local, int nStack,
Object[] stack) {
super.visitFrame(type, nLocal, remapEntries(nLocal, local), nStack,
remapEntries(nStack, stack));
}
private Object[] remapEntries(int n, Object[] entries) {
for (int i = 0; i < n; i++) {
if (entries[i] instanceof String) {
Object[] newEntries = new Object[n];
if (i > 0) {
System.arraycopy(entries, 0, newEntries, 0, i);
}
do {
Object t = entries[i];
newEntries[i++] = t instanceof String ? remapper
.mapType((String) t) : t;
} while (i < n);
return newEntries;
}
}
return entries;
}
@Override @Override
public void visitFieldInsn(int opcode, String owner, String name, public void visitFieldInsn(int opcode, String owner, String name,
String desc) { String desc) {
@ -200,33 +136,4 @@ public class UnsortedRemappingMethodAdapter extends MethodVisitor { //Lex: Chang
remapper.mapMethodDesc(desc), (Handle) remapper.mapValue(bsm), remapper.mapMethodDesc(desc), (Handle) remapper.mapValue(bsm),
bsmArgs); bsmArgs);
} }
@Override
public void visitTypeInsn(int opcode, String type) {
super.visitTypeInsn(opcode, remapper.mapType(type));
}
@Override
public void visitLdcInsn(Object cst) {
super.visitLdcInsn(remapper.mapValue(cst));
}
@Override
public void visitMultiANewArrayInsn(String desc, int dims) {
super.visitMultiANewArrayInsn(remapper.mapDesc(desc), dims);
}
@Override
public void visitTryCatchBlock(Label start, Label end, Label handler,
String type) {
super.visitTryCatchBlock(start, end, handler, type == null ? null
: remapper.mapType(type));
}
@Override
public void visitLocalVariable(String name, String desc, String signature,
Label start, Label end, int index) {
super.visitLocalVariable(name, remapper.mapDesc(desc),
remapper.mapSignature(signature, true), start, end, index);
}
} }

View File

@ -47,7 +47,7 @@ public class FileLocator {
} }
// Create our own cache file here, replacing potentially invalid characters // Create our own cache file here, replacing potentially invalid characters
String id = CharMatcher.JAVA_LETTER_OR_DIGIT.or(CharMatcher.anyOf("-_.")).negate().replaceFrom(url.toString(), '_'); String id = CharMatcher.javaLetterOrDigit().or(CharMatcher.anyOf("-_.")).negate().replaceFrom(url.toString(), '_');
File file = new File(tempDir, id); File file = new File(tempDir, id);
// Check cache for a hit // Check cache for a hit