22 */ 23 package org.graalvm.compiler.hotspot.replacements; 24 25 import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfig.INJECTED_VMCONFIG; 26 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.ARRAY_KLASS_COMPONENT_MIRROR; 27 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_ACCESS_FLAGS_LOCATION; 28 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_MODIFIER_FLAGS_LOCATION; 29 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_SUPER_KLASS_LOCATION; 30 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.arrayKlassComponentMirrorOffset; 31 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.klassAccessFlagsOffset; 32 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.klassIsArray; 33 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.klassModifierFlagsOffset; 34 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.klassSuperKlassOffset; 35 36 import java.lang.reflect.Modifier; 37 38 import org.graalvm.compiler.api.replacements.ClassSubstitution; 39 import org.graalvm.compiler.api.replacements.MethodSubstitution; 40 import org.graalvm.compiler.hotspot.word.KlassPointer; 41 import org.graalvm.compiler.nodes.PiNode; 42 43 // JaCoCo Exclude 44 45 /** 46 * Substitutions for {@link java.lang.Class} methods. 47 */ 48 @ClassSubstitution(Class.class) 49 public class HotSpotClassSubstitutions { 50 51 @MethodSubstitution(isStatic = false) 52 public static int getModifiers(final Class<?> thisObj) { 53 KlassPointer klass = ClassGetHubNode.readClass(thisObj); 54 if (klass.isNull()) { 55 // Class for primitive type 56 return Modifier.ABSTRACT | Modifier.FINAL | Modifier.PUBLIC; 57 } else { 58 return klass.readInt(klassModifierFlagsOffset(INJECTED_VMCONFIG), KLASS_MODIFIER_FLAGS_LOCATION); 59 } 60 } 61 62 @MethodSubstitution(isStatic = false) 63 public static boolean isInterface(final Class<?> thisObj) { 64 KlassPointer klass = ClassGetHubNode.readClass(thisObj); 65 if (klass.isNull()) { 66 // Class for primitive type 67 return false; 68 } else { 69 int accessFlags = klass.readInt(klassAccessFlagsOffset(INJECTED_VMCONFIG), KLASS_ACCESS_FLAGS_LOCATION); 70 return (accessFlags & Modifier.INTERFACE) != 0; 71 } 72 } 73 74 @MethodSubstitution(isStatic = false) 75 public static boolean isArray(final Class<?> thisObj) { 76 KlassPointer klass = ClassGetHubNode.readClass(thisObj); 77 if (klass.isNull()) { 78 // Class for primitive type 79 return false; 80 } else { 81 return klassIsArray(klass); 82 } 83 } 84 85 @MethodSubstitution(isStatic = false) 86 public static boolean isPrimitive(final Class<?> thisObj) { 87 KlassPointer klass = ClassGetHubNode.readClass(thisObj); 88 return klass.isNull(); 89 } 90 91 @MethodSubstitution(isStatic = false) 92 public static Class<?> getSuperclass(final Class<?> thisObj) { 93 KlassPointer klass = ClassGetHubNode.readClass(thisObj); 94 if (!klass.isNull()) { 95 int accessFlags = klass.readInt(klassAccessFlagsOffset(INJECTED_VMCONFIG), KLASS_ACCESS_FLAGS_LOCATION); 96 if ((accessFlags & Modifier.INTERFACE) == 0) { 97 if (klassIsArray(klass)) { 98 return Object.class; 99 } else { 100 KlassPointer superKlass = klass.readKlassPointer(klassSuperKlassOffset(INJECTED_VMCONFIG), KLASS_SUPER_KLASS_LOCATION); 101 if (superKlass.isNull()) { 102 return null; 103 } else { 104 return readJavaMirror(superKlass); 105 } 106 } 107 } 108 } else { 109 // Class for primitive type 110 } 111 return null; 112 } 113 114 public static Class<?> readJavaMirror(KlassPointer klass) { 115 return PiNode.asNonNullClass(HubGetClassNode.readClass(klass)); 116 } 117 118 @MethodSubstitution(isStatic = false) 119 public static Class<?> getComponentType(final Class<?> thisObj) { 120 KlassPointer klass = ClassGetHubNode.readClass(thisObj); 121 if (!klass.isNull()) { 122 if (klassIsArray(klass)) { 123 return PiNode.asNonNullClass(klass.readObject(arrayKlassComponentMirrorOffset(INJECTED_VMCONFIG), ARRAY_KLASS_COMPONENT_MIRROR)); 124 } 125 } else { 126 // Class for primitive type 127 } 128 return null; 129 } 130 } | 22 */ 23 package org.graalvm.compiler.hotspot.replacements; 24 25 import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfig.INJECTED_VMCONFIG; 26 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.ARRAY_KLASS_COMPONENT_MIRROR; 27 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_ACCESS_FLAGS_LOCATION; 28 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_MODIFIER_FLAGS_LOCATION; 29 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_SUPER_KLASS_LOCATION; 30 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.arrayKlassComponentMirrorOffset; 31 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.klassAccessFlagsOffset; 32 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.klassIsArray; 33 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.klassModifierFlagsOffset; 34 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.klassSuperKlassOffset; 35 36 import java.lang.reflect.Modifier; 37 38 import org.graalvm.compiler.api.replacements.ClassSubstitution; 39 import org.graalvm.compiler.api.replacements.MethodSubstitution; 40 import org.graalvm.compiler.hotspot.word.KlassPointer; 41 import org.graalvm.compiler.nodes.PiNode; 42 import org.graalvm.compiler.nodes.SnippetAnchorNode; 43 44 // JaCoCo Exclude 45 46 /** 47 * Substitutions for {@link java.lang.Class} methods. 48 */ 49 @ClassSubstitution(Class.class) 50 public class HotSpotClassSubstitutions { 51 52 @MethodSubstitution(isStatic = false) 53 public static int getModifiers(final Class<?> thisObj) { 54 KlassPointer klass = ClassGetHubNode.readClass(thisObj); 55 if (klass.isNull()) { 56 // Class for primitive type 57 return Modifier.ABSTRACT | Modifier.FINAL | Modifier.PUBLIC; 58 } else { 59 return klass.readInt(klassModifierFlagsOffset(INJECTED_VMCONFIG), KLASS_MODIFIER_FLAGS_LOCATION); 60 } 61 } 62 63 @MethodSubstitution(isStatic = false) 64 public static boolean isInterface(final Class<?> thisObj) { 65 KlassPointer klass = ClassGetHubNode.readClass(thisObj); 66 if (klass.isNull()) { 67 // Class for primitive type 68 return false; 69 } else { 70 int accessFlags = klass.readInt(klassAccessFlagsOffset(INJECTED_VMCONFIG), KLASS_ACCESS_FLAGS_LOCATION); 71 return (accessFlags & Modifier.INTERFACE) != 0; 72 } 73 } 74 75 @MethodSubstitution(isStatic = false) 76 public static boolean isArray(final Class<?> thisObj) { 77 KlassPointer klass = ClassGetHubNode.readClass(thisObj); 78 if (klass.isNull()) { 79 // Class for primitive type 80 return false; 81 } else { 82 KlassPointer klassNonNull = ClassGetHubNode.piCastNonNull(klass, SnippetAnchorNode.anchor()); 83 return klassIsArray(klassNonNull); 84 } 85 } 86 87 @MethodSubstitution(isStatic = false) 88 public static boolean isPrimitive(final Class<?> thisObj) { 89 KlassPointer klass = ClassGetHubNode.readClass(thisObj); 90 return klass.isNull(); 91 } 92 93 @MethodSubstitution(isStatic = false) 94 public static Class<?> getSuperclass(final Class<?> thisObj) { 95 KlassPointer klass = ClassGetHubNode.readClass(thisObj); 96 if (!klass.isNull()) { 97 KlassPointer klassNonNull = ClassGetHubNode.piCastNonNull(klass, SnippetAnchorNode.anchor()); 98 int accessFlags = klassNonNull.readInt(klassAccessFlagsOffset(INJECTED_VMCONFIG), KLASS_ACCESS_FLAGS_LOCATION); 99 if ((accessFlags & Modifier.INTERFACE) == 0) { 100 if (klassIsArray(klassNonNull)) { 101 return Object.class; 102 } else { 103 KlassPointer superKlass = klassNonNull.readKlassPointer(klassSuperKlassOffset(INJECTED_VMCONFIG), KLASS_SUPER_KLASS_LOCATION); 104 if (superKlass.isNull()) { 105 return null; 106 } else { 107 KlassPointer superKlassNonNull = ClassGetHubNode.piCastNonNull(superKlass, SnippetAnchorNode.anchor()); 108 return HubGetClassNode.readClass(superKlassNonNull); 109 } 110 } 111 } 112 } else { 113 // Class for primitive type 114 } 115 return null; 116 } 117 118 @MethodSubstitution(isStatic = false) 119 public static Class<?> getComponentType(final Class<?> thisObj) { 120 KlassPointer klass = ClassGetHubNode.readClass(thisObj); 121 if (!klass.isNull()) { 122 KlassPointer klassNonNull = ClassGetHubNode.piCastNonNull(klass, SnippetAnchorNode.anchor()); 123 if (klassIsArray(klassNonNull)) { 124 return PiNode.asNonNullClass(klassNonNull.readObject(arrayKlassComponentMirrorOffset(INJECTED_VMCONFIG), ARRAY_KLASS_COMPONENT_MIRROR)); 125 } 126 } else { 127 // Class for primitive type 128 } 129 return null; 130 } 131 } |