summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar modmuss502022-03-30 17:44:58 +0100
committerGravatar GitHub2022-03-30 17:44:58 +0100
commit64537ba10cf6627ed944cb66b22019c698f705d8 (patch)
treeea6acb7e83e5f0902c454895952780878953579d
parentfeat(i18n): update Chinese(Simplified) translation (#441) (diff)
downloadenigma-64537ba10cf6627ed944cb66b22019c698f705d8.tar.gz
enigma-64537ba10cf6627ed944cb66b22019c698f705d8.tar.xz
enigma-64537ba10cf6627ed944cb66b22019c698f705d8.zip
Add readonly bytecode view. (#443)
-rw-r--r--enigma-swing/src/main/java/cuchaz/enigma/gui/config/Decompiler.java3
-rw-r--r--enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java1
-rw-r--r--enigma/src/main/java/cuchaz/enigma/source/Decompilers.java2
-rw-r--r--enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeDecompiler.java21
-rw-r--r--enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeSource.java56
-rw-r--r--enigma/src/main/java/cuchaz/enigma/source/bytecode/EnigmaTextifier.java14
6 files changed, 96 insertions, 1 deletions
diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/config/Decompiler.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/config/Decompiler.java
index 8232ab6e..f9b5cbe1 100644
--- a/enigma-swing/src/main/java/cuchaz/enigma/gui/config/Decompiler.java
+++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/config/Decompiler.java
@@ -5,7 +5,8 @@ import cuchaz.enigma.source.Decompilers;
5 5
6public enum Decompiler { 6public enum Decompiler {
7 CFR("CFR", Decompilers.CFR), 7 CFR("CFR", Decompilers.CFR),
8 PROCYON("Procyon", Decompilers.PROCYON); 8 PROCYON("Procyon", Decompilers.PROCYON),
9 BYTECODE("Bytecode", Decompilers.BYTECODE);
9 10
10 public final DecompilerService service; 11 public final DecompilerService service;
11 public final String name; 12 public final String name;
diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java b/enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java
index 989464de..013c52f5 100644
--- a/enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java
+++ b/enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java
@@ -57,6 +57,7 @@ public final class BuiltinPlugin implements EnigmaPlugin {
57 private void registerDecompilerServices(EnigmaPluginContext ctx) { 57 private void registerDecompilerServices(EnigmaPluginContext ctx) {
58 ctx.registerService("enigma:procyon", DecompilerService.TYPE, ctx1 -> Decompilers.PROCYON); 58 ctx.registerService("enigma:procyon", DecompilerService.TYPE, ctx1 -> Decompilers.PROCYON);
59 ctx.registerService("enigma:cfr", DecompilerService.TYPE, ctx1 -> Decompilers.CFR); 59 ctx.registerService("enigma:cfr", DecompilerService.TYPE, ctx1 -> Decompilers.CFR);
60 ctx.registerService("enigma:bytecode", DecompilerService.TYPE, ctx1 -> Decompilers.BYTECODE);
60 } 61 }
61 62
62 private static final class EnumFieldNameFindingVisitor extends ClassVisitor { 63 private static final class EnumFieldNameFindingVisitor extends ClassVisitor {
diff --git a/enigma/src/main/java/cuchaz/enigma/source/Decompilers.java b/enigma/src/main/java/cuchaz/enigma/source/Decompilers.java
index 7d154a6a..643ea7a6 100644
--- a/enigma/src/main/java/cuchaz/enigma/source/Decompilers.java
+++ b/enigma/src/main/java/cuchaz/enigma/source/Decompilers.java
@@ -1,9 +1,11 @@
1package cuchaz.enigma.source; 1package cuchaz.enigma.source;
2 2
3import cuchaz.enigma.source.bytecode.BytecodeDecompiler;
3import cuchaz.enigma.source.cfr.CfrDecompiler; 4import cuchaz.enigma.source.cfr.CfrDecompiler;
4import cuchaz.enigma.source.procyon.ProcyonDecompiler; 5import cuchaz.enigma.source.procyon.ProcyonDecompiler;
5 6
6public class Decompilers { 7public class Decompilers {
7 public static final DecompilerService PROCYON = ProcyonDecompiler::new; 8 public static final DecompilerService PROCYON = ProcyonDecompiler::new;
8 public static final DecompilerService CFR = CfrDecompiler::new; 9 public static final DecompilerService CFR = CfrDecompiler::new;
10 public static final DecompilerService BYTECODE = BytecodeDecompiler::new;
9} 11}
diff --git a/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeDecompiler.java b/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeDecompiler.java
new file mode 100644
index 00000000..97d2969b
--- /dev/null
+++ b/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeDecompiler.java
@@ -0,0 +1,21 @@
1package cuchaz.enigma.source.bytecode;
2
3import cuchaz.enigma.classprovider.ClassProvider;
4import cuchaz.enigma.source.Decompiler;
5import cuchaz.enigma.source.Source;
6import cuchaz.enigma.source.SourceSettings;
7import cuchaz.enigma.translation.mapping.EntryRemapper;
8import org.checkerframework.checker.nullness.qual.Nullable;
9
10public class BytecodeDecompiler implements Decompiler {
11 private final ClassProvider classProvider;
12
13 public BytecodeDecompiler(ClassProvider classProvider, SourceSettings settings) {
14 this.classProvider = classProvider;
15 }
16
17 @Override
18 public Source getSource(String className, @Nullable EntryRemapper remapper) {
19 return new BytecodeSource(classProvider.get(className), remapper);
20 }
21}
diff --git a/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeSource.java b/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeSource.java
new file mode 100644
index 00000000..4364b408
--- /dev/null
+++ b/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeSource.java
@@ -0,0 +1,56 @@
1package cuchaz.enigma.source.bytecode;
2
3import cuchaz.enigma.Enigma;
4import cuchaz.enigma.bytecode.translators.TranslationClassVisitor;
5import cuchaz.enigma.source.Source;
6import cuchaz.enigma.source.SourceIndex;
7import cuchaz.enigma.translation.mapping.EntryRemapper;
8import org.objectweb.asm.tree.ClassNode;
9import org.objectweb.asm.util.TraceClassVisitor;
10
11import java.io.PrintWriter;
12import java.io.StringWriter;
13
14public class BytecodeSource implements Source {
15 private final ClassNode classNode;
16 private final EntryRemapper remapper;
17
18 public BytecodeSource(ClassNode classNode, EntryRemapper remapper) {
19 this.classNode = classNode;
20 this.remapper = remapper;
21 }
22
23 @Override
24 public String asString() {
25 return index().getSource();
26 }
27
28 @Override
29 public Source withJavadocs(EntryRemapper remapper) {
30 return new BytecodeSource(classNode, remapper);
31 }
32
33 @Override
34 public SourceIndex index() {
35 SourceIndex index = new SourceIndex();
36
37 EnigmaTextifier textifier = new EnigmaTextifier(index);
38 StringWriter out = new StringWriter();
39 PrintWriter writer = new PrintWriter(out);
40
41 TraceClassVisitor traceClassVisitor = new TraceClassVisitor(null, textifier, writer);
42
43 ClassNode node = this.classNode;
44
45 if (remapper != null) {
46 ClassNode translatedNode = new ClassNode();
47 node.accept(new TranslationClassVisitor(remapper.getDeobfuscator(), Enigma.ASM_VERSION, translatedNode));
48 node = translatedNode;
49 }
50
51 node.accept(traceClassVisitor);
52 index.setSource(out.toString());
53
54 return index;
55 }
56}
diff --git a/enigma/src/main/java/cuchaz/enigma/source/bytecode/EnigmaTextifier.java b/enigma/src/main/java/cuchaz/enigma/source/bytecode/EnigmaTextifier.java
new file mode 100644
index 00000000..2f3fcf2b
--- /dev/null
+++ b/enigma/src/main/java/cuchaz/enigma/source/bytecode/EnigmaTextifier.java
@@ -0,0 +1,14 @@
1package cuchaz.enigma.source.bytecode;
2
3import cuchaz.enigma.Enigma;
4import cuchaz.enigma.source.SourceIndex;
5import org.objectweb.asm.util.Textifier;
6
7public class EnigmaTextifier extends Textifier {
8 private final SourceIndex sourceIndex;
9
10 public EnigmaTextifier(SourceIndex sourceIndex) {
11 super(Enigma.ASM_VERSION);
12 this.sourceIndex = sourceIndex;
13 }
14}