Skip to content

Commit a38c1a0

Browse files
committed
Fall back to getting class file bytes when dumping class to bytes fails
1 parent a1bdf1e commit a38c1a0

File tree

4 files changed

+21
-6
lines changed

4 files changed

+21
-6
lines changed

src/main/java/club/bytecode/the/jda/JDA.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,15 @@ public static boolean hasFile(ViewerFile file) {
224224
return false;
225225
return file.container.getFiles().containsKey(file.name);
226226
}
227+
228+
// try to get class bytes by exporting classnode, else fallback to getting the bytes from the actual file itself
229+
public static byte[] getClassBytes(FileContainer container, ClassNode cn) {
230+
byte[] result = dumpClassToBytes(cn);
231+
if (result != null)
232+
return result;
233+
result = getClassFileBytes(container, cn.name);
234+
return result;
235+
}
227236

228237
public static byte[] getClassFileBytes(FileContainer container, String className) {
229238
byte[] bytes = getFileBytes(new ViewerFile(container, container.findClassfile(className)));
@@ -234,9 +243,15 @@ public static byte[] getClassFileBytes(FileContainer container, String className
234243

235244
public static byte[] dumpClassToBytes(ClassNode cn) {
236245
// we have to do this, or else decompile filters don't work.
237-
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
238-
cn.accept(writer);
239-
return writer.toByteArray();
246+
try {
247+
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
248+
cn.accept(writer);
249+
return writer.toByteArray();
250+
} catch (Exception e) {
251+
System.err.println("Exception while dumping class " + cn.name + ": ");
252+
e.printStackTrace();
253+
return null;
254+
}
240255
}
241256

242257
public static final String HACK_PREFIX = "\0JDA-hack";

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public JDANamespace getNamespace() {
9898
@Override
9999
public String decompileClassNode(FileContainer container, ClassNode cn) {
100100
try {
101-
byte[] bytes = JDA.dumpClassToBytes(cn);
101+
byte[] bytes = JDA.getClassBytes(container, cn);
102102
Options options = new GetOptParser().parse(generateMainMethod(), OptionsImpl.getFactory());
103103
ClassFileSourceImpl classFileSource = new ClassFileSourceImpl(options);
104104
DCCommonState dcCommonState = new DCCommonState(options, classFileSource);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public String decompileClassNode(FileContainer container, final ClassNode cn) {
8181
applyFilters(requestedCn);
8282
classCache.put(className, requestedCn);
8383
}
84-
return JDA.dumpClassToBytes(requestedCn);
84+
return JDA.getClassBytes(container, requestedCn);
8585
}, new IResultSaver() {
8686
@Override
8787
public void saveFolder(String s) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public DecompilerSettings getDecompilerSettings() {
7777
@Override
7878
public String decompileClassNode(FileContainer container, final ClassNode cn) {
7979
try {
80-
byte[] bytes = JDA.dumpClassToBytes(cn);
80+
byte[] bytes = JDA.getClassBytes(container, cn);
8181
final Map<String, byte[]> loadedClasses = JDA.getLoadedBytes();
8282
MetadataSystem metadataSystem = new MetadataSystem(new ITypeLoader() {
8383
private InputTypeLoader backLoader = new InputTypeLoader();

0 commit comments

Comments
 (0)