|
35 | 35 | import com.oracle.svm.core.heap.RestrictHeapAccess;
|
36 | 36 | import com.oracle.svm.core.jdk.InternalVMMethod;
|
37 | 37 | import com.oracle.svm.core.jdk.StackTraceUtils;
|
| 38 | +import com.oracle.svm.core.option.SubstrateOptionsParser; |
38 | 39 | import com.oracle.svm.core.snippets.SnippetRuntime.SubstrateForeignCallDescriptor;
|
39 | 40 | import com.oracle.svm.core.threadlocal.FastThreadLocalFactory;
|
40 | 41 | import com.oracle.svm.core.threadlocal.FastThreadLocalInt;
|
@@ -106,6 +107,20 @@ public class ImplicitExceptions {
|
106 | 107 | public static final SubstrateForeignCallDescriptor THROW_NEW_ASSERTION_ERROR_NULLARY = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "throwNewAssertionErrorNullary", NO_SIDE_EFFECT);
|
107 | 108 | public static final SubstrateForeignCallDescriptor THROW_NEW_ASSERTION_ERROR_OBJECT = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "throwNewAssertionErrorObject", NO_SIDE_EFFECT);
|
108 | 109 |
|
| 110 | + public static final SubstrateForeignCallDescriptor CREATE_OPT_NULL_POINTER_EXCEPTION = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "createOptNullPointerException", HAS_SIDE_EFFECT); |
| 111 | + public static final SubstrateForeignCallDescriptor CREATE_OPT_OUT_OF_BOUNDS_EXCEPTION = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "createOptOutOfBoundsException", HAS_SIDE_EFFECT); |
| 112 | + public static final SubstrateForeignCallDescriptor CREATE_OPT_CLASS_CAST_EXCEPTION = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "createOptClassCastException", HAS_SIDE_EFFECT); |
| 113 | + public static final SubstrateForeignCallDescriptor CREATE_OPT_ARRAY_STORE_EXCEPTION = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "createOptArrayStoreException", HAS_SIDE_EFFECT); |
| 114 | + public static final SubstrateForeignCallDescriptor CREATE_OPT_INCOMPATIBLE_CLASS_CHANGE_ERROR = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "createOptIncompatibleClassChangeError", |
| 115 | + HAS_SIDE_EFFECT); |
| 116 | + |
| 117 | + public static final SubstrateForeignCallDescriptor THROW_OPT_NULL_POINTER_EXCEPTION = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "throwOptNullPointerException", NO_SIDE_EFFECT); |
| 118 | + public static final SubstrateForeignCallDescriptor THROW_OPT_OUT_OF_BOUNDS_EXCEPTION = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "throwOptOutOfBoundsException", NO_SIDE_EFFECT); |
| 119 | + public static final SubstrateForeignCallDescriptor THROW_OPT_CLASS_CAST_EXCEPTION = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "throwOptClassCastException", NO_SIDE_EFFECT); |
| 120 | + public static final SubstrateForeignCallDescriptor THROW_OPT_ARRAY_STORE_EXCEPTION = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "throwOptArrayStoreException", NO_SIDE_EFFECT); |
| 121 | + public static final SubstrateForeignCallDescriptor THROW_OPT_INCOMPATIBLE_CLASS_CHANGE_ERROR = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "throwOptIncompatibleClassChangeError", |
| 122 | + NO_SIDE_EFFECT); |
| 123 | + |
109 | 124 | public static final SubstrateForeignCallDescriptor GET_CACHED_NULL_POINTER_EXCEPTION = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "getCachedNullPointerException", HAS_SIDE_EFFECT);
|
110 | 125 | public static final SubstrateForeignCallDescriptor GET_CACHED_OUT_OF_BOUNDS_EXCEPTION = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "getCachedOutOfBoundsException", HAS_SIDE_EFFECT);
|
111 | 126 | public static final SubstrateForeignCallDescriptor GET_CACHED_CLASS_CAST_EXCEPTION = SnippetRuntime.findForeignCall(ImplicitExceptions.class, "getCachedClassCastException", HAS_SIDE_EFFECT);
|
@@ -150,6 +165,9 @@ public class ImplicitExceptions {
|
150 | 165 | THROW_CACHED_NULL_POINTER_EXCEPTION, THROW_CACHED_OUT_OF_BOUNDS_EXCEPTION, THROW_CACHED_CLASS_CAST_EXCEPTION, THROW_CACHED_ARRAY_STORE_EXCEPTION,
|
151 | 166 | THROW_CACHED_INCOMPATIBLE_CLASS_CHANGE_ERROR,
|
152 | 167 | THROW_CACHED_ILLEGAL_ARGUMENT_EXCEPTION, THROW_CACHED_NEGATIVE_ARRAY_SIZE_EXCEPTION, THROW_CACHED_ARITHMETIC_EXCEPTION, THROW_CACHED_ASSERTION_ERROR,
|
| 168 | + CREATE_OPT_NULL_POINTER_EXCEPTION, CREATE_OPT_OUT_OF_BOUNDS_EXCEPTION, CREATE_OPT_CLASS_CAST_EXCEPTION, CREATE_OPT_ARRAY_STORE_EXCEPTION, |
| 169 | + CREATE_OPT_INCOMPATIBLE_CLASS_CHANGE_ERROR, |
| 170 | + THROW_OPT_NULL_POINTER_EXCEPTION, THROW_OPT_OUT_OF_BOUNDS_EXCEPTION, THROW_OPT_CLASS_CAST_EXCEPTION, THROW_OPT_ARRAY_STORE_EXCEPTION, THROW_OPT_INCOMPATIBLE_CLASS_CHANGE_ERROR |
153 | 171 | };
|
154 | 172 |
|
155 | 173 | private static final FastThreadLocalInt implicitExceptionsAreFatal = FastThreadLocalFactory.createInt("ImplicitExceptions.implicitExceptionsAreFatal");
|
@@ -406,6 +424,79 @@ private static void throwNewAssertionErrorObject(Object detailMessage) {
|
406 | 424 | throw new AssertionError(detailMessage);
|
407 | 425 | }
|
408 | 426 |
|
| 427 | + private static final String IMPRECISE_STACK_MSG = "Stack trace is imprecise, the top frames are missing and/or have wrong line numbers. To get precise stack traces, build the image with option " + |
| 428 | + SubstrateOptionsParser.commandArgument(SubstrateOptions.ReduceImplicitExceptionStackTraceInformation, "-"); |
| 429 | + |
| 430 | + /** Foreign call: {@link #CREATE_OPT_NULL_POINTER_EXCEPTION}. */ |
| 431 | + @SubstrateForeignCallTarget(stubCallingConvention = true) |
| 432 | + private static NullPointerException createOptNullPointerException() { |
| 433 | + vmErrorIfImplicitExceptionsAreFatal(false); |
| 434 | + return new NullPointerException(IMPRECISE_STACK_MSG); |
| 435 | + } |
| 436 | + |
| 437 | + /** Foreign call: {@link #CREATE_OPT_OUT_OF_BOUNDS_EXCEPTION}. */ |
| 438 | + @SubstrateForeignCallTarget(stubCallingConvention = true) |
| 439 | + private static ArrayIndexOutOfBoundsException createOptOutOfBoundsException() { |
| 440 | + vmErrorIfImplicitExceptionsAreFatal(false); |
| 441 | + return new ArrayIndexOutOfBoundsException(IMPRECISE_STACK_MSG); |
| 442 | + } |
| 443 | + |
| 444 | + /** Foreign call: {@link #CREATE_OPT_CLASS_CAST_EXCEPTION}. */ |
| 445 | + @SubstrateForeignCallTarget(stubCallingConvention = true) |
| 446 | + private static ClassCastException createOptClassCastException() { |
| 447 | + vmErrorIfImplicitExceptionsAreFatal(false); |
| 448 | + return new ClassCastException(IMPRECISE_STACK_MSG); |
| 449 | + } |
| 450 | + |
| 451 | + /** Foreign call: {@link #CREATE_OPT_ARRAY_STORE_EXCEPTION}. */ |
| 452 | + @SubstrateForeignCallTarget(stubCallingConvention = true) |
| 453 | + private static ArrayStoreException createOptArrayStoreException() { |
| 454 | + vmErrorIfImplicitExceptionsAreFatal(false); |
| 455 | + return new ArrayStoreException(IMPRECISE_STACK_MSG); |
| 456 | + } |
| 457 | + |
| 458 | + /** Foreign call: {@link #CREATE_OPT_INCOMPATIBLE_CLASS_CHANGE_ERROR}. */ |
| 459 | + @SubstrateForeignCallTarget(stubCallingConvention = true) |
| 460 | + private static IncompatibleClassChangeError createOptIncompatibleClassChangeError() { |
| 461 | + vmErrorIfImplicitExceptionsAreFatal(false); |
| 462 | + return new IncompatibleClassChangeError(IMPRECISE_STACK_MSG); |
| 463 | + } |
| 464 | + |
| 465 | + /** Foreign call: {@link #THROW_OPT_NULL_POINTER_EXCEPTION}. */ |
| 466 | + @SubstrateForeignCallTarget(stubCallingConvention = true) |
| 467 | + private static void throwOptNullPointerException() { |
| 468 | + vmErrorIfImplicitExceptionsAreFatal(false); |
| 469 | + throw new NullPointerException(IMPRECISE_STACK_MSG); |
| 470 | + } |
| 471 | + |
| 472 | + /** Foreign call: {@link #THROW_OPT_OUT_OF_BOUNDS_EXCEPTION}. */ |
| 473 | + @SubstrateForeignCallTarget(stubCallingConvention = true) |
| 474 | + private static void throwOptOutOfBoundsException() { |
| 475 | + vmErrorIfImplicitExceptionsAreFatal(false); |
| 476 | + throw new ArrayIndexOutOfBoundsException(IMPRECISE_STACK_MSG); |
| 477 | + } |
| 478 | + |
| 479 | + /** Foreign call: {@link #THROW_OPT_CLASS_CAST_EXCEPTION}. */ |
| 480 | + @SubstrateForeignCallTarget(stubCallingConvention = true) |
| 481 | + private static void throwOptClassCastException() { |
| 482 | + vmErrorIfImplicitExceptionsAreFatal(false); |
| 483 | + throw new ClassCastException(IMPRECISE_STACK_MSG); |
| 484 | + } |
| 485 | + |
| 486 | + /** Foreign call: {@link #THROW_OPT_ARRAY_STORE_EXCEPTION}. */ |
| 487 | + @SubstrateForeignCallTarget(stubCallingConvention = true) |
| 488 | + private static void throwOptArrayStoreException() { |
| 489 | + vmErrorIfImplicitExceptionsAreFatal(false); |
| 490 | + throw new ArrayStoreException(IMPRECISE_STACK_MSG); |
| 491 | + } |
| 492 | + |
| 493 | + /** Foreign call: {@link #THROW_OPT_INCOMPATIBLE_CLASS_CHANGE_ERROR}. */ |
| 494 | + @SubstrateForeignCallTarget(stubCallingConvention = true) |
| 495 | + private static void throwOptIncompatibleClassChangeError() { |
| 496 | + vmErrorIfImplicitExceptionsAreFatal(false); |
| 497 | + throw new IncompatibleClassChangeError(IMPRECISE_STACK_MSG); |
| 498 | + } |
| 499 | + |
409 | 500 | /** Foreign call: {@link #GET_CACHED_NULL_POINTER_EXCEPTION}. */
|
410 | 501 | @RestrictHeapAccess(access = RestrictHeapAccess.Access.NO_ALLOCATION, reason = "Called to report an implicit exception in code that must not allocate.")
|
411 | 502 | @SubstrateForeignCallTarget(stubCallingConvention = true)
|
|
0 commit comments