< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/CreateExceptionStub.java

Print this page




  28 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.REEXECUTABLE;
  29 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.DESTROYS_REGISTERS;
  30 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.SAFEPOINT;
  31 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.clearPendingException;
  32 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.registerAsWord;
  33 import static jdk.internal.vm.compiler.word.LocationIdentity.any;
  34 
  35 import org.graalvm.compiler.api.replacements.Fold;
  36 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
  37 import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
  38 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
  39 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
  40 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
  41 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProviderImpl;
  42 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
  43 import org.graalvm.compiler.hotspot.nodes.StubForeignCallNode;
  44 import org.graalvm.compiler.hotspot.word.KlassPointer;
  45 import org.graalvm.compiler.options.OptionValues;
  46 import org.graalvm.compiler.replacements.nodes.CStringConstant;
  47 import org.graalvm.compiler.word.Word;

  48 
  49 import jdk.vm.ci.code.Register;
  50 
  51 /**
  52  * Base class for stubs that create a runtime exception.
  53  */
  54 public class CreateExceptionStub extends SnippetStub {
  55 
  56     protected CreateExceptionStub(String snippetMethodName, OptionValues options, HotSpotProviders providers, HotSpotForeignCallLinkage linkage) {
  57         super(snippetMethodName, options, providers, linkage);
  58     }
  59 
  60     @Fold
  61     static String getInternalClassName(Class<?> cls) {
  62         return cls.getName().replace('.', '/');
  63     }
  64 
  65     private static Word classAsCString(Class<?> cls) {
  66         return CStringConstant.cstring(getInternalClassName(cls));
  67     }
  68 
  69     protected static Object createException(Register threadRegister, Class<? extends Throwable> exception) {
  70         Word message = null;
  71         return createException(threadRegister, exception, message);
  72     }
  73 
  74     protected static Object createException(Register threadRegister, Class<? extends Throwable> exception, Word message) {
  75         Word thread = registerAsWord(threadRegister);
  76         throwAndPostJvmtiException(THROW_AND_POST_JVMTI_EXCEPTION, thread, classAsCString(exception), message);
  77         return clearPendingException(thread);
  78     }
  79 
  80     protected static Object createException(Register threadRegister, Class<? extends Throwable> exception, KlassPointer klass) {
  81         Word thread = registerAsWord(threadRegister);
  82         throwKlassExternalNameException(THROW_KLASS_EXTERNAL_NAME_EXCEPTION, thread, classAsCString(exception), klass);
  83         return clearPendingException(thread);
  84     }
  85 
  86     protected static Object createException(Register threadRegister, Class<? extends Throwable> exception, KlassPointer objKlass, KlassPointer targetKlass) {
  87         Word thread = registerAsWord(threadRegister);
  88         throwClassCastException(THROW_CLASS_CAST_EXCEPTION, thread, classAsCString(exception), objKlass, targetKlass);
  89         return clearPendingException(thread);
  90     }




  28 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.REEXECUTABLE;
  29 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.DESTROYS_REGISTERS;
  30 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.SAFEPOINT;
  31 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.clearPendingException;
  32 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.registerAsWord;
  33 import static jdk.internal.vm.compiler.word.LocationIdentity.any;
  34 
  35 import org.graalvm.compiler.api.replacements.Fold;
  36 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
  37 import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
  38 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
  39 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
  40 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
  41 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProviderImpl;
  42 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
  43 import org.graalvm.compiler.hotspot.nodes.StubForeignCallNode;
  44 import org.graalvm.compiler.hotspot.word.KlassPointer;
  45 import org.graalvm.compiler.options.OptionValues;
  46 import org.graalvm.compiler.replacements.nodes.CStringConstant;
  47 import org.graalvm.compiler.word.Word;
  48 import jdk.internal.vm.compiler.word.WordFactory;
  49 
  50 import jdk.vm.ci.code.Register;
  51 
  52 /**
  53  * Base class for stubs that create a runtime exception.
  54  */
  55 public class CreateExceptionStub extends SnippetStub {
  56 
  57     protected CreateExceptionStub(String snippetMethodName, OptionValues options, HotSpotProviders providers, HotSpotForeignCallLinkage linkage) {
  58         super(snippetMethodName, options, providers, linkage);
  59     }
  60 
  61     @Fold
  62     static String getInternalClassName(Class<?> cls) {
  63         return cls.getName().replace('.', '/');
  64     }
  65 
  66     private static Word classAsCString(Class<?> cls) {
  67         return CStringConstant.cstring(getInternalClassName(cls));
  68     }
  69 
  70     protected static Object createException(Register threadRegister, Class<? extends Throwable> exception) {
  71         Word message = WordFactory.zero();
  72         return createException(threadRegister, exception, message);
  73     }
  74 
  75     protected static Object createException(Register threadRegister, Class<? extends Throwable> exception, Word message) {
  76         Word thread = registerAsWord(threadRegister);
  77         throwAndPostJvmtiException(THROW_AND_POST_JVMTI_EXCEPTION, thread, classAsCString(exception), message);
  78         return clearPendingException(thread);
  79     }
  80 
  81     protected static Object createException(Register threadRegister, Class<? extends Throwable> exception, KlassPointer klass) {
  82         Word thread = registerAsWord(threadRegister);
  83         throwKlassExternalNameException(THROW_KLASS_EXTERNAL_NAME_EXCEPTION, thread, classAsCString(exception), klass);
  84         return clearPendingException(thread);
  85     }
  86 
  87     protected static Object createException(Register threadRegister, Class<? extends Throwable> exception, KlassPointer objKlass, KlassPointer targetKlass) {
  88         Word thread = registerAsWord(threadRegister);
  89         throwClassCastException(THROW_CLASS_CAST_EXCEPTION, thread, classAsCString(exception), objKlass, targetKlass);
  90         return clearPendingException(thread);
  91     }


< prev index next >