Added debugging code to find the cause of issue 339

This commit is contained in:
Roel Spilker committed 2012-03-19 23:56:14 +01:00
1 parent 3b27a7feb8
commit eb317c58df
1 file changed
+41 -1
+41 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2010 The Project Lombok Authors.
* Copyright (C) 2010-2012 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -21,6 +21,9 @@
*/
package lombok.bytecode;
import java.io.InputStream;
import java.util.Arrays;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
@@ -36,6 +39,43 @@ class FixedClassWriter extends ClassWriter {
return super.getCommonSuperClass(type1, type2);
} catch (Exception e) {
return "java/lang/Object";
} catch (ClassFormatError e) {
ClassLoader cl = this.getClass().getClassLoader();
if (cl == null) cl = ClassLoader.getSystemClassLoader();
String message = debugCheckClassFormatErrorIssue(cl, type1) +
debugCheckClassFormatErrorIssue(cl, type2);
throw new ClassFormatError(message);
}
}
// This is debug-aiding code in an attempt to find the cause of issue:
// http://code.google.com/p/projectlombok/issues/detail?id=339
private static String debugCheckClassFormatErrorIssue(ClassLoader cl, String type) {
try {
Class.forName(type.replace('/', '.'), false, cl);
return String.format("Class.forName debug on %s: no issues\n", type);
} catch (ClassFormatError e) {
// expected
} catch (Throwable e) {
return String.format("Class.forName debug on %s: Exception: %s\n", type, e);
}
try {
InputStream in = cl.getResourceAsStream(type + ".class");
if (in == null) return String.format("Class.forName debug on %s: Can't find resource %s\n", type, type + ".class");
try {
int[] firstBytes = new int[4];
for (int i = 0; i < 4; i++) firstBytes[0] = in.read();
if (firstBytes[0] == -1) return String.format("Class.forName debug on %s: file size is 0\n", type);
if (firstBytes[3] == -1) return String.format("Class.forName debug on %s: Less than 4 bytes in class file\n", type);
if (!Arrays.equals(new int[] {0xCA, 0xFE, 0xBA, 0xBE}, firstBytes)) return String.format("Class.forName debug on %s: no CAFEBABE: %s\n", type, Arrays.toString(firstBytes));
return String.format("Class.forName debug on %s: No immediately obvious reason for failure found\n", type);
} finally {
in.close();
}
} catch (Throwable e) {
return String.format("Class.forName debug on %s: Can't read as stream: %s\n", type, e);
}
}
}