diff --git a/Normalizer/src/de/bodden/tamiflex/normalizer/ClassRenamer.java b/Normalizer/src/de/bodden/tamiflex/normalizer/ClassRenamer.java index 17830b1..ef39b59 100644 --- a/Normalizer/src/de/bodden/tamiflex/normalizer/ClassRenamer.java +++ b/Normalizer/src/de/bodden/tamiflex/normalizer/ClassRenamer.java @@ -49,7 +49,7 @@ public NoHashedNameException(String typeName) { * @return The bytecode containing the renamed references. */ public static byte[] replaceClassNamesInBytes(final Map 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 @@ -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 @@ -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); @@ -85,7 +85,7 @@ public String remapStringConstant(String constant) { return mv; } }; - creader.accept(visitor, 0); + creader.accept(visitor, ClassReader.EXPAND_FRAMES); return writer.toByteArray(); } } diff --git a/Normalizer/src/de/bodden/tamiflex/normalizer/Hasher.java b/Normalizer/src/de/bodden/tamiflex/normalizer/Hasher.java index 16eed49..d961568 100644 --- a/Normalizer/src/de/bodden/tamiflex/normalizer/Hasher.java +++ b/Normalizer/src/de/bodden/tamiflex/normalizer/Hasher.java @@ -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 */ }; @@ -77,8 +78,8 @@ 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 @@ -86,8 +87,8 @@ 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); @@ -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); @@ -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('/', '.');