Skip to content

Commit 44e78b3

Browse files
committed
Exception handler comments for bytecode decompiler (#11)
1 parent 3f56263 commit 44e78b3

File tree

4 files changed

+53
-4
lines changed

4 files changed

+53
-4
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ public static String doClass(DCCommonState dcCommonState, byte[] content1) throw
161161
try {
162162
var24 = dcCommonState.getClassFile(var24.getClassType());
163163
} catch (CannotLoadClassException var18) {
164+
var18.printStackTrace();
164165
}
165166

166167
if (options.getOption(OptionsImpl.DECOMPILE_INNER_CLASSES)) {

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@
2121
public class BytecodeDecompiler extends JDADecompiler {
2222

2323
public BytecodeDecompiler() {
24-
settings.registerSetting(new SettingsEntry("debug-helpers", "Debug Helpers", true));
25-
settings.registerSetting(new SettingsEntry("append-brackets-to-labels", "Append Brackets to Labels", true));
26-
settings.registerSetting(new SettingsEntry("show-method-descriptors", "Show Method Descriptors", true));
27-
settings.registerSetting(new SettingsEntry("decompile-inner-classes", "Decompile Inner Classes", true));
24+
settings.registerSetting(new SettingsEntry("debug-helpers", "Debug helpers", true));
25+
settings.registerSetting(new SettingsEntry("append-brackets-to-labels", "Append brackets to labels", true));
26+
settings.registerSetting(new SettingsEntry("show-method-descriptors", "Show method descriptors", true));
27+
settings.registerSetting(new SettingsEntry("decompile-inner-classes", "Decompile inner classes", true));
28+
settings.registerSetting(new SettingsEntry("append-handler-comments", "Append handler comments", true));
2829
}
2930

3031
@Override

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public class InstructionPrinter {
2929
protected boolean match;
3030

3131
protected List<AbstractInsnNode> matchedInsns;
32+
protected List<Integer>[] handlers;
3233
protected Map<LabelNode, Integer> labels;
3334

3435
public InstructionPrinter(MethodNodeDecompiler parent, MethodNode m, TypeAndName[] args) {
@@ -39,6 +40,36 @@ public InstructionPrinter(MethodNodeDecompiler parent, MethodNode m, TypeAndName
3940
// matchedInsns = new ArrayList<AbstractInsnNode>(); // ingnored because
4041
// match = false
4142
match = false;
43+
44+
buildHandlerLabelCache();
45+
}
46+
47+
private void buildHandlerLabelCache() {
48+
// enumerate labels
49+
for(Iterator<AbstractInsnNode> it = mNode.instructions.iterator(); it.hasNext(); ) {
50+
AbstractInsnNode ain = it.next();
51+
if (ain instanceof LabelNode)
52+
resolveLabel((LabelNode) ain);
53+
}
54+
55+
// init handlers array
56+
handlers = new List[labels.size()];
57+
for (int i = 0 ; i < handlers.length; i++)
58+
handlers[i] = new ArrayList<>();
59+
60+
// ok, now for the main attraction
61+
for (TryCatchBlockNode tc : mNode.tryCatchBlocks) {
62+
int startIdx = mNode.instructions.indexOf(tc.start);
63+
int endIdx = mNode.instructions.indexOf(tc.end);
64+
65+
for (int i = startIdx; i < endIdx; i++) {
66+
AbstractInsnNode ain = mNode.instructions.get(i);
67+
if (ain instanceof LabelNode) {
68+
int label = labels.get(ain); // label number
69+
handlers[label - 1].add(labels.get(tc.handler));
70+
}
71+
}
72+
}
4273
}
4374

4475
/**
@@ -80,6 +111,18 @@ public ArrayList<String> createPrint() {
80111
firstLabel = true;
81112
line += " {";
82113
}
114+
115+
if (parent.appendHandlerComments()) {
116+
List<Integer> handlerLabels = handlers[labels.get(ain) - 1];
117+
if (handlerLabels.size() > 0) {
118+
StringBuilder sb = new StringBuilder(line);
119+
sb.append(" // Handlers: ");
120+
for (int handler : handlerLabels) {
121+
sb.append("L").append(handler).append(" ");
122+
}
123+
line = sb.toString();
124+
}
125+
}
83126
} else if (ain instanceof TypeInsnNode) {
84127
line = printTypeInsnNode((TypeInsnNode) ain);
85128
} else if (ain instanceof FrameNode) {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,4 +265,8 @@ boolean createLabelBrackets() {
265265
boolean createDescriptors() {
266266
return parent.getSettings().getEntry("show-method-descriptors").getBool();
267267
}
268+
269+
boolean appendHandlerComments() {
270+
return parent.getSettings().getEntry("append-handler-comments").getBool();
271+
}
268272
}

0 commit comments

Comments
 (0)