From 448685653e90415ebe10b08e8335462b81c30421 Mon Sep 17 00:00:00 2001 From: jeff Date: Mon, 2 Feb 2015 21:26:10 -0500 Subject: fix issue with bridge methods --- test/cuchaz/enigma/TestDeobfuscator.java | 4 ++-- test/cuchaz/enigma/TestInnerClasses.java | 23 +++++++++++++++++++++- test/cuchaz/enigma/TestSourceIndex.java | 4 ++-- test/cuchaz/enigma/TestTokensConstructors.java | 18 +++++++---------- test/cuchaz/enigma/TokenChecker.java | 4 ++-- .../enigma/inputs/innerClasses/A_Anonymous.java | 14 +++++++++++++ .../enigma/inputs/innerClasses/Anonymous.java | 14 ------------- .../innerClasses/AnonymousWithScopeArgs.java | 13 ------------ .../innerClasses/B_AnonymousWithScopeArgs.java | 13 ++++++++++++ .../inputs/innerClasses/C_ConstructorArgs.java | 20 +++++++++++++++++++ .../inputs/innerClasses/ConstructorArgs.java | 20 ------------------- .../enigma/inputs/innerClasses/D_Simple.java | 8 ++++++++ .../innerClasses/E_AnonymousWithOuterAccess.java | 21 ++++++++++++++++++++ test/cuchaz/enigma/inputs/innerClasses/Simple.java | 8 -------- 14 files changed, 111 insertions(+), 73 deletions(-) create mode 100644 test/cuchaz/enigma/inputs/innerClasses/A_Anonymous.java delete mode 100644 test/cuchaz/enigma/inputs/innerClasses/Anonymous.java delete mode 100644 test/cuchaz/enigma/inputs/innerClasses/AnonymousWithScopeArgs.java create mode 100644 test/cuchaz/enigma/inputs/innerClasses/B_AnonymousWithScopeArgs.java create mode 100644 test/cuchaz/enigma/inputs/innerClasses/C_ConstructorArgs.java delete mode 100644 test/cuchaz/enigma/inputs/innerClasses/ConstructorArgs.java create mode 100644 test/cuchaz/enigma/inputs/innerClasses/D_Simple.java create mode 100644 test/cuchaz/enigma/inputs/innerClasses/E_AnonymousWithOuterAccess.java delete mode 100644 test/cuchaz/enigma/inputs/innerClasses/Simple.java (limited to 'test') diff --git a/test/cuchaz/enigma/TestDeobfuscator.java b/test/cuchaz/enigma/TestDeobfuscator.java index 6ac4c786..129d7b25 100644 --- a/test/cuchaz/enigma/TestDeobfuscator.java +++ b/test/cuchaz/enigma/TestDeobfuscator.java @@ -13,9 +13,9 @@ package cuchaz.enigma; import static org.junit.Assert.*; -import java.io.File; import java.io.IOException; import java.util.List; +import java.util.jar.JarFile; import org.junit.Test; @@ -26,7 +26,7 @@ import cuchaz.enigma.mapping.ClassEntry; public class TestDeobfuscator { private Deobfuscator getDeobfuscator() throws IOException { - return new Deobfuscator(new File("build/testLoneClass.obf.jar")); + return new Deobfuscator(new JarFile("build/testLoneClass.obf.jar")); } @Test diff --git a/test/cuchaz/enigma/TestInnerClasses.java b/test/cuchaz/enigma/TestInnerClasses.java index 51fb5e35..63c9b719 100644 --- a/test/cuchaz/enigma/TestInnerClasses.java +++ b/test/cuchaz/enigma/TestInnerClasses.java @@ -23,6 +23,7 @@ import cuchaz.enigma.analysis.JarIndex; public class TestInnerClasses { private JarIndex m_index; + private Deobfuscator m_deobfuscator; private static final String AnonymousOuter = "none/a"; private static final String AnonymousInner = "b"; @@ -32,10 +33,14 @@ public class TestInnerClasses { private static final String ConstructorArgsInner = "f"; private static final String AnonymousWithScopeArgsOuter = "none/c"; private static final String AnonymousWithScopeArgsInner = "d"; + private static final String AnonymousWithOuterAccessOuter = "none/i"; + private static final String AnonymousWithOuterAccessInner = "j"; public TestInnerClasses() throws Exception { m_index = new JarIndex(); - m_index.indexJar(new JarFile("build/testInnerClasses.obf.jar"), true); + JarFile jar = new JarFile("build/testInnerClasses.obf.jar"); + m_index.indexJar(jar, true); + m_deobfuscator = new Deobfuscator(jar); } @Test @@ -43,6 +48,7 @@ public class TestInnerClasses { assertThat(m_index.getOuterClass(SimpleInner), is(SimpleOuter)); assertThat(m_index.getInnerClasses(SimpleOuter), containsInAnyOrder(SimpleInner)); assertThat(m_index.isAnonymousClass(SimpleInner), is(false)); + decompile(SimpleOuter); } @Test @@ -50,6 +56,7 @@ public class TestInnerClasses { assertThat(m_index.getOuterClass(AnonymousInner), is(AnonymousOuter)); assertThat(m_index.getInnerClasses(AnonymousOuter), containsInAnyOrder(AnonymousInner)); assertThat(m_index.isAnonymousClass(AnonymousInner), is(true)); + decompile(AnonymousOuter); } @Test @@ -57,6 +64,7 @@ public class TestInnerClasses { assertThat(m_index.getOuterClass(ConstructorArgsInner), is(ConstructorArgsOuter)); assertThat(m_index.getInnerClasses(ConstructorArgsOuter), containsInAnyOrder(ConstructorArgsInner)); assertThat(m_index.isAnonymousClass(ConstructorArgsInner), is(false)); + decompile(ConstructorArgsOuter); } @Test @@ -64,5 +72,18 @@ public class TestInnerClasses { assertThat(m_index.getOuterClass(AnonymousWithScopeArgsInner), is(AnonymousWithScopeArgsOuter)); assertThat(m_index.getInnerClasses(AnonymousWithScopeArgsOuter), containsInAnyOrder(AnonymousWithScopeArgsInner)); assertThat(m_index.isAnonymousClass(AnonymousWithScopeArgsInner), is(true)); + decompile(AnonymousWithScopeArgsOuter); + } + + @Test + public void anonymousWithOuterAccess() { + assertThat(m_index.getOuterClass(AnonymousWithOuterAccessInner), is(AnonymousWithOuterAccessOuter)); + assertThat(m_index.getInnerClasses(AnonymousWithOuterAccessOuter), containsInAnyOrder(AnonymousWithOuterAccessInner)); + assertThat(m_index.isAnonymousClass(AnonymousWithOuterAccessInner), is(true)); + decompile(AnonymousWithOuterAccessOuter); + } + + private void decompile(String name) { + m_deobfuscator.getSourceTree(name); } } diff --git a/test/cuchaz/enigma/TestSourceIndex.java b/test/cuchaz/enigma/TestSourceIndex.java index ba7fc797..70a5ee4c 100644 --- a/test/cuchaz/enigma/TestSourceIndex.java +++ b/test/cuchaz/enigma/TestSourceIndex.java @@ -11,8 +11,8 @@ ******************************************************************************/ package cuchaz.enigma; -import java.io.File; import java.util.Set; +import java.util.jar.JarFile; import org.junit.Test; @@ -26,7 +26,7 @@ public class TestSourceIndex { // TEMP @Test public void indexEverything() throws Exception { - Deobfuscator deobfuscator = new Deobfuscator(new File("input/1.8.jar")); + Deobfuscator deobfuscator = new Deobfuscator(new JarFile("input/1.8.jar")); // get all classes that aren't inner classes Set classEntries = Sets.newHashSet(); diff --git a/test/cuchaz/enigma/TestTokensConstructors.java b/test/cuchaz/enigma/TestTokensConstructors.java index 9f85e81d..56424ae8 100644 --- a/test/cuchaz/enigma/TestTokensConstructors.java +++ b/test/cuchaz/enigma/TestTokensConstructors.java @@ -10,15 +10,11 @@ ******************************************************************************/ package cuchaz.enigma; -import static cuchaz.enigma.EntryFactory.newBehaviorReferenceByConstructor; -import static cuchaz.enigma.EntryFactory.newBehaviorReferenceByMethod; -import static cuchaz.enigma.EntryFactory.newConstructor; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.nullValue; +import static cuchaz.enigma.EntryFactory.*; +import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.Matchers.*; -import java.io.File; +import java.util.jar.JarFile; import org.junit.Test; @@ -27,7 +23,7 @@ import cuchaz.enigma.mapping.BehaviorEntry; public class TestTokensConstructors extends TokenChecker { public TestTokensConstructors() throws Exception { - super(new File("build/testConstructors.obf.jar")); + super(new JarFile("build/testConstructors.obf.jar")); } @Test @@ -63,11 +59,11 @@ public class TestTokensConstructors extends TokenChecker { ); assertThat( getReferenceTokens(newBehaviorReferenceByConstructor(source, "none/d", "()V")), - containsInAnyOrder("super") // implicit call, decompiled to "super" + is(empty()) // implicit call, not decompiled to token ); assertThat( getReferenceTokens(newBehaviorReferenceByConstructor(source, "none/d", "(III)V")), - containsInAnyOrder("super") // implicit call, decompiled to "super" + is(empty()) // implicit call, not decompiled to token ); } diff --git a/test/cuchaz/enigma/TokenChecker.java b/test/cuchaz/enigma/TokenChecker.java index 524c5ec5..febea2ae 100644 --- a/test/cuchaz/enigma/TokenChecker.java +++ b/test/cuchaz/enigma/TokenChecker.java @@ -10,10 +10,10 @@ ******************************************************************************/ package cuchaz.enigma; -import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.List; +import java.util.jar.JarFile; import com.google.common.collect.Lists; import com.strobel.decompiler.languages.java.ast.CompilationUnit; @@ -27,7 +27,7 @@ public class TokenChecker { private Deobfuscator m_deobfuscator; - protected TokenChecker(File jarFile) throws IOException { + protected TokenChecker(JarFile jarFile) throws IOException { m_deobfuscator = new Deobfuscator(jarFile); } diff --git a/test/cuchaz/enigma/inputs/innerClasses/A_Anonymous.java b/test/cuchaz/enigma/inputs/innerClasses/A_Anonymous.java new file mode 100644 index 00000000..f7118f63 --- /dev/null +++ b/test/cuchaz/enigma/inputs/innerClasses/A_Anonymous.java @@ -0,0 +1,14 @@ +package cuchaz.enigma.inputs.innerClasses; + +public class A_Anonymous { + + public void foo() { + Runnable runnable = new Runnable() { + @Override + public void run() { + // don't care + } + }; + runnable.run(); + } +} diff --git a/test/cuchaz/enigma/inputs/innerClasses/Anonymous.java b/test/cuchaz/enigma/inputs/innerClasses/Anonymous.java deleted file mode 100644 index f5d9d1cf..00000000 --- a/test/cuchaz/enigma/inputs/innerClasses/Anonymous.java +++ /dev/null @@ -1,14 +0,0 @@ -package cuchaz.enigma.inputs.innerClasses; - -public class Anonymous { - - public void foo() { - Runnable runnable = new Runnable() { - @Override - public void run() { - // don't care - } - }; - runnable.run(); - } -} diff --git a/test/cuchaz/enigma/inputs/innerClasses/AnonymousWithScopeArgs.java b/test/cuchaz/enigma/inputs/innerClasses/AnonymousWithScopeArgs.java deleted file mode 100644 index b3ba1af8..00000000 --- a/test/cuchaz/enigma/inputs/innerClasses/AnonymousWithScopeArgs.java +++ /dev/null @@ -1,13 +0,0 @@ -package cuchaz.enigma.inputs.innerClasses; - -public class AnonymousWithScopeArgs { - - public static void foo(final Simple arg) { - System.out.println(new Object() { - @Override - public String toString() { - return arg.toString(); - } - }); - } -} diff --git a/test/cuchaz/enigma/inputs/innerClasses/B_AnonymousWithScopeArgs.java b/test/cuchaz/enigma/inputs/innerClasses/B_AnonymousWithScopeArgs.java new file mode 100644 index 00000000..42fba9a8 --- /dev/null +++ b/test/cuchaz/enigma/inputs/innerClasses/B_AnonymousWithScopeArgs.java @@ -0,0 +1,13 @@ +package cuchaz.enigma.inputs.innerClasses; + +public class B_AnonymousWithScopeArgs { + + public static void foo(final D_Simple arg) { + System.out.println(new Object() { + @Override + public String toString() { + return arg.toString(); + } + }); + } +} diff --git a/test/cuchaz/enigma/inputs/innerClasses/C_ConstructorArgs.java b/test/cuchaz/enigma/inputs/innerClasses/C_ConstructorArgs.java new file mode 100644 index 00000000..8fa6c5b8 --- /dev/null +++ b/test/cuchaz/enigma/inputs/innerClasses/C_ConstructorArgs.java @@ -0,0 +1,20 @@ +package cuchaz.enigma.inputs.innerClasses; + +@SuppressWarnings("unused") +public class C_ConstructorArgs { + + class Inner { + + private int a; + + public Inner(int a) { + this.a = a; + } + } + + Inner i; + + public void foo() { + i = new Inner(5); + } +} diff --git a/test/cuchaz/enigma/inputs/innerClasses/ConstructorArgs.java b/test/cuchaz/enigma/inputs/innerClasses/ConstructorArgs.java deleted file mode 100644 index 08135fe5..00000000 --- a/test/cuchaz/enigma/inputs/innerClasses/ConstructorArgs.java +++ /dev/null @@ -1,20 +0,0 @@ -package cuchaz.enigma.inputs.innerClasses; - -@SuppressWarnings("unused") -public class ConstructorArgs { - - class Inner { - - private int a; - - public Inner(int a) { - this.a = a; - } - } - - Inner i; - - public void foo() { - i = new Inner(5); - } -} diff --git a/test/cuchaz/enigma/inputs/innerClasses/D_Simple.java b/test/cuchaz/enigma/inputs/innerClasses/D_Simple.java new file mode 100644 index 00000000..c4fc0ef9 --- /dev/null +++ b/test/cuchaz/enigma/inputs/innerClasses/D_Simple.java @@ -0,0 +1,8 @@ +package cuchaz.enigma.inputs.innerClasses; + +public class D_Simple { + + class Inner { + // nothing to do + } +} diff --git a/test/cuchaz/enigma/inputs/innerClasses/E_AnonymousWithOuterAccess.java b/test/cuchaz/enigma/inputs/innerClasses/E_AnonymousWithOuterAccess.java new file mode 100644 index 00000000..e1de53cb --- /dev/null +++ b/test/cuchaz/enigma/inputs/innerClasses/E_AnonymousWithOuterAccess.java @@ -0,0 +1,21 @@ +package cuchaz.enigma.inputs.innerClasses; + +public class E_AnonymousWithOuterAccess { + + // reproduction of error case documented at: + // https://bitbucket.org/cuchaz/enigma/issue/61/stackoverflowerror-when-deobfuscating + + public Object makeInner() { + outerMethod(); + return new Object() { + @Override + public String toString() { + return outerMethod(); + } + }; + } + + private String outerMethod() { + return "foo"; + } +} diff --git a/test/cuchaz/enigma/inputs/innerClasses/Simple.java b/test/cuchaz/enigma/inputs/innerClasses/Simple.java deleted file mode 100644 index cb536fa6..00000000 --- a/test/cuchaz/enigma/inputs/innerClasses/Simple.java +++ /dev/null @@ -1,8 +0,0 @@ -package cuchaz.enigma.inputs.innerClasses; - -public class Simple { - - class Inner { - // nothing to do - } -} -- cgit v1.2.3