src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/TranslatedException.java
--- a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/TranslatedException.java Tue May 07 10:21:04 2019 +0800
+++ b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/TranslatedException.java Mon May 06 20:05:19 2019 -0700
@@ -49,16 +49,23 @@
return this;
}
- @Override
- public String toString() {
- return getMessage();
- }
+ private static Throwable create(String className, String message) {
+ // Try create with reflection first.
+ try {
+ Class<?> cls = Class.forName(className);
+ if (message == null) {
+ return (Throwable) cls.getConstructor().newInstance();
+ }
+ cls.getDeclaredConstructor(String.class);
+ return (Throwable) cls.getConstructor(String.class).newInstance(message);
+ } catch (Throwable ignore) {
+ }
- private static TranslatedException create(String className, String message) {
if (className.equals(TranslatedException.class.getName())) {
// Chop the class name when boxing another TranslatedException
return new TranslatedException(message);
}
+
if (message == null) {
return new TranslatedException(className);
}
@@ -147,7 +154,7 @@
Throwable throwable = create(exceptionClassName, exceptionMessage);
int stackTraceDepth = Integer.parseInt(parts[i++]);
- StackTraceElement[] suffix = parent == null ? new StackTraceElement[0] : getStackTraceSuffix();
+ StackTraceElement[] suffix = getStackTraceSuffix();
StackTraceElement[] stackTrace = new StackTraceElement[stackTraceDepth + suffix.length];
for (int j = 0; j < stackTraceDepth; j++) {
String className = parts[i++];