mirror of
https://github.com/tiennm99/lombok.git
synced 2026-10-13 12:15:00 +00:00
Added debugging code to find the cause of issue 339
This commit is contained in:
1 parent
3b27a7feb8
commit
eb317c58df
1 file changed
+41
-1
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user