From 34c1e8e64ec4575527a19fb4cb0640c57da784db Mon Sep 17 00:00:00 2001 From: jeff Date: Mon, 18 Aug 2014 00:55:30 -0400 Subject: crap-ton of bug fixes for inner classes --- src/cuchaz/enigma/bytecode/ClassTranslator.java | 53 ++++++++++++++++++------- 1 file changed, 39 insertions(+), 14 deletions(-) (limited to 'src/cuchaz/enigma/bytecode/ClassTranslator.java') diff --git a/src/cuchaz/enigma/bytecode/ClassTranslator.java b/src/cuchaz/enigma/bytecode/ClassTranslator.java index 3b5beeb..9ce06a5 100644 --- a/src/cuchaz/enigma/bytecode/ClassTranslator.java +++ b/src/cuchaz/enigma/bytecode/ClassTranslator.java @@ -10,7 +10,6 @@ ******************************************************************************/ package cuchaz.enigma.bytecode; -import java.util.HashSet; import java.util.Set; import javassist.ClassMap; @@ -20,6 +19,10 @@ import javassist.CtField; import javassist.CtMethod; import javassist.bytecode.ConstPool; import javassist.bytecode.Descriptor; +import javassist.bytecode.InnerClassesAttribute; + +import com.beust.jcommander.internal.Sets; + import cuchaz.enigma.mapping.ClassEntry; import cuchaz.enigma.mapping.FieldEntry; import cuchaz.enigma.mapping.MethodEntry; @@ -133,25 +136,47 @@ public class ClassTranslator // translate all the class names referenced in the code // the above code only changed method/field/reference names and types, but not the class names themselves - Set classNames = getAllClassNames( c ); + Set classEntries = getAllClassEntries( c ); ClassMap map = new ClassMap(); - for( String className : classNames ) + for( ClassEntry obfClassEntry : classEntries ) { - String translatedName = m_translator.translateClass( className ); - if( translatedName != null ) - { - map.put( className, translatedName ); - } + map.put( obfClassEntry.getName(), m_translator.translateEntry( obfClassEntry ).getName() ); } - if( !map.isEmpty() ) + c.replaceClassName( map ); + + // translate the names in the InnerClasses attribute + InnerClassesAttribute attr = (InnerClassesAttribute)c.getClassFile().getAttribute( InnerClassesAttribute.tag ); + if( attr != null ) { - c.replaceClassName( map ); + for( int i=0; i ATTR: %s,%s,%s", + obfClassEntry, deobfClassEntry, + attr.outerClass( i ), + attr.innerClass( i ), + attr.innerName( i ) + ) ); + */ + } } } - private Set getAllClassNames( CtClass c ) + private Set getAllClassEntries( CtClass c ) { - final Set names = new HashSet(); + final Set entries = Sets.newHashSet(); ClassMap map = new ClassMap( ) { @Override @@ -159,13 +184,13 @@ public class ClassTranslator { if( obj instanceof String ) { - names.add( (String)obj ); + entries.add( new ClassEntry( (String)obj ) ); } return null; } private static final long serialVersionUID = -202160293602070641L; }; c.replaceClassName( map ); - return names; + return entries; } } -- cgit v1.2.3