Skip to content

Commit 586758f

Browse files
committed
Update Procyon wrapper (#16)
1 parent 1838878 commit 586758f

File tree

4 files changed

+123
-7
lines changed

4 files changed

+123
-7
lines changed

src/main/java/the/bytecode/club/jda/decompilers/Decompilers.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
public class Decompilers {
1111
static final Map<String, Decompiler> BY_NAME = new LinkedHashMap<>();
1212

13-
public final static Decompiler PROCYON = new FernflowerDecompiler(); //TODo
13+
public final static Decompiler PROCYON = new ProcyonDecompiler();
1414
public final static Decompiler CFR = new CFRDecompiler();
1515
public final static Decompiler FERNFLOWER = new FernflowerDecompiler();
1616
public final static Decompiler BYTECODE = new BytecodeDecompiler();

src/main/java/the/bytecode/club/jda/decompilers/FernflowerDecompiler.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,6 @@ private Map<String, Object> generateFernflowerArgs() {
159159
Map<String, Object> options = new HashMap<>();
160160
for (SettingsEntry setting : settings.getEntries()) {
161161
options.put(setting.param, setting.get());
162-
System.out.println(setting.param + " " + setting.get());
163162
}
164163
return options;
165164
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package the.bytecode.club.jda.decompilers;
2+
3+
import com.strobel.assembler.InputTypeLoader;
4+
import com.strobel.assembler.metadata.*;
5+
import com.strobel.decompiler.DecompilationOptions;
6+
import com.strobel.decompiler.DecompilerSettings;
7+
import com.strobel.decompiler.PlainTextOutput;
8+
import org.objectweb.asm.tree.ClassNode;
9+
import the.bytecode.club.jda.JDA;
10+
import the.bytecode.club.jda.settings.DecompilerSettings.SettingsEntry;
11+
12+
import java.io.*;
13+
import java.util.*;
14+
15+
/**
16+
* Procyon Java Decompiler Wrapper
17+
*
18+
* @author Konloch
19+
* @author DeathMarine
20+
*/
21+
22+
public final class ProcyonDecompiler extends Decompiler {
23+
24+
public ProcyonDecompiler() {
25+
// output modes: Bytecode AST, raw bytecode, Java
26+
settings.registerSetting(new SettingsEntry("ci", "Use wildcard imports", false));
27+
settings.registerSetting(new SettingsEntry("dl", "Show LVT comments", false));
28+
settings.registerSetting(new SettingsEntry("disable-foreach", "Disable 'for each'", false));
29+
settings.registerSetting(new SettingsEntry("eml", "Eager method loading", false));
30+
settings.registerSetting(new SettingsEntry("ent", "Exclude nested types", false));
31+
settings.registerSetting(new SettingsEntry("ei", "Explicit type arguments", false));
32+
settings.registerSetting(new SettingsEntry("fsb", "Flatten switch blocks", false));
33+
settings.registerSetting(new SettingsEntry("mv", "Merge variables aggressively", false));
34+
settings.registerSetting(new SettingsEntry("ec", "Retain redundant casts", false));
35+
settings.registerSetting(new SettingsEntry("ps", "Retain pointless switches", false));
36+
settings.registerSetting(new SettingsEntry("ss", "Show synthetic members", true));
37+
settings.registerSetting(new SettingsEntry("sm", "Simplify member references", false));
38+
settings.registerSetting(new SettingsEntry("sl", "Stretch lines to match LVT", false));
39+
settings.registerSetting(new SettingsEntry("unicode", "Do not escape non-ASCII characters", false));
40+
// settings.registerSetting(new SettingsEntry("u", "Unoptimized AST", false));
41+
}
42+
43+
@Override
44+
public String getName() {
45+
return "Procyon";
46+
}
47+
48+
public DecompilerSettings getDecompilerSettings() {
49+
System.out.println(settings.getEntry("Do not escape non-ASCII characters").getBool());
50+
DecompilerSettings procyonSettings = new DecompilerSettings();
51+
procyonSettings.setFlattenSwitchBlocks(settings.getEntry("Flatten switch blocks").getBool());
52+
procyonSettings.setForceExplicitImports(!settings.getEntry("Use wildcard imports").getBool());
53+
procyonSettings.setForceExplicitTypeArguments(settings.getEntry("Explicit type arguments").getBool());
54+
procyonSettings.setRetainRedundantCasts(settings.getEntry("Retain redundant casts").getBool());
55+
procyonSettings.setShowSyntheticMembers(settings.getEntry("Show synthetic members").getBool());
56+
procyonSettings.setExcludeNestedTypes(settings.getEntry("Exclude nested types").getBool());
57+
// procyonSettings.setOutputDirectory(options.getOutputDirectory());
58+
procyonSettings.setIncludeLineNumbersInBytecode(settings.getEntry("Show LVT comments").getBool());
59+
procyonSettings.setRetainPointlessSwitches(settings.getEntry("Retain pointless switches").getBool());
60+
procyonSettings.setUnicodeOutputEnabled(settings.getEntry("Do not escape non-ASCII characters").getBool());
61+
procyonSettings.setMergeVariables(settings.getEntry("Merge variables aggressively").getBool());
62+
procyonSettings.setShowDebugLineNumbers(settings.getEntry("Show LVT comments").getBool());
63+
procyonSettings.setSimplifyMemberReferences(settings.getEntry("Simplify member references").getBool());
64+
procyonSettings.setDisableForEachTransforms(settings.getEntry("Disable 'for each'").getBool());
65+
procyonSettings.setTypeLoader(new InputTypeLoader());
66+
// procyonSettings.setLanguage(Languages.bytecode());
67+
// procyonSettings.setLanguage(settings.getEntry("Unoptimized AST").getBool() ? Languages.bytecodeAstUnoptimized() : Languages.bytecodeAst());
68+
return procyonSettings;
69+
}
70+
71+
@Override
72+
public String decompileClassNode(String containerName, final ClassNode cn) {
73+
try {
74+
byte[] bytes = JDA.getClassBytes(containerName, cn);
75+
final Map<String, byte[]> loadedClasses = JDA.getLoadedBytes();
76+
MetadataSystem metadataSystem = new MetadataSystem(new ITypeLoader() {
77+
private InputTypeLoader backLoader = new InputTypeLoader();
78+
79+
@Override
80+
public boolean tryLoadType(String s, Buffer buffer) {
81+
if (s.equals(cn.name)) {
82+
buffer.putByteArray(bytes, 0, bytes.length);
83+
buffer.position(0);
84+
return true;
85+
} else {
86+
byte[] toUse = loadedClasses.get(s + ".class");
87+
if (toUse != null) {
88+
buffer.putByteArray(toUse, 0, toUse.length);
89+
buffer.position(0);
90+
return true;
91+
} else {
92+
return backLoader.tryLoadType(s, buffer);
93+
}
94+
}
95+
}
96+
});
97+
TypeReference type = metadataSystem.lookupType(cn.name);
98+
DecompilationOptions decompilationOptions = new DecompilationOptions();
99+
DecompilerSettings settings = getDecompilerSettings();
100+
decompilationOptions.setSettings(settings);
101+
decompilationOptions.setFullDecompilation(true);
102+
TypeDefinition resolvedType;
103+
if (type == null || ((resolvedType = type.resolve()) == null)) {
104+
throw new Exception("Unable to resolve type.");
105+
}
106+
StringWriter stringwriter = new StringWriter();
107+
settings.getLanguage().decompileType(resolvedType, new PlainTextOutput(stringwriter), decompilationOptions);
108+
String decompiledSource = stringwriter.toString();
109+
return decompiledSource;
110+
} catch (Throwable e) {
111+
return parseException(e);
112+
}
113+
}
114+
115+
@Override
116+
public void decompileToZip(String zipName) {
117+
// todo: rewrite
118+
}
119+
}
120+

src/main/java/the/bytecode/club/jda/settings/DecompilerSettings.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66

77
import javax.swing.*;
88
import java.awt.*;
9-
import java.util.HashMap;
10-
import java.util.HashSet;
11-
import java.util.Map;
12-
import java.util.Set;
9+
import java.util.*;
1310

1411
public class DecompilerSettings {
1512
private final Decompiler decompiler;
@@ -20,7 +17,7 @@ public class DecompilerSettings {
2017
/**
2118
* Stores all of the individual settings. Should not be modified after initialization.
2219
*/
23-
private final Map<String, SettingsEntry> entries = new HashMap<>();
20+
private final Map<String, SettingsEntry> entries = new LinkedHashMap<>();
2421

2522
private Map<SettingsEntry, JCheckBox> booleanSettings = new HashMap<>();
2623
private Map<SettingsEntry, JTextArea> stringSettings = new HashMap<>();

0 commit comments

Comments
 (0)