diff --git a/compiler/src/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/GraalDirectiveIntrinsificationTest.java b/compiler/src/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/GraalDirectiveIntrinsificationTest.java index aeb9349b8071..c9bd795fc32b 100644 --- a/compiler/src/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/GraalDirectiveIntrinsificationTest.java +++ b/compiler/src/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/GraalDirectiveIntrinsificationTest.java @@ -57,7 +57,7 @@ public void ensureAllGraalDirectivesIntrinsified() { } ResolvedJavaType directives = getMetaAccess().lookupJavaType(GraalDirectives.class); - for (ResolvedJavaMethod method : directives.getDeclaredMethods()) { + for (ResolvedJavaMethod method : directives.getDeclaredMethods(false)) { if (method.isStatic()) { // A method's descriptor includes the return type, which we must drop so we can // compare to the binding strings. diff --git a/compiler/src/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CheckGraalInvariants.java b/compiler/src/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CheckGraalInvariants.java index 91746c10c322..6efbdb705566 100644 --- a/compiler/src/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CheckGraalInvariants.java +++ b/compiler/src/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CheckGraalInvariants.java @@ -376,7 +376,7 @@ public static void runTest(InvariantsTool tool) { if (errors.isEmpty()) { // Order outer classes before the inner classes classNames.sort((String a, String b) -> a.compareTo(b)); - List> classes = loadClasses(tool, classNames); + List> classes = loadClasses(tool, metaAccess, classNames); for (Class c : classes) { String className = c.getName(); executor.execute(() -> { @@ -390,8 +390,8 @@ public static void runTest(InvariantsTool tool) { ResolvedJavaType type = metaAccess.lookupJavaType(c); List methods = new ArrayList<>(); try { - methods.addAll(Arrays.asList(type.getDeclaredMethods())); - methods.addAll(Arrays.asList(type.getDeclaredConstructors())); + methods.addAll(Arrays.asList(type.getDeclaredMethods(false))); + methods.addAll(Arrays.asList(type.getDeclaredConstructors(false))); } catch (Throwable e) { errors.add(String.format("Error while checking %s:%n%s", className, printStackTraceToString(e))); } @@ -542,7 +542,7 @@ private static boolean isONNX(String className) { return className.contains("ai.onnxruntime"); } - private static List> loadClasses(InvariantsTool tool, List classNames) { + private static List> loadClasses(InvariantsTool tool, MetaAccessProvider metaAccess, List classNames) { List> classes = new ArrayList<>(classNames.size()); for (String className : classNames) { if (!tool.shouldLoadClass(className)) { @@ -550,6 +550,14 @@ private static List> loadClasses(InvariantsTool tool, List clas } try { Class c = Class.forName(className, false, CheckGraalInvariants.class.getClassLoader()); + + /* + * Ensure all types are linked eagerly, so that we can access the bytecode of all + * methods. + */ + ResolvedJavaType type = metaAccess.lookupJavaType(c); + type.link(); + if (Node.class.isAssignableFrom(c)) { /* * Eagerly initialize Node classes because the VerifyNodeCosts checker will diff --git a/compiler/src/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifySnippetProbabilities.java b/compiler/src/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifySnippetProbabilities.java index 4ba374149edd..ff84e4bb8596 100644 --- a/compiler/src/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifySnippetProbabilities.java +++ b/compiler/src/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifySnippetProbabilities.java @@ -82,7 +82,7 @@ protected void verify(StructuredGraph graph, CoreProviders context) { Class receiverClass = (Class) KNOWN_PROFILE_INTRINSICS[i]; String methodName = (String) KNOWN_PROFILE_INTRINSICS[i + 1]; ResolvedJavaType type = context.getMetaAccess().lookupJavaType(receiverClass); - for (ResolvedJavaMethod typeMethod : type.getDeclaredMethods()) { + for (ResolvedJavaMethod typeMethod : type.getDeclaredMethods(false)) { if (typeMethod.getName().contains(methodName)) { knownIntrinsicMethods.add(typeMethod); } diff --git a/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/EncodedSnippets.java b/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/EncodedSnippets.java index 17979154ef6a..91af4bc9a682 100644 --- a/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/EncodedSnippets.java +++ b/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/EncodedSnippets.java @@ -520,7 +520,7 @@ public ResolvedJavaMethod resolve(ResolvedJavaType accessingClass) { if (resolvedType == null) { throw new NoClassDefFoundError("Can't resolve " + type.getName() + " with " + accessingClass.getName()); } - for (ResolvedJavaMethod method : methodName.equals("") ? resolvedType.getDeclaredConstructors() : resolvedType.getDeclaredMethods()) { + for (ResolvedJavaMethod method : methodName.equals("") ? resolvedType.getDeclaredConstructors(false) : resolvedType.getDeclaredMethods(false)) { if (method.getName().equals(methodName) && method.getSignature().toMethodDescriptor().equals(signature)) { return method; } diff --git a/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/SnippetResolvedJavaType.java b/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/SnippetResolvedJavaType.java index e9a656760d90..e6b62827715f 100644 --- a/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/SnippetResolvedJavaType.java +++ b/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/SnippetResolvedJavaType.java @@ -31,6 +31,8 @@ import java.util.List; import java.util.Objects; +import org.graalvm.compiler.debug.GraalError; + import jdk.vm.ci.meta.Assumptions; import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; @@ -144,6 +146,10 @@ public boolean isInitialized() { public void initialize() { } + @Override + public void link() { + } + @Override public boolean isLinked() { throw new UnsupportedOperationException(); @@ -294,11 +300,22 @@ public ResolvedJavaType getEnclosingType() { @Override public ResolvedJavaMethod[] getDeclaredConstructors() { + return getDeclaredConstructors(true); + } + + @Override + public ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) { throw new UnsupportedOperationException(); } @Override public ResolvedJavaMethod[] getDeclaredMethods() { + return getDeclaredMethods(true); + } + + @Override + public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) { + GraalError.guarantee(forceLink == false, "only use getDeclaredMethods without forcing to link, because linking can throw LinkageError"); if (methods == null) { return new ResolvedJavaMethod[0]; } diff --git a/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/AbstractForeignCallStub.java b/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/AbstractForeignCallStub.java index ef9a51535ccc..c75e1ef7c790 100644 --- a/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/AbstractForeignCallStub.java +++ b/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/AbstractForeignCallStub.java @@ -275,7 +275,7 @@ protected final StructuredGraph getGraph(DebugContext debug, CompilationIdentifi private ResolvedJavaMethod getGraphMethod() { ResolvedJavaMethod thisMethod = null; MetaAccessProvider metaAccess = providers.getMetaAccess(); - for (ResolvedJavaMethod method : metaAccess.lookupJavaType(AbstractForeignCallStub.class).getDeclaredMethods()) { + for (ResolvedJavaMethod method : metaAccess.lookupJavaType(AbstractForeignCallStub.class).getDeclaredMethods(false)) { if (method.getName().equals("getGraph")) { if (thisMethod == null) { thisMethod = method; diff --git a/compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/LambdaUtils.java b/compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/LambdaUtils.java index d0a83166b4cf..4d4dfe6a1938 100644 --- a/compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/LambdaUtils.java +++ b/compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/LambdaUtils.java @@ -108,7 +108,7 @@ private LambdaUtils() { @SuppressWarnings("try") public static String findStableLambdaName(ClassInitializationPlugin cip, Providers providers, ResolvedJavaType lambdaType, OptionValues options, DebugContext debug, Object ctx) throws RuntimeException { - ResolvedJavaMethod[] lambdaProxyMethods = Arrays.stream(lambdaType.getDeclaredMethods()).filter(m -> !m.isBridge() && m.isPublic()).toArray(ResolvedJavaMethod[]::new); + ResolvedJavaMethod[] lambdaProxyMethods = Arrays.stream(lambdaType.getDeclaredMethods(false)).filter(m -> !m.isBridge() && m.isPublic()).toArray(ResolvedJavaMethod[]::new); /* * Take only the first method to build a graph, because the graph for all other methods will * be the same. @@ -125,7 +125,7 @@ public static String findStableLambdaName(ClassInitializationPlugin cip, Provide if (invokedMethods.isEmpty()) { StringBuilder sb = new StringBuilder(); sb.append("Lambda without a target invoke: ").append(lambdaType.toClassName()); - for (ResolvedJavaMethod m : lambdaType.getDeclaredMethods()) { + for (ResolvedJavaMethod m : lambdaType.getDeclaredMethods(false)) { sb.append("\n Method: ").append(m); } throw new JVMCIError(sb.toString()); diff --git a/compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugins.java b/compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugins.java index 50a44ec414c8..5d38316493ba 100644 --- a/compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugins.java +++ b/compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugins.java @@ -1168,7 +1168,7 @@ public static Method resolveMethod(Class declaringClass, InvocationPlugin plu * {@link ResolvedJavaType} and {@link ResolvedJavaMethod}. */ public static ResolvedJavaMethod resolveJavaMethod(ResolvedJavaType declaringClass, InvocationPlugin plugin) { - ResolvedJavaMethod[] methods = declaringClass.getDeclaredMethods(); + ResolvedJavaMethod[] methods = declaringClass.getDeclaredMethods(false); if (plugin.name.equals("")) { for (ResolvedJavaMethod m : methods) { if (m.getName().equals("") && m.getSignature().toMethodDescriptor().startsWith(plugin.argumentsDescriptor)) { diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/GraphKit.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/GraphKit.java index b9b7253b5581..f729403c7421 100644 --- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/GraphKit.java +++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/GraphKit.java @@ -213,7 +213,7 @@ public InvokeNode createInvoke(Class declaringClass, String name, InvokeKind public ResolvedJavaMethod findMethod(Class declaringClass, String name, boolean isStatic) { ResolvedJavaType type = getMetaAccess().lookupJavaType(declaringClass); ResolvedJavaMethod method = null; - for (ResolvedJavaMethod m : type.getDeclaredMethods()) { + for (ResolvedJavaMethod m : type.getDeclaredMethods(false)) { if (Modifier.isStatic(m.getModifiers()) == isStatic && m.getName().equals(name)) { assert method == null : "found more than one method in " + declaringClass + " named " + name; method = m; diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetTemplate.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetTemplate.java index bd5208c640ed..27fa20e0b62d 100644 --- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetTemplate.java +++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetTemplate.java @@ -873,8 +873,9 @@ protected AbstractTemplates(OptionValues options, Providers providers) { public static ResolvedJavaMethod findMethod(MetaAccessProvider metaAccess, Class declaringClass, String methodName) { ResolvedJavaType type = metaAccess.lookupJavaType(declaringClass); + type.link(); ResolvedJavaMethod result = null; - for (ResolvedJavaMethod m : type.getDeclaredMethods()) { + for (ResolvedJavaMethod m : type.getDeclaredMethods(false)) { if (m.getName().equals(methodName)) { if (!Assertions.assertionsEnabled()) { return m; diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java index 86e79fe1675e..d2778595a236 100644 --- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java +++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java @@ -233,14 +233,14 @@ ResolvedJavaMethod lookup(ResolvedJavaType type, String name, String descriptor) if (!name.equals("")) { if (methods == null) { // Racy initialization is safe since `methods` is volatile - methods = createMethodMap(type.getDeclaredMethods()); + methods = createMethodMap(type.getDeclaredMethods(false)); } return methods.get(key); } else { if (constructors == null) { // Racy initialization is safe since instanceFields is volatile - constructors = createMethodMap(type.getDeclaredConstructors()); + constructors = createMethodMap(type.getDeclaredConstructors(false)); } return constructors.get(key); } diff --git a/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/AbstractKnownTruffleTypes.java b/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/AbstractKnownTruffleTypes.java index fbd27a117731..6ce0ecae5a6d 100644 --- a/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/AbstractKnownTruffleTypes.java +++ b/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/AbstractKnownTruffleTypes.java @@ -167,7 +167,7 @@ private TypeCache createTypeCache(ResolvedJavaType declaringClass) { GraalError.guarantee(fields.size() == entries.length, "duplicate field name"); Map> methods = new HashMap<>(); - for (ResolvedJavaMethod method : declaringClass.getDeclaredMethods()) { + for (ResolvedJavaMethod method : declaringClass.getDeclaredMethods(false)) { methods.computeIfAbsent(method.getName(), (v) -> new ArrayList<>(2)).add(method); } return new TypeCache(declaringClass, instanceFields, fields, methods); diff --git a/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/PartialEvaluator.java b/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/PartialEvaluator.java index e1b82f26470b..b6b161d9a9ed 100644 --- a/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/PartialEvaluator.java +++ b/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/PartialEvaluator.java @@ -462,7 +462,7 @@ protected void appendParsingNodePlugins(Plugins plugins) { if (JavaVersionUtil.JAVA_SPEC >= 16 && JavaVersionUtil.JAVA_SPEC < 19) { ResolvedJavaType memorySegmentProxyType = TruffleCompilerEnvironment.get().runtime().resolveType(config.lastTier().providers().getMetaAccess(), "jdk.internal.access.foreign.MemorySegmentProxy"); - for (ResolvedJavaMethod m : memorySegmentProxyType.getDeclaredMethods()) { + for (ResolvedJavaMethod m : memorySegmentProxyType.getDeclaredMethods(false)) { if (m.getName().equals("scope")) { appendMemorySegmentScopePlugin(plugins, m); } diff --git a/compiler/src/org.graalvm.compiler.truffle.runtime.hotspot/src/org/graalvm/compiler/truffle/runtime/hotspot/AbstractHotSpotTruffleRuntime.java b/compiler/src/org.graalvm.compiler.truffle.runtime.hotspot/src/org/graalvm/compiler/truffle/runtime/hotspot/AbstractHotSpotTruffleRuntime.java index d8c81accc68d..94c789de4824 100644 --- a/compiler/src/org.graalvm.compiler.truffle.runtime.hotspot/src/org/graalvm/compiler/truffle/runtime/hotspot/AbstractHotSpotTruffleRuntime.java +++ b/compiler/src/org.graalvm.compiler.truffle.runtime.hotspot/src/org/graalvm/compiler/truffle/runtime/hotspot/AbstractHotSpotTruffleRuntime.java @@ -526,7 +526,7 @@ public boolean bypassedReservedOop(boolean waitForInit) { private static void installCallBoundaryMethods(HotSpotTruffleCompiler compiler) { ResolvedJavaType type = getMetaAccess().lookupJavaType(OptimizedCallTarget.class); - for (ResolvedJavaMethod method : type.getDeclaredMethods()) { + for (ResolvedJavaMethod method : type.getDeclaredMethods(false)) { if (method.getAnnotation(TruffleCallBoundary.class) != null) { if (compiler != null) { compiler.installTruffleCallBoundaryMethod(method); @@ -539,7 +539,7 @@ private static void installCallBoundaryMethods(HotSpotTruffleCompiler compiler) private static void installReservedOopMethods(HotSpotTruffleCompiler compiler) { ResolvedJavaType local = getMetaAccess().lookupJavaType(HotSpotFastThreadLocal.class); - for (ResolvedJavaMethod method : local.getDeclaredMethods()) { + for (ResolvedJavaMethod method : local.getDeclaredMethods(false)) { String name = method.getName(); switch (name) { case "set": diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java index 986cc4e64c82..d4358f3a19c2 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java @@ -1210,18 +1210,30 @@ public AnalysisType getEnclosingType() { } @Override - public AnalysisMethod[] getDeclaredConstructors() { - return universe.lookup(wrapped.getDeclaredConstructors()); + public ResolvedJavaMethod[] getDeclaredMethods() { + return getDeclaredMethods(true); } @Override - public AnalysisMethod[] getDeclaredMethods() { - return universe.lookup(wrapped.getDeclaredMethods()); + public AnalysisMethod[] getDeclaredMethods(boolean forceLink) { + GraalError.guarantee(forceLink == false, "only use getDeclaredMethods without forcing to link, because linking can throw LinkageError"); + return universe.lookup(wrapped.getDeclaredMethods(forceLink)); + } + + @Override + public ResolvedJavaMethod[] getDeclaredConstructors() { + return getDeclaredConstructors(true); + } + + @Override + public AnalysisMethod[] getDeclaredConstructors(boolean forceLink) { + GraalError.guarantee(forceLink == false, "only use getDeclaredConstructors without forcing to link, because linking can throw LinkageError"); + return universe.lookup(wrapped.getDeclaredConstructors(forceLink)); } @Override public AnalysisMethod findMethod(String name, Signature signature) { - for (AnalysisMethod method : getDeclaredMethods()) { + for (AnalysisMethod method : getDeclaredMethods(false)) { if (method.getName().equals(name) && method.getSignature().equals(signature)) { return method; } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/IsolateEnterStub.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/IsolateEnterStub.java index bf46acfbfb49..1a7055b1ef4a 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/IsolateEnterStub.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/IsolateEnterStub.java @@ -38,7 +38,7 @@ public final class IsolateEnterStub { public static ConstantPool getConstantPool(MetaAccessProvider metaAccess) { // Generated call wrappers need a valid constant pool, so we provide that of our constructor - return metaAccess.lookupJavaType(IsolateEnterStub.class).getDeclaredConstructors()[0].getConstantPool(); + return metaAccess.lookupJavaType(IsolateEnterStub.class).getDeclaredConstructors(false)[0].getConstantPool(); } private IsolateEnterStub() { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIJavaCallVariantWrapperHolder.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIJavaCallVariantWrapperHolder.java index 63e36a512b5e..150e651615b3 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIJavaCallVariantWrapperHolder.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIJavaCallVariantWrapperHolder.java @@ -37,7 +37,7 @@ public final class JNIJavaCallVariantWrapperHolder { * constructor. */ public static ConstantPool getConstantPool(MetaAccessProvider metaAccess) { - return metaAccess.lookupJavaType(JNIJavaCallVariantWrapperHolder.class).getDeclaredConstructors()[0].getConstantPool(); + return metaAccess.lookupJavaType(JNIJavaCallVariantWrapperHolder.class).getDeclaredConstructors(false)[0].getConstantPool(); } private JNIJavaCallVariantWrapperHolder() { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIJavaCallWrapperHolder.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIJavaCallWrapperHolder.java index 1a9cc0fd41c1..9f39180f2868 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIJavaCallWrapperHolder.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIJavaCallWrapperHolder.java @@ -35,7 +35,7 @@ public final class JNIJavaCallWrapperHolder { public static ConstantPool getConstantPool(MetaAccessProvider metaAccess) { // Each generated call wrapper needs an actual constant pool, so we provide our // private constructor's - return metaAccess.lookupJavaType(JNIJavaCallWrapperHolder.class).getDeclaredConstructors()[0].getConstantPool(); + return metaAccess.lookupJavaType(JNIJavaCallWrapperHolder.class).getDeclaredConstructors(false)[0].getConstantPool(); } private JNIJavaCallWrapperHolder() { diff --git a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateType.java b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateType.java index 52931591daa0..0bc96ccec62f 100644 --- a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateType.java +++ b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateType.java @@ -396,11 +396,21 @@ public ResolvedJavaType getEnclosingType() { @Override public ResolvedJavaMethod[] getDeclaredConstructors() { + return getDeclaredConstructors(true); + } + + @Override + public ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) { throw VMError.intentionallyUnimplemented(); // ExcludeFromJacocoGeneratedReport } @Override public ResolvedJavaMethod[] getDeclaredMethods() { + return getDeclaredMethods(true); + } + + @Override + public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) { throw VMError.intentionallyUnimplemented(); // ExcludeFromJacocoGeneratedReport } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/codegen/CSourceCodeWriter.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/codegen/CSourceCodeWriter.java index 1e194ba53bb5..a84646d27ccb 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/codegen/CSourceCodeWriter.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/codegen/CSourceCodeWriter.java @@ -273,7 +273,7 @@ private static String toCIntegerType(ResolvedJavaType type, boolean isUnsigned) private static boolean isFunctionPointer(MetaAccessProvider metaAccess, ResolvedJavaType type) { boolean functionPointer = metaAccess.lookupJavaType(CFunctionPointer.class).isAssignableFrom(type); return functionPointer && - Arrays.stream(type.getDeclaredMethods()).anyMatch(v -> v.getDeclaredAnnotation(InvokeCFunctionPointer.class) != null); + Arrays.stream(type.getDeclaredMethods(false)).anyMatch(v -> v.getDeclaredAnnotation(InvokeCFunctionPointer.class) != null); } /** diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/info/InfoTreeBuilder.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/info/InfoTreeBuilder.java index acb16605dc86..00ddaf6b6bd9 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/info/InfoTreeBuilder.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/info/InfoTreeBuilder.java @@ -156,7 +156,7 @@ private void createCPointerToInfo(ResolvedJavaType type) { } List accessorInfos = new ArrayList<>(); - for (ResolvedJavaMethod method : type.getDeclaredMethods()) { + for (ResolvedJavaMethod method : type.getDeclaredMethods(false)) { AccessorKind accessorKind = returnsDeclaringClass(method) ? AccessorKind.ADDRESS : getAccessorKind(method); boolean isIndexed = getParameterCount(method) > (accessorKind == AccessorKind.SETTER ? 1 : 0); AccessorInfo accessorInfo = new AccessorInfo(method, accessorKind, isIndexed, false, false); @@ -180,7 +180,7 @@ private void createRawPointerToInfo(ResolvedJavaType type) { } List accessorInfos = new ArrayList<>(); - for (ResolvedJavaMethod method : type.getDeclaredMethods()) { + for (ResolvedJavaMethod method : type.getDeclaredMethods(false)) { AccessorKind accessorKind = returnsDeclaringClass(method) ? AccessorKind.ADDRESS : getAccessorKind(method); boolean isIndexed = getParameterCount(method) > (accessorKind == AccessorKind.SETTER ? 1 : 0); AccessorInfo accessorInfo = new AccessorInfo(method, accessorKind, isIndexed, false, false); @@ -223,7 +223,7 @@ private void createStructInfo(ResolvedJavaType type) { Map> bitfieldAccessorInfos = new TreeMap<>(); List structAccessorInfos = new ArrayList<>(); - for (ResolvedJavaMethod method : type.getDeclaredMethods()) { + for (ResolvedJavaMethod method : type.getDeclaredMethods(false)) { final AccessorInfo accessorInfo; final String fieldName; @@ -298,7 +298,7 @@ private void createRawStructInfo(ResolvedJavaType type) { Map> fieldAccessorInfos = new TreeMap<>(); List structAccessorInfos = new ArrayList<>(); - for (ResolvedJavaMethod method : type.getDeclaredMethods()) { + for (ResolvedJavaMethod method : type.getDeclaredMethods(false)) { final AccessorInfo accessorInfo; final String fieldName; @@ -681,7 +681,7 @@ private void createEnumInfo(ResolvedJavaType type) { createEnumConstantInfo(enumInfo, field); } } - for (ResolvedJavaMethod method : type.getDeclaredMethods()) { + for (ResolvedJavaMethod method : type.getDeclaredMethods(false)) { if (getMethodAnnotation(method, CEnumValue.class) != null) { createEnumValueInfo(enumInfo, method); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CEntryPointCallStubMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CEntryPointCallStubMethod.java index e9d457468549..0197018f512c 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CEntryPointCallStubMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CEntryPointCallStubMethod.java @@ -178,7 +178,7 @@ public StructuredGraph buildGraph(DebugContext debug, ResolvedJavaMethod method, } if (!createdReturnNode) { - ResolvedJavaMethod[] bailoutMethods = providers.getMetaAccess().lookupJavaType(bailoutCustomizer).getDeclaredMethods(); + ResolvedJavaMethod[] bailoutMethods = providers.getMetaAccess().lookupJavaType(bailoutCustomizer).getDeclaredMethods(false); UserError.guarantee(bailoutMethods.length == 1 && bailoutMethods[0].isStatic(), "Prologue bailout customization class must declare exactly one static method: %s -> %s", targetMethod, bailoutCustomizer); @@ -249,7 +249,7 @@ private StructuredGraph buildBuiltinGraph(DebugContext debug, ResolvedJavaMethod final CEntryPoint.Builtin builtin = entryPointData.getBuiltin(); ResolvedJavaMethod builtinCallee = null; - for (ResolvedJavaMethod candidate : metaAccess.lookupJavaType(CEntryPointBuiltins.class).getDeclaredMethods()) { + for (ResolvedJavaMethod candidate : metaAccess.lookupJavaType(CEntryPointBuiltins.class).getDeclaredMethods(false)) { CEntryPointBuiltinImplementation annotation = candidate.getAnnotation(CEntryPointBuiltinImplementation.class); if (annotation != null && annotation.builtin().equals(builtin)) { VMError.guarantee(builtinCallee == null, "More than one candidate for @%s built-in %s", CEntryPoint.class.getSimpleName(), builtin); @@ -369,7 +369,7 @@ private InvokeWithExceptionNode generatePrologue(HostedProviders providers, Subs } if (prologueClass != CEntryPointOptions.AutomaticPrologue.class) { ResolvedJavaType prologue = providers.getMetaAccess().lookupJavaType(prologueClass); - ResolvedJavaMethod[] prologueMethods = prologue.getDeclaredMethods(); + ResolvedJavaMethod[] prologueMethods = prologue.getDeclaredMethods(false); UserError.guarantee(prologueMethods.length == 1 && prologueMethods[0].isStatic(), "Prologue class must declare exactly one static method: %s -> %s", targetMethod, @@ -393,7 +393,7 @@ private InvokeWithExceptionNode generatePrologue(HostedProviders providers, Subs } ValueNode contextValue = args[contextIndex]; prologueClass = CEntryPointSetup.EnterPrologue.class; - ResolvedJavaMethod[] prologueMethods = providers.getMetaAccess().lookupJavaType(prologueClass).getDeclaredMethods(); + ResolvedJavaMethod[] prologueMethods = providers.getMetaAccess().lookupJavaType(prologueClass).getDeclaredMethods(false); assert prologueMethods.length == 1 && prologueMethods[0].isStatic() : "Prologue class must declare exactly one static method"; return generatePrologueOrEpilogueInvoke(kit, prologueMethods[0], contextValue); } @@ -510,7 +510,7 @@ private void generateExceptionHandler(ResolvedJavaMethod method, HostedProviders } else { ResolvedJavaType throwable = providers.getMetaAccess().lookupJavaType(Throwable.class); ResolvedJavaType handler = providers.getMetaAccess().lookupJavaType(entryPointData.getExceptionHandler()); - ResolvedJavaMethod[] handlerMethods = handler.getDeclaredMethods(); + ResolvedJavaMethod[] handlerMethods = handler.getDeclaredMethods(false); UserError.guarantee(handlerMethods.length == 1 && handlerMethods[0].isStatic(), "Exception handler class must declare exactly one static method: %s -> %s", targetMethod, handler); UserError.guarantee(Uninterruptible.Utils.isUninterruptible(handlerMethods[0]), @@ -587,7 +587,7 @@ private void generateEpilogue(HostedProviders providers, SubstrateGraphKit kit) return; } ResolvedJavaType epilogue = providers.getMetaAccess().lookupJavaType(epilogueClass); - ResolvedJavaMethod[] epilogueMethods = epilogue.getDeclaredMethods(); + ResolvedJavaMethod[] epilogueMethods = epilogue.getDeclaredMethods(false); UserError.guarantee(epilogueMethods.length == 1 && epilogueMethods[0].isStatic() && epilogueMethods[0].getSignature().getParameterCount(false) == 0, "Epilogue class must declare exactly one static method without parameters: %s -> %s", targetMethod, epilogue); UserError.guarantee(Uninterruptible.Utils.isUninterruptible(epilogueMethods[0]), diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/PodFactorySubstitutionMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/PodFactorySubstitutionMethod.java index 2f347aa2e08a..04e473bed936 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/PodFactorySubstitutionMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/PodFactorySubstitutionMethod.java @@ -155,7 +155,7 @@ public StructuredGraph buildGraph(DebugContext debug, ResolvedJavaMethod method, * @throws GraalError if no matching constructor found */ private ResolvedJavaMethod findMatchingConstructor(ResolvedJavaMethod method, ResolvedJavaType typeToSearch) { - for (ResolvedJavaMethod ctor : typeToSearch.getDeclaredConstructors()) { + for (ResolvedJavaMethod ctor : typeToSearch.getDeclaredConstructors(false)) { if (parameterTypesMatch(method, ctor)) { return ctor; } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jfr/JfrEventSubstitution.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jfr/JfrEventSubstitution.java index 723c459d493d..2fe95c27c7a4 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jfr/JfrEventSubstitution.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jfr/JfrEventSubstitution.java @@ -128,7 +128,7 @@ private static ResolvedJavaMethod initEventMethod(ResolvedJavaMethod oldMethod) if (name.equals("")) { return type.getClassInitializer(); } else if (name.equals("")) { - for (ResolvedJavaMethod m : type.getDeclaredConstructors()) { + for (ResolvedJavaMethod m : type.getDeclaredConstructors(false)) { if (m.getName().equals(name) && m.getSignature().equals(signature)) { return m; } @@ -176,7 +176,7 @@ private boolean needsClassRedefinition(ResolvedJavaType type) { * that method using the hacky way below. */ private static void changeWriterResetMethod(ResolvedJavaType eventWriterType) { - for (ResolvedJavaMethod m : eventWriterType.getDeclaredMethods()) { + for (ResolvedJavaMethod m : eventWriterType.getDeclaredMethods(false)) { if (m.getName().equals("reset")) { setPublicModifier(m); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java index 3e14166ce5ba..0d7c2f66d453 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java @@ -520,7 +520,7 @@ private static void finishMethodBeforeCompilation(JNICallableJavaMethod method, private static boolean anyMethodMatchesIgnoreReturnType(ResolvedJavaType sub, JNIAccessibleMethodDescriptor descriptor) { try { - for (ResolvedJavaMethod method : sub.getDeclaredMethods()) { + for (ResolvedJavaMethod method : sub.getDeclaredMethods(false)) { if (descriptor.matchesIgnoreReturnType(method)) { return true; } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIFunctionTablesFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIFunctionTablesFeature.java index 84d3ad4ccfd4..70fadc596270 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIFunctionTablesFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIFunctionTablesFeature.java @@ -129,7 +129,7 @@ public void beforeAnalysis(BeforeAnalysisAccess arg) { AnalysisType exports = metaAccess.lookupJavaType(JNIInvocationInterface.Exports.class); AnalysisType functions = metaAccess.lookupJavaType(JNIFunctions.class); AnalysisType functionsJDK19OrLater = JavaVersionUtil.JAVA_SPEC <= 17 ? null : metaAccess.lookupJavaType(JNIFunctionsJDK19OrLater.class); - Stream analysisMethods = Stream.of(invokes, functions, functionsJDK19OrLater, exports).filter(type -> type != null).flatMap(type -> Stream.of(type.getDeclaredMethods())); + Stream analysisMethods = Stream.of(invokes, functions, functionsJDK19OrLater, exports).filter(type -> type != null).flatMap(type -> Stream.of(type.getDeclaredMethods(false))); Stream unimplementedMethods = Stream.of((AnalysisMethod) getSingleMethod(metaAccess, UnimplementedWithJNIEnvArgument.class), (AnalysisMethod) getSingleMethod(metaAccess, UnimplementedWithJavaVMArgument.class)); Stream.concat(analysisMethods, unimplementedMethods).forEach(method -> { @@ -147,7 +147,7 @@ public void beforeAnalysis(BeforeAnalysisAccess arg) { ArrayList generated = new ArrayList<>(); MetaAccessProvider wrappedMetaAccess = metaAccess.getWrapped(); ResolvedJavaType generatedMethodClass = wrappedMetaAccess.lookupJavaType(JNIFunctions.class); - ConstantPool constantPool = generatedMethodClass.getDeclaredMethods()[0].getConstantPool(); + ConstantPool constantPool = generatedMethodClass.getDeclaredMethods(false)[0].getConstantPool(); // Generate JNI field accessors EnumSet fldKinds = jniKinds.clone(); fldKinds.remove(JavaKind.Void); @@ -195,7 +195,7 @@ private static CFunctionPointer prepareCallTrampoline(CompilationAccessImpl acce } private static ResolvedJavaMethod getSingleMethod(MetaAccessProvider metaAccess, Class holder) { - ResolvedJavaMethod[] methods = metaAccess.lookupJavaType(holder).getDeclaredMethods(); + ResolvedJavaMethod[] methods = metaAccess.lookupJavaType(holder).getDeclaredMethods(false); assert methods.length == 1; return methods[0]; } @@ -210,7 +210,7 @@ private void fillJNIInvocationInterfaceTable(CompilationAccessImpl access) { JNIFunctionTables.singleton().initInvokeInterfaceTable(unimplementedWithJavaVMArgument, access); HostedType invokes = access.getMetaAccess().lookupJavaType(JNIInvocationInterface.class); - for (HostedMethod method : invokes.getDeclaredMethods()) { + for (HostedMethod method : invokes.getDeclaredMethods(false)) { StructFieldInfo field = findFieldFor(invokeInterfaceMetadata, method.getName()); int offset = field.getOffsetInfo().getProperty(); JNIFunctionTables.singleton().initInvokeInterfaceEntry(offset, getStubFunctionPointer(access, method)); @@ -223,14 +223,14 @@ private void fillJNIFunctionsTable(CompilationAccessImpl access) { tables.initFunctionTable(unimplementedWithJNIEnvArgument, access); HostedType functions = access.getMetaAccess().lookupJavaType(JNIFunctions.class); - for (HostedMethod method : functions.getDeclaredMethods()) { + for (HostedMethod method : functions.getDeclaredMethods(false)) { StructFieldInfo field = findFieldFor(functionTableMetadata, method.getName()); int offset = field.getOffsetInfo().getProperty(); tables.initFunctionEntry(offset, getStubFunctionPointer(access, method)); } if (JavaVersionUtil.JAVA_SPEC > 17) { HostedType functionsJDK19OrLater = access.getMetaAccess().lookupJavaType(JNIFunctionsJDK19OrLater.class); - for (HostedMethod method : functionsJDK19OrLater.getDeclaredMethods()) { + for (HostedMethod method : functionsJDK19OrLater.getDeclaredMethods(false)) { StructFieldInfo field = findFieldFor(functionTableMetadataJDK19OrLater, method.getName()); int offset = field.getOffsetInfo().getProperty(); tables.initFunctionEntry(offset, getStubFunctionPointer(access, method)); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/lambda/LambdaSubstitutionType.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/lambda/LambdaSubstitutionType.java index 01349aca0bb6..baba28f98307 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/lambda/LambdaSubstitutionType.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/lambda/LambdaSubstitutionType.java @@ -29,6 +29,7 @@ import com.oracle.graal.pointsto.infrastructure.OriginalClassProvider; import com.oracle.svm.core.jdk.LambdaFormHiddenMethod; +import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.annotation.AnnotationValue; import com.oracle.svm.hosted.annotation.AnnotationWrapper; import com.oracle.svm.hosted.annotation.SubstrateAnnotationExtractor; @@ -251,12 +252,23 @@ public ResolvedJavaType getEnclosingType() { @Override public ResolvedJavaMethod[] getDeclaredConstructors() { - return original.getDeclaredConstructors(); + return getDeclaredConstructors(true); + } + + @Override + public ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) { + VMError.guarantee(forceLink == false, "only use getDeclaredConstructors without forcing to link, because linking can throw LinkageError"); + return original.getDeclaredConstructors(forceLink); } @Override public ResolvedJavaMethod[] getDeclaredMethods() { - return original.getDeclaredMethods(); + return getDeclaredMethods(true); + } + + @Override + public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) { + return original.getDeclaredMethods(forceLink); } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedType.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedType.java index 0d371dea0ef3..3004e7c7c7c8 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedType.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedType.java @@ -32,6 +32,7 @@ import com.oracle.graal.pointsto.meta.AnalysisType; import com.oracle.svm.core.hub.DynamicHub; import com.oracle.svm.core.meta.SharedType; +import com.oracle.svm.core.util.VMError; import jdk.vm.ci.meta.Assumptions.AssumptionResult; import jdk.vm.ci.meta.JavaConstant; @@ -374,13 +375,25 @@ public HostedType getEnclosingType() { } @Override - public HostedMethod[] getDeclaredConstructors() { - return universe.lookup(wrapped.getDeclaredConstructors()); + public ResolvedJavaMethod[] getDeclaredConstructors() { + return getDeclaredConstructors(true); } @Override - public HostedMethod[] getDeclaredMethods() { - return universe.lookup(wrapped.getDeclaredMethods()); + public HostedMethod[] getDeclaredConstructors(boolean forceLink) { + VMError.guarantee(forceLink == false, "only use getDeclaredConstructors without forcing to link, because linking can throw LinkageError"); + return universe.lookup(wrapped.getDeclaredConstructors(forceLink)); + } + + @Override + public ResolvedJavaMethod[] getDeclaredMethods() { + return getDeclaredMethods(true); + } + + @Override + public HostedMethod[] getDeclaredMethods(boolean forceLink) { + VMError.guarantee(forceLink == false, "only use getDeclaredMethods without forcing to link, because linking can throw LinkageError"); + return universe.lookup(wrapped.getDeclaredMethods(forceLink)); } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/InjectedAccessorsPlugin.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/InjectedAccessorsPlugin.java index 33c539bc08c3..e5f90099b80b 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/InjectedAccessorsPlugin.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/InjectedAccessorsPlugin.java @@ -76,7 +76,7 @@ private static boolean handleField(GraphBuilderContext b, ResolvedJavaField fiel String longName = shortName + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1); ResolvedJavaMethod foundMethod = null; - for (ResolvedJavaMethod method : accessorsType.getDeclaredMethods()) { + for (ResolvedJavaMethod method : accessorsType.getDeclaredMethods(false)) { if (method.getName().equals(shortName) || method.getName().equals(longName)) { if (foundMethod != null) { error(field, accessorsType, null, "found two methods " + foundMethod.format("%n(%p)") + " and " + method.format("%n(%p)")); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java index fb2d6ee04524..0d4dcb12ce3f 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java @@ -266,8 +266,8 @@ static void warn(String str) { private static Stream allExecutablesDeclaredInClass(ResolvedJavaType t) { return Stream.concat(Stream.concat( - Arrays.stream(t.getDeclaredMethods()), - Arrays.stream(t.getDeclaredConstructors())), + Arrays.stream(t.getDeclaredMethods(false)), + Arrays.stream(t.getDeclaredConstructors(false))), t.getClassInitializer() == null ? Stream.empty() : Stream.of(t.getClassInitializer())); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/InjectedFieldsType.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/InjectedFieldsType.java index 567e4a5e0dfb..34a01daff393 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/InjectedFieldsType.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/InjectedFieldsType.java @@ -28,6 +28,7 @@ import java.util.Arrays; import com.oracle.graal.pointsto.infrastructure.OriginalClassProvider; +import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.annotation.AnnotationWrapper; import jdk.vm.ci.common.JVMCIError; @@ -229,12 +230,24 @@ public ResolvedJavaType getEnclosingType() { @Override public ResolvedJavaMethod[] getDeclaredConstructors() { - return original.getDeclaredConstructors(); + return getDeclaredConstructors(true); + } + + @Override + public ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) { + VMError.guarantee(forceLink == false, "only use getDeclaredConstructors without forcing to link, because linking can throw LinkageError"); + return original.getDeclaredConstructors(forceLink); } @Override public ResolvedJavaMethod[] getDeclaredMethods() { - return original.getDeclaredMethods(); + return getDeclaredMethods(true); + } + + @Override + public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) { + VMError.guarantee(forceLink == false, "only use getDeclaredMethods without forcing to link, because linking can throw LinkageError"); + return original.getDeclaredMethods(forceLink); } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/PolymorphicSignatureWrapperMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/PolymorphicSignatureWrapperMethod.java index d5c48e0ac2fc..36d6bf2ce3c3 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/PolymorphicSignatureWrapperMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/PolymorphicSignatureWrapperMethod.java @@ -80,7 +80,7 @@ public class PolymorphicSignatureWrapperMethod implements ResolvedJavaMethod, Gr PolymorphicSignatureWrapperMethod(SubstitutionMethod substitutionBaseMethod, ResolvedJavaMethod originalMethod) { this.substitutionBaseMethod = substitutionBaseMethod; this.originalMethod = originalMethod; - this.constantPool = substitutionBaseMethod.getDeclaringClass().getDeclaredConstructors()[0].getConstantPool(); + this.constantPool = substitutionBaseMethod.getDeclaringClass().getDeclaredConstructors(false)[0].getConstantPool(); } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/SubstitutionType.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/SubstitutionType.java index 647c49e64841..f09ca2816735 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/SubstitutionType.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/SubstitutionType.java @@ -29,6 +29,7 @@ import java.util.Arrays; import com.oracle.graal.pointsto.infrastructure.OriginalClassProvider; +import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.annotation.AnnotationWrapper; import jdk.vm.ci.common.JVMCIError; @@ -268,12 +269,24 @@ public ResolvedJavaType getEnclosingType() { @Override public ResolvedJavaMethod[] getDeclaredConstructors() { - return annotated.getDeclaredConstructors(); + return getDeclaredConstructors(true); + } + + @Override + public ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) { + VMError.guarantee(forceLink == false, "only use getDeclaredConstructors without forcing to link, because linking can throw LinkageError"); + return annotated.getDeclaredConstructors(forceLink); } @Override public ResolvedJavaMethod[] getDeclaredMethods() { - return annotated.getDeclaredMethods(); + return getDeclaredMethods(true); + } + + @Override + public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) { + VMError.guarantee(forceLink == false, "only use getDeclaredMethods without forcing to link, because linking can throw LinkageError"); + return annotated.getDeclaredMethods(forceLink); } @Override diff --git a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/PermissionsFeature.java b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/PermissionsFeature.java index ced4ce3b6e1c..43439a065689 100644 --- a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/PermissionsFeature.java +++ b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/PermissionsFeature.java @@ -543,7 +543,7 @@ private static Set findMethods(BigBang bb, Class owner, P * @return the methods accepted by {@code filter} */ static Set findMethods(BigBang bb, AnalysisType owner, Predicate filter) { - return findImpl(bb, owner.getWrapped().getDeclaredMethods(), filter); + return findImpl(bb, owner.getWrapped().getDeclaredMethods(false), filter); } /** @@ -556,7 +556,7 @@ static Set findMethods(BigBang bb, AnalysisType owner, Predi * @return the constructors accepted by {@code filter} */ static Set findConstructors(BigBang bb, AnalysisType owner, Predicate filter) { - return findImpl(bb, owner.getWrapped().getDeclaredConstructors(), filter); + return findImpl(bb, owner.getWrapped().getDeclaredConstructors(false), filter); } private static Set findImpl(BigBang bb, ResolvedJavaMethod[] methods, Predicate filter) { diff --git a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/WhiteListParser.java b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/WhiteListParser.java index c3f17e34212a..78320f600718 100644 --- a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/WhiteListParser.java +++ b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/WhiteListParser.java @@ -228,14 +228,14 @@ private boolean registerConstructor(AnalysisType type, List formal } private boolean registerDeclaredConstructors(AnalysisType type) { - for (AnalysisMethod method : type.getDeclaredConstructors()) { + for (AnalysisMethod method : type.getDeclaredConstructors(false)) { whiteList.add(new AnalysisMethodNode(method)); } return true; } private boolean registerDeclaredMethods(AnalysisType type) { - for (AnalysisMethod method : type.getDeclaredMethods()) { + for (AnalysisMethod method : type.getDeclaredMethods(false)) { whiteList.add(new AnalysisMethodNode(method)); } return true; diff --git a/substratevm/src/com.oracle.svm.truffle/src/com/oracle/svm/truffle/TruffleFeature.java b/substratevm/src/com.oracle.svm.truffle/src/com/oracle/svm/truffle/TruffleFeature.java index f4550052770a..14592261a526 100644 --- a/substratevm/src/com.oracle.svm.truffle/src/com/oracle/svm/truffle/TruffleFeature.java +++ b/substratevm/src/com.oracle.svm.truffle/src/com/oracle/svm/truffle/TruffleFeature.java @@ -925,8 +925,8 @@ public void afterAnalysis(AfterAnalysisAccess access) { truffleRuntime.initializeHostedKnownMethods(config.getMetaAccess()); runtimeCompiledMethods = new LinkedHashSet<>(); - runtimeCompiledMethods.addAll(Arrays.asList(config.getMetaAccess().lookupJavaType(CompilerDirectives.class).getDeclaredMethods())); - runtimeCompiledMethods.addAll(Arrays.asList(config.getMetaAccess().lookupJavaType(CompilerAsserts.class).getDeclaredMethods())); + runtimeCompiledMethods.addAll(Arrays.asList(config.getMetaAccess().lookupJavaType(CompilerDirectives.class).getDeclaredMethods(false))); + runtimeCompiledMethods.addAll(Arrays.asList(config.getMetaAccess().lookupJavaType(CompilerAsserts.class).getDeclaredMethods(false))); for (RuntimeCompiledMethod runtimeCompiledMethod : RuntimeCompilationFeature.singleton().getRuntimeCompiledMethods()) {