Skip to content

Updates Tamiflex to work with the modern JDK and ASM. #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions Normalizer/src/de/bodden/tamiflex/normalizer/ClassRenamer.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public NoHashedNameException(String typeName) {
* @return The bytecode containing the renamed references.
*/
public static byte[] replaceClassNamesInBytes(final Map<String, String> fromTo, byte[] classBytes) {
ClassReader creader = new ClassReader(classBytes);
final ClassReader creader = new ClassReader(classBytes);
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
RemappingClassAdapter visitor = new RemappingClassAdapter(writer,new Remapper(){
//rename a type reference
Expand All @@ -65,8 +65,8 @@ public String map(String typeName) {
}) {
//visit the body of the method
@Override
public MethodVisitor visitMethod(int access, String name,
String desc, String signature, String[] exceptions) {
public MethodVisitor visitMethod(int access, final String name,
final String desc, String signature, String[] exceptions) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
mv = new RemappingStringConstantAdapter(mv, new StringRemapper() {
//rename any string constants
Expand All @@ -75,7 +75,7 @@ public String remapStringConstant(String constant) {
//string constants will refer to the type using a dotted name; replace dots by slashes...
String slashed = slashed(constant);
String to = fromTo.get(slashed);
if(Hasher.containsGeneratedClassName(slashed) && to==null) {
if(Hasher.containsGeneratedClassName(slashed) && to==null && !Hasher.isWhiteListConstant(creader.getClassName(), name, desc, slashed)) {
throw new NoHashedNameException(slashed);
}
if(to!=null) constant = dotted(to);
Expand All @@ -85,7 +85,7 @@ public String remapStringConstant(String constant) {
return mv;
}
};
creader.accept(visitor, 0);
creader.accept(visitor, ClassReader.EXPAND_FRAMES);
return writer.toByteArray();
}
}
19 changes: 12 additions & 7 deletions Normalizer/src/de/bodden/tamiflex/normalizer/Hasher.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ public class Hasher {
"GeneratedSerializationConstructorAccessor",
"ByCGLIB",
"org/apache/derby/exe/",
"$Proxy" /*,
"_pyx",
"$Proxy" /*
"schemaorg_apache_xmlbeans/system/" these names seem to be stable, as they are already hashed */
};

Expand Down Expand Up @@ -77,17 +78,17 @@ public void visitSource(String source, String debug) {
}

@Override
public MethodVisitor visitMethod(int access, String name,
String desc, String signature, String[] exceptions) {
public MethodVisitor visitMethod(int access, final String name,
final String desc, String signature, String[] exceptions) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
mv = new RemappingStringConstantAdapter(mv, new StringRemapper() {
@Override
public String remapStringConstant(String constant) {
String slashed = slashed(constant);
if(theClassName.equals(slashed)) return "$$$NORMALIZED$$$";
String to = generatedClassNameToHashedClassName.get(slashed);
if(!theClassName.equals(slashed) && Hasher.containsGeneratedClassName(slashed) && to==null) {
throw new NoHashedNameException(slashed);
if(!theClassName.equals(slashed) && Hasher.containsGeneratedClassName(slashed) && to==null && !isWhiteListConstant(theClassName, name, desc, slashed)) {
throw new NoHashedNameException("While visiting method: " + theClassName + "." + name + desc +": " + slashed);
}
if(to!=null) constant = dotted(to);
return super.remapStringConstant(constant);
Expand All @@ -96,7 +97,7 @@ public String remapStringConstant(String constant) {
return mv;
}
};
creader.accept(visitor, 0);
creader.accept(visitor, ClassReader.EXPAND_FRAMES);
byte[] renamed = writer.toByteArray();
////////
String hash = SHAHash.SHA1(renamed);
Expand Down Expand Up @@ -134,7 +135,11 @@ public static String hashedClassNameForGeneratedClassName(String className) {
public static byte[] replaceGeneratedClassNamesByHashedNames(byte[] classBytes) {
return ClassRenamer.replaceClassNamesInBytes(generatedClassNameToHashedClassName,classBytes);
}


public static boolean isWhiteListConstant(String theClassName, String name, String desc, String slashed) {
return (slashed.equals("$Proxy") && theClassName.equals("java/lang/reflect/Proxy$ProxyClassFactory") && name.equals("apply"));
}


public static String dotted(String className) {
return className.replace('/', '.');
Expand Down