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
---
.classpath | 1 +
build.py | 6 +-
src/cuchaz/enigma/CommandMain.java | 9 +--
src/cuchaz/enigma/Deobfuscator.java | 8 +--
src/cuchaz/enigma/TranslatingTypeLoader.java | 4 +-
src/cuchaz/enigma/analysis/BridgeFixer.java | 72 ----------------------
src/cuchaz/enigma/gui/Gui.java | 3 +-
src/cuchaz/enigma/gui/GuiController.java | 5 +-
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 ---
22 files changed, 129 insertions(+), 163 deletions(-)
delete mode 100644 src/cuchaz/enigma/analysis/BridgeFixer.java
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
diff --git a/.classpath b/.classpath
index 7a9ca3de..16e0b310 100644
--- a/.classpath
+++ b/.classpath
@@ -4,6 +4,7 @@
+
diff --git a/build.py b/build.py
index 09718cb2..8e37d0ff 100644
--- a/build.py
+++ b/build.py
@@ -28,7 +28,7 @@ ExtraRepos = [
LibDeps = [
ssjb.ivy.Dep("com.google.guava:guava:17.0"),
ssjb.ivy.Dep("org.javassist:javassist:3.18.1-GA"),
- ssjb.ivy.Dep("org.bitbucket.mstrobel:procyon-decompiler:0.5.26-enigma")
+ ssjb.ivy.Dep("org.bitbucket.mstrobel:procyon-decompiler:0.5.28-enigma")
]
StandaloneDeps = LibDeps + [
ssjb.ivy.Dep("de.sciss:jsyntaxpane:1.0.0")
@@ -47,7 +47,7 @@ def buildTestJar(name, glob):
pathObfJar = os.path.join(DirBuild, "%s.obf.jar" % name)
# build the deobf jar
- with ssjb.file.TempDir(DirTemp) as dirTemp:
+ with ssjb.file.TempDir("tmp") as dirTemp:
ssjb.file.copyTree(dirTemp, DirBin, ssjb.file.find(DirBin, "cuchaz/enigma/inputs/Keep.class"))
ssjb.file.copyTree(dirTemp, DirBin, ssjb.file.find(DirBin, glob))
ssjb.jar.makeJar(pathJar, dirTemp)
@@ -96,7 +96,7 @@ def buildLibJar(dirOut):
def taskGetDeps():
ssjb.file.mkdir(DirLib)
- ssjb.ivy.makeLibsJar(os.path.join(DirLib, "deps.jar"), Deps, extraRepos=ExtraRepos)
+ ssjb.ivy.makeLibsJar(os.path.join(DirLib, "deps.jar"), StandaloneDeps, extraRepos=ExtraRepos)
ssjb.ivy.makeLibsJar(os.path.join(DirLib, "test-deps.jar"), TestDeps)
ssjb.ivy.makeJar(os.path.join(DirLib, "proguard.jar"), ProguardDep)
diff --git a/src/cuchaz/enigma/CommandMain.java b/src/cuchaz/enigma/CommandMain.java
index 74bd4991..1ec2ad23 100644
--- a/src/cuchaz/enigma/CommandMain.java
+++ b/src/cuchaz/enigma/CommandMain.java
@@ -2,6 +2,7 @@ package cuchaz.enigma;
import java.io.File;
import java.io.FileReader;
+import java.util.jar.JarFile;
import cuchaz.enigma.Deobfuscator.ProgressListener;
import cuchaz.enigma.mapping.Mappings;
@@ -78,7 +79,7 @@ public class CommandMain {
File fileMappings = getReadableFile(getArg(args, 1, "mappings file"));
File fileJarIn = getReadableFile(getArg(args, 2, "in jar"));
File fileJarOut = getWritableFolder(getArg(args, 3, "out folder"));
- Deobfuscator deobfuscator = getDeobfuscator(fileMappings, fileJarIn);
+ Deobfuscator deobfuscator = getDeobfuscator(fileMappings, new JarFile(fileJarIn));
deobfuscator.writeSources(fileJarOut, new ConsoleProgressListener());
}
@@ -87,16 +88,16 @@ public class CommandMain {
File fileMappings = getReadableFile(getArg(args, 1, "mappings file"));
File fileJarIn = getReadableFile(getArg(args, 2, "in jar"));
File fileJarOut = getWritableFile(getArg(args, 3, "out jar"));
- Deobfuscator deobfuscator = getDeobfuscator(fileMappings, fileJarIn);
+ Deobfuscator deobfuscator = getDeobfuscator(fileMappings, new JarFile(fileJarIn));
deobfuscator.writeJar(fileJarOut, new ConsoleProgressListener());
}
- private static Deobfuscator getDeobfuscator(File fileMappings, File fileJar)
+ private static Deobfuscator getDeobfuscator(File fileMappings, JarFile jar)
throws Exception {
System.out.println("Reading mappings...");
Mappings mappings = new MappingsReader().read(new FileReader(fileMappings));
System.out.println("Reading jar...");
- Deobfuscator deobfuscator = new Deobfuscator(fileJar);
+ Deobfuscator deobfuscator = new Deobfuscator(jar);
deobfuscator.setMappings(mappings);
return deobfuscator;
}
diff --git a/src/cuchaz/enigma/Deobfuscator.java b/src/cuchaz/enigma/Deobfuscator.java
index 22c517a1..62c062a5 100644
--- a/src/cuchaz/enigma/Deobfuscator.java
+++ b/src/cuchaz/enigma/Deobfuscator.java
@@ -68,7 +68,6 @@ public class Deobfuscator {
void onProgress(int numDone, String message);
}
- private File m_file;
private JarFile m_jar;
private DecompilerSettings m_settings;
private JarIndex m_jarIndex;
@@ -76,9 +75,8 @@ public class Deobfuscator {
private MappingsRenamer m_renamer;
private Map m_translatorCache;
- public Deobfuscator(File file) throws IOException {
- m_file = file;
- m_jar = new JarFile(m_file);
+ public Deobfuscator(JarFile jar) throws IOException {
+ m_jar = jar;
// build the jar index
m_jarIndex = new JarIndex();
@@ -100,7 +98,7 @@ public class Deobfuscator {
}
public String getJarName() {
- return m_file.getName();
+ return m_jar.getName();
}
public JarIndex getJarIndex() {
diff --git a/src/cuchaz/enigma/TranslatingTypeLoader.java b/src/cuchaz/enigma/TranslatingTypeLoader.java
index 091f916d..9287999b 100644
--- a/src/cuchaz/enigma/TranslatingTypeLoader.java
+++ b/src/cuchaz/enigma/TranslatingTypeLoader.java
@@ -29,7 +29,6 @@ import com.strobel.assembler.metadata.Buffer;
import com.strobel.assembler.metadata.ClasspathTypeLoader;
import com.strobel.assembler.metadata.ITypeLoader;
-import cuchaz.enigma.analysis.BridgeFixer;
import cuchaz.enigma.analysis.JarIndex;
import cuchaz.enigma.bytecode.ClassRenamer;
import cuchaz.enigma.bytecode.ClassTranslator;
@@ -168,7 +167,7 @@ public class TranslatingTypeLoader implements ITypeLoader {
assertClassName(c, deobfClassEntry);
// DEBUG
- // Util.writeClass( c );
+ Util.writeClass( c );
// we have a transformed class!
return c.toBytecode();
@@ -196,7 +195,6 @@ public class TranslatingTypeLoader implements ITypeLoader {
assertClassName(c, obfClassEntry);
// do all kinds of deobfuscating transformations on the class
- new BridgeFixer(m_jarIndex).fixBridges(c);
new MethodParameterWriter(m_deobfuscatingTranslator).writeMethodArguments(c);
new ClassTranslator(m_deobfuscatingTranslator).translate(c);
diff --git a/src/cuchaz/enigma/analysis/BridgeFixer.java b/src/cuchaz/enigma/analysis/BridgeFixer.java
deleted file mode 100644
index ad23b000..00000000
--- a/src/cuchaz/enigma/analysis/BridgeFixer.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014 Jeff Martin.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the GNU Public License v3.0
- * which accompanies this distribution, and is available at
- * http://www.gnu.org/licenses/gpl.html
- *
- * Contributors:
- * Jeff Martin - initial API and implementation
- ******************************************************************************/
-package cuchaz.enigma.analysis;
-
-import javassist.CtClass;
-import javassist.CtMethod;
-import javassist.bytecode.ConstPool;
-import javassist.bytecode.Descriptor;
-import cuchaz.enigma.bytecode.ConstPoolEditor;
-import cuchaz.enigma.mapping.BehaviorEntry;
-import cuchaz.enigma.mapping.BehaviorEntryFactory;
-import cuchaz.enigma.mapping.ClassEntry;
-import cuchaz.enigma.mapping.MethodEntry;
-
-public class BridgeFixer {
-
- private JarIndex m_index;
-
- public BridgeFixer(JarIndex index) {
- m_index = index;
- }
-
- public void fixBridges(CtClass c) {
- // rename declared methods
- for (CtMethod method : c.getDeclaredMethods()) {
- // get the method entry
- MethodEntry methodEntry = new MethodEntry(
- new ClassEntry(Descriptor.toJvmName(c.getName())),
- method.getName(),
- method.getSignature()
- );
- MethodEntry bridgeMethodEntry = m_index.getBridgeMethod(methodEntry);
- if (bridgeMethodEntry != null) {
- // fix this bridged method
- method.setName(bridgeMethodEntry.getName());
- }
- }
-
- // rename method references
- // translate all the field and method references in the code by editing the constant pool
- ConstPool constants = c.getClassFile().getConstPool();
- ConstPoolEditor editor = new ConstPoolEditor(constants);
- for (int i = 1; i < constants.getSize(); i++) {
- switch (constants.getTag(i)) {
- case ConstPool.CONST_Methodref:
- case ConstPool.CONST_InterfaceMethodref: {
- BehaviorEntry behaviorEntry = BehaviorEntryFactory.create(Descriptor.toJvmName(editor.getMemberrefClassname(i)), editor.getMemberrefName(i), editor.getMemberrefType(i));
-
- if (behaviorEntry instanceof MethodEntry) {
- MethodEntry methodEntry = (MethodEntry)behaviorEntry;
-
- // translate the name and type
- MethodEntry bridgeMethodEntry = m_index.getBridgeMethod(methodEntry);
- if (bridgeMethodEntry != null) {
- // FIXIT FIXIT FIXIT FIXIT FIXIT FIXIT FIXIT
- editor.changeMemberrefNameAndType(i, bridgeMethodEntry.getName(), bridgeMethodEntry.getSignature());
- }
- }
- }
- break;
- }
- }
- }
-}
diff --git a/src/cuchaz/enigma/gui/Gui.java b/src/cuchaz/enigma/gui/Gui.java
index 86ba93b2..e652202c 100644
--- a/src/cuchaz/enigma/gui/Gui.java
+++ b/src/cuchaz/enigma/gui/Gui.java
@@ -33,6 +33,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Vector;
+import java.util.jar.JarFile;
import javax.swing.BorderFactory;
import javax.swing.JEditorPane;
@@ -499,7 +500,7 @@ public class Gui {
@Override
public void run() {
try {
- m_controller.openJar(m_jarFileChooser.getSelectedFile());
+ m_controller.openJar(new JarFile(m_jarFileChooser.getSelectedFile()));
} catch (IOException ex) {
throw new Error(ex);
}
diff --git a/src/cuchaz/enigma/gui/GuiController.java b/src/cuchaz/enigma/gui/GuiController.java
index 908c16fa..61fea9c0 100644
--- a/src/cuchaz/enigma/gui/GuiController.java
+++ b/src/cuchaz/enigma/gui/GuiController.java
@@ -17,6 +17,7 @@ import java.io.IOException;
import java.util.Collection;
import java.util.Deque;
import java.util.List;
+import java.util.jar.JarFile;
import com.google.common.collect.Lists;
import com.google.common.collect.Queues;
@@ -66,9 +67,9 @@ public class GuiController {
return m_isDirty;
}
- public void openJar(final File file) throws IOException {
+ public void openJar(final JarFile jar) throws IOException {
m_gui.onStartOpenJar();
- m_deobfuscator = new Deobfuscator(file);
+ m_deobfuscator = new Deobfuscator(jar);
m_gui.onFinishOpenJar(m_deobfuscator.getJarName());
refreshClasses();
}
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