diff --git a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalEntryPoints.java b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalEntryPoints.java index 2636fed1451f..08b443231c9e 100644 --- a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalEntryPoints.java +++ b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalEntryPoints.java @@ -27,6 +27,7 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.util.Arrays; +import java.util.List; import java.util.Map; import jdk.graal.compiler.debug.GlobalMetrics; @@ -234,7 +235,7 @@ private static long hashConstantOopFields(JNIEnv jniEnv, JVMCIBackend backend = runtime.getHostJVMCIBackend(); ConstantReflectionProvider constantReflection = backend.getConstantReflection(); HotSpotResolvedJavaType type = runtime.unhand(HotSpotResolvedJavaType.class, typeHandle); - ResolvedJavaField[] staticFields = type.getStaticFields(); + List staticFields = type.getStaticFields(); JavaConstant receiver = null; long hash = 13; diff --git a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/truffle/HSTruffleCompilerRuntime.java b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/truffle/HSTruffleCompilerRuntime.java index f7460b38fe15..25b8748f931d 100644 --- a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/truffle/HSTruffleCompilerRuntime.java +++ b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/truffle/HSTruffleCompilerRuntime.java @@ -59,6 +59,7 @@ import org.graalvm.nativeimage.c.type.CCharPointer; import java.util.Arrays; +import java.util.List; import java.util.function.Consumer; import java.util.function.Supplier; @@ -156,10 +157,10 @@ public boolean isValueType(ResolvedJavaType type) { public ConstantFieldInfo getConstantFieldInfo(ResolvedJavaField field) { ResolvedJavaType enclosingType = field.getDeclaringClass(); boolean isStatic = field.isStatic(); - ResolvedJavaField[] declaredFields = isStatic ? enclosingType.getStaticFields() : enclosingType.getInstanceFields(false); + List declaredFields = isStatic ? enclosingType.getStaticFields() : enclosingType.getInstanceFields(false); int fieldIndex = -1; - for (int i = 0; i < declaredFields.length; i++) { - if (field.equals(declaredFields[i])) { + for (int i = 0; i < declaredFields.size(); i++) { + if (field.equals(declaredFields.get(i))) { fieldIndex = i; break; } @@ -170,7 +171,7 @@ public ConstantFieldInfo getConstantFieldInfo(ResolvedJavaField field) { isStatic ? "Static" : "Instance", field, enclosingType, - Arrays.toString(declaredFields))); + declaredFields)); } long typeHandle = HotSpotJVMCIRuntime.runtime().translate(enclosingType); int rawValue = HSTruffleCompilerRuntimeGen.callGetConstantFieldInfo(calls, env(), getHandle(), typeHandle, isStatic, fieldIndex); diff --git a/compiler/src/jdk.graal.compiler.microbenchmarks/src/jdk/graal/compiler/microbenchmarks/graal/KillWithUnusedFloatingInputsBenchmark.java b/compiler/src/jdk.graal.compiler.microbenchmarks/src/jdk/graal/compiler/microbenchmarks/graal/KillWithUnusedFloatingInputsBenchmark.java index 06be33382447..a7a8d368ff7f 100644 --- a/compiler/src/jdk.graal.compiler.microbenchmarks/src/jdk/graal/compiler/microbenchmarks/graal/KillWithUnusedFloatingInputsBenchmark.java +++ b/compiler/src/jdk.graal.compiler.microbenchmarks/src/jdk/graal/compiler/microbenchmarks/graal/KillWithUnusedFloatingInputsBenchmark.java @@ -40,6 +40,8 @@ import jdk.graal.compiler.phases.tiers.HighTierContext; import jdk.vm.ci.meta.JavaKind; +import java.util.List; + public class KillWithUnusedFloatingInputsBenchmark extends GraalBenchmark { @Benchmark @@ -152,7 +154,7 @@ private void modifyGraph(StructuredGraph g) { } for (int j = 0; j < sizeParam; j++) { - FrameState fs = fb.create(1, null, false, kinds, vals); + FrameState fs = fb.create(1, null, false, List.of(kinds), vals); g.addOrUnique(fs); } } diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/BytecodeDisassemblerTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/BytecodeDisassemblerTest.java index f8432dfc3b24..5749c8a184b5 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/BytecodeDisassemblerTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/BytecodeDisassemblerTest.java @@ -89,8 +89,7 @@ private void disassembleClasses(List> classes) { BytecodeDisassembler disassembler = new BytecodeDisassembler(multiline, newLine, format, f); ResolvedJavaType type = getMetaAccess().lookupJavaType(c); - ResolvedJavaMethod[] methods = type.getDeclaredMethods(); - for (ResolvedJavaMethod m : methods) { + for (ResolvedJavaMethod m : type.getDeclaredMethods()) { int codeSize = m.getCodeSize(); String dis = disassembler.disassemble(m); if (codeSize <= 0) { diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/CheckGraalInvariants.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/CheckGraalInvariants.java index bcaaac05f8a5..e92e1228af3d 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/CheckGraalInvariants.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/CheckGraalInvariants.java @@ -447,8 +447,8 @@ public static void runTest(InvariantsTool tool) { ResolvedJavaType type = metaAccess.lookupJavaType(c); List methods = new ArrayList<>(); try { - methods.addAll(Arrays.asList(type.getDeclaredMethods(false))); - methods.addAll(Arrays.asList(type.getDeclaredConstructors(false))); + methods.addAll(type.getDeclaredMethods(false)); + methods.addAll(type.getDeclaredConstructors(false)); } catch (Throwable e) { errors.add(String.format("Error while checking %s:%n%s", className, printStackTraceToString(e))); } diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/GraalCompilerTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/GraalCompilerTest.java index 05819dce1947..d9997c334281 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/GraalCompilerTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/GraalCompilerTest.java @@ -918,10 +918,10 @@ protected Result executeActual(OptionValues options, ResolvedJavaMethod method, } protected void checkArgs(ResolvedJavaMethod method, Object[] args) { - JavaType[] sig = method.toParameterTypes(); - Assert.assertEquals(sig.length, args.length); + List sig = method.toParameterTypes(); + Assert.assertEquals(sig.size(), args.length); for (int i = 0; i < args.length; i++) { - JavaType javaType = sig[i]; + JavaType javaType = sig.get(i); JavaKind kind = javaType.getJavaKind(); Object arg = args[i]; if (kind == JavaKind.Object) { @@ -1617,12 +1617,12 @@ protected void bindArguments(StructuredGraph graph, Object[] argsToBind) { ResolvedJavaMethod m = graph.method(); Object receiver = isStatic(m.getModifiers()) ? null : this; Object[] args = argsWithReceiver(receiver, argsToBind); - JavaType[] parameterTypes = m.toParameterTypes(); - assert parameterTypes.length == args.length; + List parameterTypes = m.toParameterTypes(); + assert parameterTypes.size() == args.length; for (ParameterNode param : graph.getNodes(ParameterNode.TYPE)) { Object arg = args[param.index()]; if (arg != NO_BIND) { - JavaConstant c = getSnippetReflection().forBoxed(parameterTypes[param.index()].getJavaKind(), arg); + JavaConstant c = getSnippetReflection().forBoxed(parameterTypes.get(param.index()).getJavaKind(), arg); ConstantNode replacement = ConstantNode.forConstant(c, getMetaAccess(), graph); param.replaceAtUsages(replacement); } diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/IntegerLowerThanCommonArithmeticTestBase.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/IntegerLowerThanCommonArithmeticTestBase.java index 55a97674e6f8..2eef7e6bd685 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/IntegerLowerThanCommonArithmeticTestBase.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/IntegerLowerThanCommonArithmeticTestBase.java @@ -37,6 +37,7 @@ import jdk.graal.compiler.options.OptionValues; import java.util.Collections; +import java.util.List; import java.util.Set; import static java.lang.reflect.Modifier.isStatic; @@ -50,8 +51,8 @@ protected void bindArguments(StructuredGraph graph, Object[] argsToBind) { ResolvedJavaMethod m = graph.method(); Object receiver = isStatic(m.getModifiers()) ? null : this; Object[] args = argsWithReceiver(receiver, argsToBind); - JavaType[] parameterTypes = m.toParameterTypes(); - assert parameterTypes.length == args.length; + List parameterTypes = m.toParameterTypes(); + assert parameterTypes.size() == args.length; for (ParameterNode param : graph.getNodes(ParameterNode.TYPE)) { Object arg = args[param.index()]; if (arg == NO_BIND) { @@ -63,7 +64,7 @@ protected void bindArguments(StructuredGraph graph, Object[] argsToBind) { param.replaceAtUsages(replacement, n -> n != replacement); } } else { - JavaConstant c = getSnippetReflection().forBoxed(parameterTypes[param.index()].getJavaKind(), arg); + JavaConstant c = getSnippetReflection().forBoxed(parameterTypes.get(param.index()).getJavaKind(), arg); ConstantNode replacement = ConstantNode.forConstant(c, getMetaAccess(), graph); param.replaceAtUsages(replacement); } diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/ProfilingInfoTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/ProfilingInfoTest.java index 5d09ef2bdf74..47ba1f3caa32 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/ProfilingInfoTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/ProfilingInfoTest.java @@ -168,18 +168,18 @@ private void testTypeProfile(String testSnippet, int bci) { ProfilingInfo info = profile(testSnippet, "ABC"); JavaTypeProfile typeProfile = info.getTypeProfile(bci); Assert.assertEquals(0.0, typeProfile.getNotRecordedProbability(), DELTA); - Assert.assertEquals(1, typeProfile.getTypes().length); - Assert.assertEquals(stringType, typeProfile.getTypes()[0].getType()); - Assert.assertEquals(1.0, typeProfile.getTypes()[0].getProbability(), DELTA); + Assert.assertEquals(1, typeProfile.getTypes().size()); + Assert.assertEquals(stringType, typeProfile.getTypes().getFirst().getType()); + Assert.assertEquals(1.0, typeProfile.getTypes().getFirst().getProbability(), DELTA); continueProfiling(testSnippet, new StringBuilder()); typeProfile = info.getTypeProfile(bci); Assert.assertEquals(0.0, typeProfile.getNotRecordedProbability(), DELTA); - Assert.assertEquals(2, typeProfile.getTypes().length); - Assert.assertEquals(stringType, typeProfile.getTypes()[0].getType()); - Assert.assertEquals(stringBuilderType, typeProfile.getTypes()[1].getType()); - Assert.assertEquals(0.5, typeProfile.getTypes()[0].getProbability(), DELTA); - Assert.assertEquals(0.5, typeProfile.getTypes()[1].getProbability(), DELTA); + Assert.assertEquals(2, typeProfile.getTypes().size()); + Assert.assertEquals(stringType, typeProfile.getTypes().getFirst().getType()); + Assert.assertEquals(stringBuilderType, typeProfile.getTypes().get(1).getType()); + Assert.assertEquals(0.5, typeProfile.getTypes().getFirst().getProbability(), DELTA); + Assert.assertEquals(0.5, typeProfile.getTypes().get(1).getProbability(), DELTA); resetProfile(testSnippet); typeProfile = info.getTypeProfile(bci); diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifyGetOptionsUsage.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifyGetOptionsUsage.java index 0df28f1cffd0..bbb03adc702f 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifyGetOptionsUsage.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifyGetOptionsUsage.java @@ -26,6 +26,7 @@ import java.lang.reflect.MalformedParametersException; import java.lang.reflect.Method; +import java.util.List; import jdk.graal.compiler.graph.Node; import jdk.graal.compiler.nodes.StructuredGraph; @@ -62,13 +63,11 @@ protected void verify(StructuredGraph graph, CoreProviders context) { boolean hasTool = false; try { ResolvedJavaMethod method = graph.method(); - Parameter[] parameters = method.getParameters(); - if (parameters != null) { - for (ResolvedJavaMethod.Parameter parameter : parameters) { - if (parameter.getType().getName().equals(canonicalizerToolClass.getName())) { - hasTool = true; - break; - } + List parameters = method.getParameters(); + for (ResolvedJavaMethod.Parameter parameter : parameters) { + if (parameter.getType().getName().equals(canonicalizerToolClass.getName())) { + hasTool = true; + break; } } } catch (MalformedParametersException e) { diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifyIterableNodeType.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifyIterableNodeType.java index 5af9f0944037..37a0b7dc6860 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifyIterableNodeType.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifyIterableNodeType.java @@ -43,6 +43,8 @@ import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaType; +import java.util.List; + /** * Verifies that code which uses {@link Node} implementing {@link IterableNodeType} uses * {@link StructuredGraph#getNodes(NodeClass)} and not {@linkplain NodeIterable#filter(Class)} to @@ -63,18 +65,17 @@ protected void verify(StructuredGraph graph, CoreProviders context) { if (receiver instanceof Invoke) { CallTargetNode receiverCallTarget = ((Invoke) receiver).callTarget(); ResolvedJavaMethod receiverMethod = receiverCallTarget.targetMethod(); - if (receiverMethod.getDeclaringClass().equals(graphType) && receiverMethod.getName().equals("getNodes") && receiverMethod.getParameters().length == 0) { + if (receiverMethod.getDeclaringClass().equals(graphType) && receiverMethod.getName().equals("getNodes") && receiverMethod.getParameters().isEmpty()) { ResolvedJavaMethod callee = t.targetMethod(); if (callee.getDeclaringClass().equals(nodeIterableType)) { if (callee.getName().equals("filter")) { - ResolvedJavaMethod.Parameter[] params = callee.getParameters(); - if (params.length == 1 && params[0].getType().equals(classType)) { + List params = callee.getParameters(); + if (params.size() == 1 && params.getFirst().getType().equals(classType)) { // call to filter ValueNode v = t.arguments().get(1); ResolvedJavaType javaType = v.stamp(NodeView.DEFAULT).javaType(metaAccess); assert classType.isAssignableFrom(javaType) : "Need to have a class type parameter."; - if (v instanceof ConstantNode) { - ConstantNode c = (ConstantNode) v; + if (v instanceof ConstantNode c) { javaType = context.getConstantReflection().asJavaType(c.asConstant()); if (iterableNodeType.isAssignableFrom(javaType)) { throw new VerificationError( diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifySnippetProbabilities.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifySnippetProbabilities.java index cfeca54551f9..010e86bb13d5 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifySnippetProbabilities.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifySnippetProbabilities.java @@ -92,7 +92,7 @@ protected void verify(StructuredGraph graph, CoreProviders context) { } } } - boolean[] specialParameters = new boolean[method.getParameters().length]; + boolean[] specialParameters = new boolean[method.getParameters().size()]; Annotation[][] parameterAnnotations = graph.method().getParameterAnnotations(); for (int i = 0; i < parameterAnnotations.length; i++) { for (Annotation a : parameterAnnotations[i]) { diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifyStringCaseUsage.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifyStringCaseUsage.java index 986c79cff565..08882d6bce89 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifyStringCaseUsage.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/VerifyStringCaseUsage.java @@ -49,7 +49,7 @@ protected void verify(StructuredGraph graph, CoreProviders context) { for (MethodCallTargetNode t : graph.getNodes(MethodCallTargetNode.TYPE)) { ResolvedJavaMethod callee = t.targetMethod(); if (callee.getDeclaringClass().equals(stringType)) { - if (callee.getParameters().length > 0) { + if (!callee.getParameters().isEmpty()) { continue; } String calleeName = callee.getName(); diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/ea/UnsafeEATest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/ea/UnsafeEATest.java index 819d9328adec..cc01f739b2e1 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/ea/UnsafeEATest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/ea/UnsafeEATest.java @@ -25,6 +25,7 @@ package jdk.graal.compiler.core.test.ea; import java.nio.ByteBuffer; +import java.util.List; import org.junit.Assert; import org.junit.Test; @@ -60,8 +61,8 @@ protected void testEscapeAnalysis(String snippet, JavaConstant expectedConstantR // Check that a compiled version of this method returns the same value if we expect a // constant result. ResolvedJavaMethod method = getResolvedJavaMethod(snippet); - JavaKind[] javaKinds = method.getSignature().toParameterKinds(false); - Object[] args = new Object[javaKinds.length]; + List javaKinds = method.getSignature().toParameterKinds(false); + Object[] args = new Object[javaKinds.size()]; int i = 0; for (JavaKind k : javaKinds) { args[i++] = JavaConstant.defaultForKind(k).asBoxedPrimitive(); diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/InstalledCodeExecuteHelperTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/InstalledCodeExecuteHelperTest.java index 6cef54fa86e0..6febc627c0a6 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/InstalledCodeExecuteHelperTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/InstalledCodeExecuteHelperTest.java @@ -42,6 +42,8 @@ import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + public class InstalledCodeExecuteHelperTest extends GraalCompilerTest { private static final int ITERATIONS = 100000; @@ -84,11 +86,11 @@ protected StructuredGraph parse(Builder builder, PhaseSuite gra ResolvedJavaMethod m = graph.method(); Object receiver = isStatic(m.getModifiers()) ? null : this; Object[] args = argsWithReceiver(receiver, argsToBind); - JavaType[] parameterTypes = m.toParameterTypes(); - assert parameterTypes.length == args.length; + List parameterTypes = m.toParameterTypes(); + assert parameterTypes.size() == args.length; for (int i = 0; i < argsToBind.length; i++) { ParameterNode param = graph.getParameter(i); - JavaConstant c = getSnippetReflection().forBoxed(parameterTypes[i].getJavaKind(), argsToBind[i]); + JavaConstant c = getSnippetReflection().forBoxed(parameterTypes.get(i).getJavaKind(), argsToBind[i]); ConstantNode replacement = ConstantNode.forConstant(c, getMetaAccess(), graph); param.replaceAtUsages(replacement); } diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/SystemArrayCopyTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/SystemArrayCopyTest.java index a4ac5feafb8f..cb7a1a680d39 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/SystemArrayCopyTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/SystemArrayCopyTest.java @@ -43,6 +43,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.List; import static java.lang.reflect.Modifier.isStatic; @@ -106,12 +107,12 @@ protected StructuredGraph parse(StructuredGraph.Builder builder, PhaseSuite parameterTypes = m.toParameterTypes(); + assert parameterTypes.size() == args.length; for (ParameterNode param : graph.getNodes(ParameterNode.TYPE)) { int index = param.index(); if (args[index] != null) { - JavaConstant c = getSnippetReflection().forBoxed(parameterTypes[index].getJavaKind(), args[index]); + JavaConstant c = getSnippetReflection().forBoxed(parameterTypes.get(index).getJavaKind(), args[index]); ConstantNode replacement = ConstantNode.forConstant(c, getMetaAccess(), graph); param.replaceAtUsages(replacement); } diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/truffle/test/strings/TStringOpsTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/truffle/test/strings/TStringOpsTest.java index af3cbcbfbeaf..4a07d9a54128 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/truffle/test/strings/TStringOpsTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/truffle/test/strings/TStringOpsTest.java @@ -29,6 +29,7 @@ import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.Arrays; +import java.util.List; import org.junit.Assert; @@ -104,12 +105,12 @@ protected void testWithNativeExcept(ResolvedJavaMethod method, Object receiver, ByteBuffer[] byteBuffers = new ByteBuffer[2]; int nByteBuffers = 0; try { - ResolvedJavaMethod.Parameter[] parameters = method.getParameters(); - Assert.assertTrue(parameters.length <= 64); - for (int i = 0; i < parameters.length; i++) { - if (parameters[i].getType().getName().equals("[B") && (ignore & (1L << i)) == 0) { + List parameters = method.getParameters(); + Assert.assertTrue(parameters.size() <= 64); + for (int i = 0; i < parameters.size(); i++) { + if (parameters.get(i).getType().getName().equals("[B") && (ignore & (1L << i)) == 0) { Assert.assertTrue(argsWithNative[i].toString(), argsWithNative[i] instanceof byte[]); - Assert.assertEquals("J", parameters[i + 1].getType().getName()); + Assert.assertEquals("J", parameters.get(i + 1).getType().getName()); byte[] array = (byte[]) argsWithNative[i]; byteBuffers[nByteBuffers] = ByteBuffer.allocateDirect(array.length); long bufferAddress = getBufferAddress(byteBuffers[nByteBuffers++]); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/bytecode/Bytecode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/bytecode/Bytecode.java index 8018dd212195..40a47d560876 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/bytecode/Bytecode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/bytecode/Bytecode.java @@ -30,6 +30,8 @@ import jdk.vm.ci.meta.LocalVariableTable; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + /** * An interface for accessing the bytecode properties of a {@link ResolvedJavaMethod} that allows * for different properties than those returned by {@link ResolvedJavaMethod}. Since the bytecode @@ -60,7 +62,7 @@ public interface Bytecode { StackTraceElement asStackTraceElement(int bci); - ExceptionHandler[] getExceptionHandlers(); + List getExceptionHandlers(); /** * Gets the {@link BytecodeProvider} from which this object was acquired. diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/bytecode/ResolvedJavaMethodBytecode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/bytecode/ResolvedJavaMethodBytecode.java index 28627c8d3e9b..3a530bf330f4 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/bytecode/ResolvedJavaMethodBytecode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/bytecode/ResolvedJavaMethodBytecode.java @@ -24,6 +24,7 @@ */ package jdk.graal.compiler.bytecode; +import java.util.List; import java.util.Objects; import jdk.vm.ci.meta.ConstantPool; @@ -96,7 +97,7 @@ public LocalVariableTable getLocalVariableTable() { } @Override - public ExceptionHandler[] getExceptionHandlers() { + public List getExceptionHandlers() { return method.getExceptionHandlers(); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/spi/JavaConstantFieldProvider.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/spi/JavaConstantFieldProvider.java index 59c41bdac1c8..33107b2cf7a5 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/spi/JavaConstantFieldProvider.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/spi/JavaConstantFieldProvider.java @@ -24,7 +24,7 @@ */ package jdk.graal.compiler.core.common.spi; -import java.util.Arrays; +import java.util.List; import jdk.graal.compiler.debug.GraalError; import jdk.graal.compiler.nodes.spi.CanonicalizerTool; @@ -57,13 +57,13 @@ protected JavaConstantFieldProvider(MetaAccessProvider metaAccess) { } private static ResolvedJavaField findField(ResolvedJavaType type, String fieldName) { - ResolvedJavaField[] stringFields = type.getInstanceFields(false); + List stringFields = type.getInstanceFields(false); for (ResolvedJavaField field : stringFields) { if (field.getName().equals(fieldName)) { return field; } } - throw new GraalError("missing field \"" + fieldName + "\" " + Arrays.toString(stringFields)); + throw new GraalError("missing field \"" + fieldName + "\" " + stringFields); } @Override diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/type/AbstractObjectStamp.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/type/AbstractObjectStamp.java index 245705bc68b3..6dc1572fb0cc 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/type/AbstractObjectStamp.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/type/AbstractObjectStamp.java @@ -25,6 +25,7 @@ package jdk.graal.compiler.core.common.type; import java.util.AbstractList; +import java.util.List; import java.util.Objects; import java.util.RandomAccess; @@ -339,12 +340,8 @@ private static ResolvedJavaType meetOrderedNonNullTypes(ResolvedJavaType a, Reso if (result.isJavaLangObject() && a.isInterface() && b.isInterface()) { // Both types are incompatible interfaces => search for first possible common // ancestor match among super interfaces. - ResolvedJavaType[] interfacesA = a.getInterfaces(); - ResolvedJavaType[] interfacesB = b.getInterfaces(); - for (int i = 0; i < interfacesA.length; ++i) { - ResolvedJavaType interface1 = interfacesA[i]; - for (int j = 0; j < interfacesB.length; ++j) { - ResolvedJavaType interface2 = interfacesB[j]; + for (ResolvedJavaType interface1 : a.getInterfaces()) { + for (ResolvedJavaType interface2 : b.getInterfaces()) { ResolvedJavaType leastCommon = meetTypes(interface1, interface2); if (leastCommon.isInterface()) { return leastCommon; diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/gen/DebugInfoBuilder.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/gen/DebugInfoBuilder.java index a62782445cbb..1f3d121cba70 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/gen/DebugInfoBuilder.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/gen/DebugInfoBuilder.java @@ -26,6 +26,7 @@ import java.util.ArrayDeque; import java.util.Arrays; +import java.util.List; import java.util.Queue; import org.graalvm.collections.EconomicMap; @@ -202,24 +203,22 @@ private boolean checkValues(ResolvedJavaType type, JavaValue[] values, JavaKind[ if (values != null) { assert values.length == slotKinds.length : Assertions.errorMessage(values, slotKinds); if (!type.isArray()) { - ResolvedJavaField[] fields = type.getInstanceFields(true); + List fields = type.getInstanceFields(true); int fieldIndex = 0; for (int valueIndex = 0; valueIndex < values.length; valueIndex++, fieldIndex++) { - ResolvedJavaField field = fields[fieldIndex]; + ResolvedJavaField field = fields.get(fieldIndex); JavaKind valKind = slotKinds[valueIndex].getStackKind(); JavaKind fieldKind = storageKind(field.getType()); if ((valKind == JavaKind.Double || valKind == JavaKind.Long) && fieldKind == JavaKind.Int) { - assert fieldIndex + 1 < fields.length : String.format("Not enough fields for fieldIndex = %d valueIndex = %d %s %s", fieldIndex, valueIndex, Arrays.toString(fields), - Arrays.toString(values)); - assert storageKind(fields[fieldIndex + 1].getType()) == JavaKind.Int : String.format("fieldIndex = %d valueIndex = %d %s %s %s", fieldIndex, valueIndex, - storageKind(fields[fieldIndex + 1].getType()), Arrays.toString(fields), - Arrays.toString(values)); + assert fieldIndex + 1 < fields.size() : String.format("Not enough fields for fieldIndex = %d valueIndex = %d %s %s", fieldIndex, valueIndex, fields, Arrays.toString(values)); + assert storageKind(fields.get(fieldIndex + 1).getType()) == JavaKind.Int : String.format("fieldIndex = %d valueIndex = %d %s %s %s", fieldIndex, valueIndex, + storageKind(fields.get(fieldIndex + 1).getType()), fields, values); fieldIndex++; } else { assert valKind == fieldKind.getStackKind() : field + ": " + valKind + " != " + fieldKind; } } - assert fields.length == fieldIndex : type + ": fields=" + Arrays.toString(fields) + ", field values=" + Arrays.toString(values); + assert fields.size() == fieldIndex : type + ": fields=" + fields + ", field values=" + values; } else { JavaKind componentKind = storageKind(type.getComponentType()).getStackKind(); if (componentKind == JavaKind.Object) { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/EncodedSnippets.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/EncodedSnippets.java index f6f1862f75b2..e11eaf9c04a1 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/EncodedSnippets.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/EncodedSnippets.java @@ -29,6 +29,7 @@ import java.lang.reflect.Executable; import java.lang.reflect.Field; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; import jdk.graal.compiler.core.common.LibGraalSupport; @@ -545,7 +546,7 @@ public ResolvedJavaField resolve(ResolvedJavaType accessingClass) { if (resolvedFieldType == null) { throw new NoClassDefFoundError("Can't resolve " + signature.getName() + " with " + accessingClass.getName()); } - ResolvedJavaField[] fields = isStatic ? resolvedType.getStaticFields() : resolvedType.getInstanceFields(true); + List fields = isStatic ? resolvedType.getStaticFields() : resolvedType.getInstanceFields(true); for (ResolvedJavaField field : fields) { if (field.getName().equals(name)) { if (field.getType().equals(resolvedFieldType)) { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotForeignCallLinkageImpl.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotForeignCallLinkageImpl.java index dbeeb30c7f89..a17443465161 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotForeignCallLinkageImpl.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotForeignCallLinkageImpl.java @@ -27,6 +27,7 @@ import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.runtime; import java.util.Arrays; +import java.util.List; import org.graalvm.collections.EconomicSet; @@ -203,7 +204,7 @@ public static CallingConvention createCallingConvention(MetaAccessProvider metaA StackOnlyCallingConvention conventionType = (StackOnlyCallingConvention) ccType; return conventionType.getCallingConvention(codeCache.getTarget(), returnType, parameterTypes, valueKindFactory); } - return regConfig.getCallingConvention(ccType, returnType, parameterTypes, valueKindFactory); + return regConfig.getCallingConvention(ccType, returnType, List.of(parameterTypes), valueKindFactory); } private static JavaType asJavaType(Class type, MetaAccessProvider metaAccess, WordTypes wordTypes) { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotHostBackend.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotHostBackend.java index 786a4a012d28..e4a34fe0c9d5 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotHostBackend.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotHostBackend.java @@ -32,6 +32,7 @@ import static jdk.vm.ci.common.InitTimer.timer; import java.util.Collections; +import java.util.List; import jdk.graal.compiler.core.common.CompilationIdentifier; import jdk.graal.compiler.core.common.NumUtil; @@ -59,6 +60,7 @@ import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.JavaType; +import jdk.vm.ci.meta.ResolvedJavaType; import jdk.vm.ci.runtime.JVMCICompiler; /** @@ -128,7 +130,7 @@ protected CallingConvention makeCallingConvention(StructuredGraph graph, Stub st CallingConvention cc = getCallingConvention(getCodeCache(), HotSpotCallingConventionType.JavaCallee, graph.method(), this); if (graph.getEntryBCI() != JVMCICompiler.INVOCATION_ENTRY_BCI) { // for OSR, only a pointer is passed to the method. - JavaType[] parameterTypes = new JavaType[]{getMetaAccess().lookupJavaType(long.class)}; + List parameterTypes = List.of(getMetaAccess().lookupJavaType(long.class)); CallingConvention tmp = getCodeCache().getRegisterConfig().getCallingConvention(HotSpotCallingConventionType.JavaCallee, getMetaAccess().lookupJavaType(void.class), parameterTypes, this); cc = new CallingConvention(cc.getStackSize(), cc.getReturn(), tmp.getArgument(0)); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaMethod.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaMethod.java index 0baf22212ca9..b6de280ba27f 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaMethod.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaMethod.java @@ -26,6 +26,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; +import java.util.List; import java.util.Objects; import jdk.vm.ci.meta.Constant; @@ -136,7 +137,7 @@ public boolean canBeStaticallyBound() { } @Override - public ExceptionHandler[] getExceptionHandlers() { + public List getExceptionHandlers() { throw new UnsupportedOperationException(); } @@ -166,7 +167,7 @@ public Annotation[][] getParameterAnnotations() { } @Override - public Type[] getGenericParameterTypes() { + public List getGenericParameterTypes() { throw new UnsupportedOperationException(); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaType.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaType.java index be9d32a8c2fd..0cce37c9452b 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaType.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaType.java @@ -25,6 +25,7 @@ package jdk.graal.compiler.hotspot; import java.lang.annotation.Annotation; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -56,7 +57,7 @@ */ public final class SnippetResolvedJavaType implements ResolvedJavaType { private final Class javaClass; - private SnippetResolvedJavaMethod[] methods; + private List methods; private SnippetResolvedJavaType arrayOfType; public SnippetResolvedJavaType(Class javaClass) { @@ -71,19 +72,18 @@ public void setArrayOfType(SnippetResolvedJavaType arrayOfType) { @LibGraalSupport.HostedOnly synchronized SnippetResolvedJavaMethod add(SnippetResolvedJavaMethod method) { if (methods == null) { - methods = new SnippetResolvedJavaMethod[]{method}; + methods = new ArrayList<>(); + methods.add(method); return method; } // This in inefficient but is only used while building // libgraal for a small number of methods. - int index = Arrays.asList(methods).indexOf(method); + int index = methods.indexOf(method); if (index == -1) { - SnippetResolvedJavaMethod[] newMethods = Arrays.copyOf(methods, methods.length + 1); - newMethods[methods.length] = method; - methods = newMethods; + methods.add(method); return method; } else { - return methods[index]; + return methods.get(index); } } @@ -171,12 +171,6 @@ public ResolvedJavaType lookupType(UnresolvedJavaType unresolvedJavaType, boolea throw new NoClassDefFoundError(); } - @SuppressWarnings("deprecation") - @Override - public ResolvedJavaType getHostClass() { - throw new UnsupportedOperationException(); - } - @Override public boolean isInstance(JavaConstant obj) { if (obj instanceof SnippetObjectConstant) { @@ -191,7 +185,7 @@ public ResolvedJavaType getSuperclass() { } @Override - public ResolvedJavaType[] getInterfaces() { + public List getInterfaces() { throw new UnsupportedOperationException(); } @@ -266,12 +260,12 @@ public Assumptions.AssumptionResult findUniqueConcreteMethod } @Override - public ResolvedJavaField[] getInstanceFields(boolean includeSuperclasses) { + public List getInstanceFields(boolean includeSuperclasses) { throw new UnsupportedOperationException(); } @Override - public ResolvedJavaField[] getStaticFields() { + public List getStaticFields() { throw new UnsupportedOperationException(); } @@ -301,26 +295,26 @@ public ResolvedJavaType getEnclosingType() { } @Override - public ResolvedJavaMethod[] getDeclaredConstructors() { + public List getDeclaredConstructors() { return getDeclaredConstructors(true); } @Override - public ResolvedJavaMethod[] getDeclaredMethods() { + public List getDeclaredMethods() { return getDeclaredMethods(true); } @Override - public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) { + public List getDeclaredMethods(boolean forceLink) { GraalError.guarantee(!forceLink, "only use getDeclaredMethods without forcing to link, because linking can throw LinkageError"); if (methods == null) { - return new ResolvedJavaMethod[0]; + return List.of(); } - return methods.clone(); + return List.copyOf(methods); } @Override - public List getAllMethods(boolean forceLink) { + public List getAllMethods(boolean forceLink) { throw new UnsupportedOperationException(); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotBackend.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotBackend.java index f0ce7da5f738..e5035836ab91 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotBackend.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotBackend.java @@ -100,6 +100,8 @@ import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + /** * HotSpot AArch64 specific backend. */ @@ -439,7 +441,7 @@ private void emitCodePrefix(CompilationResultBuilder crb, ResolvedJavaMethod ins Label verifiedStub = new Label(); HotSpotProviders providers = getProviders(); if (installedCodeOwner != null && !isStatic(installedCodeOwner.getModifiers())) { - JavaType[] parameterTypes = {providers.getMetaAccess().lookupJavaType(Object.class)}; + List parameterTypes = List.of(providers.getMetaAccess().lookupJavaType(Object.class)); CallingConvention cc = regConfig.getCallingConvention(HotSpotCallingConventionType.JavaCallee, null, parameterTypes, this); Register receiver = asRegister(cc.getArgument(0)); int size = config.useCompressedClassPointers ? 32 : 64; diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotNodeLIRBuilder.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotNodeLIRBuilder.java index 179cb2d75bf3..51f79e896c6b 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotNodeLIRBuilder.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotNodeLIRBuilder.java @@ -71,6 +71,8 @@ import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.Value; +import java.util.List; + /** * LIR generator specialized for AArch64 HotSpot. */ @@ -185,7 +187,7 @@ public void visitBreakpointNode(BreakpointNode node) { sig[i] = node.arguments().get(i).stamp(NodeView.DEFAULT).javaType(gen.getMetaAccess()); } - Value[] parameters = visitInvokeArguments(gen.getRegisterConfig().getCallingConvention(HotSpotCallingConventionType.JavaCall, null, sig, gen), node.arguments()); + Value[] parameters = visitInvokeArguments(gen.getRegisterConfig().getCallingConvention(HotSpotCallingConventionType.JavaCall, null, List.of(sig), gen), node.arguments()); append(new AArch64BreakpointOp(parameters)); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotBackend.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotBackend.java index f69617a1c8e5..705e11532203 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotBackend.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotBackend.java @@ -87,6 +87,8 @@ import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + /** * HotSpot AMD64 specific backend. */ @@ -346,7 +348,7 @@ private void emitCodeHelper(CompilationResultBuilder crb, ResolvedJavaMethod ins public void emitCodePrefix(ResolvedJavaMethod installedCodeOwner, CompilationResultBuilder crb, AMD64MacroAssembler asm, RegisterConfig regConfig) { HotSpotProviders providers = getProviders(); if (installedCodeOwner != null && !installedCodeOwner.isStatic()) { - JavaType[] parameterTypes = {providers.getMetaAccess().lookupJavaType(Object.class)}; + List parameterTypes = List.of(providers.getMetaAccess().lookupJavaType(Object.class)); CallingConvention cc = regConfig.getCallingConvention(HotSpotCallingConventionType.JavaCallee, null, parameterTypes, this); Register receiver = asRegister(cc.getArgument(0)); int before; diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java index b311ac412d60..c5256ca774df 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java @@ -69,6 +69,8 @@ import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.Value; +import java.util.List; + /** * LIR generator specialized for AMD64 HotSpot. */ @@ -188,7 +190,7 @@ public void visitBreakpointNode(BreakpointNode node) { sig[i] = node.arguments().get(i).stamp(NodeView.DEFAULT).javaType(gen.getMetaAccess()); } - Value[] parameters = visitInvokeArguments(gen.getRegisterConfig().getCallingConvention(HotSpotCallingConventionType.JavaCall, null, sig, gen), node.arguments()); + Value[] parameters = visitInvokeArguments(gen.getRegisterConfig().getCallingConvention(HotSpotCallingConventionType.JavaCall, null, List.of(sig), gen), node.arguments()); append(new AMD64BreakpointOp(parameters)); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java index d7630c38cf40..cf76848fa82c 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java @@ -851,7 +851,7 @@ private void lowerInvoke(Invoke invoke, LoweringTool tool, StructuredGraph graph receiver = nonNullReceiver; } } - JavaType[] signature = callTarget.targetMethod().getSignature().toParameterTypes(callTarget.isStatic() ? null : callTarget.targetMethod().getDeclaringClass()); + List signature = callTarget.targetMethod().getSignature().toParameterTypes(callTarget.isStatic() ? null : callTarget.targetMethod().getDeclaringClass()); LoweredCallTargetNode loweredCallTarget = null; OptionValues options = graph.getOptions(); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotDirectCallTargetNode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotDirectCallTargetNode.java index 2779939f50eb..c6ab415e66c0 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotDirectCallTargetNode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotDirectCallTargetNode.java @@ -34,11 +34,13 @@ import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + @NodeInfo public final class HotSpotDirectCallTargetNode extends DirectCallTargetNode { public static final NodeClass TYPE = NodeClass.create(HotSpotDirectCallTargetNode.class); - public HotSpotDirectCallTargetNode(ValueNode[] arguments, StampPair returnStamp, JavaType[] signature, ResolvedJavaMethod target, Type callType, InvokeKind invokeKind) { + public HotSpotDirectCallTargetNode(ValueNode[] arguments, StampPair returnStamp, List signature, ResolvedJavaMethod target, Type callType, InvokeKind invokeKind) { super(TYPE, arguments, returnStamp, signature, target, callType, invokeKind); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotIndirectCallTargetNode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotIndirectCallTargetNode.java index f74f96177a27..8d601f69d88c 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotIndirectCallTargetNode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotIndirectCallTargetNode.java @@ -34,15 +34,16 @@ import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + @NodeInfo public final class HotSpotIndirectCallTargetNode extends IndirectCallTargetNode { public static final NodeClass TYPE = NodeClass.create(HotSpotIndirectCallTargetNode.class); @Input ValueNode metaspaceMethod; - public HotSpotIndirectCallTargetNode(ValueNode metaspaceMethod, ValueNode computedAddress, ValueNode[] arguments, StampPair returnStamp, JavaType[] signature, - ResolvedJavaMethod target, - Type callType, InvokeKind invokeKind) { + public HotSpotIndirectCallTargetNode(ValueNode metaspaceMethod, ValueNode computedAddress, ValueNode[] arguments, StampPair returnStamp, + List signature, ResolvedJavaMethod target, Type callType, InvokeKind invokeKind) { super(TYPE, computedAddress, arguments, returnStamp, signature, target, callType, invokeKind); this.metaspaceMethod = metaspaceMethod; } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BciBlockMapping.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BciBlockMapping.java index 6d768aaff17a..621826692db7 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BciBlockMapping.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BciBlockMapping.java @@ -767,7 +767,7 @@ public String toString() { */ private boolean unresolvedExceptionHandlerReachability = false; - protected final ExceptionHandler[] exceptionHandlers; + protected final List exceptionHandlers; protected BitSet[] bciExceptionHandlerIDs; private BciBlock startBlock; private BciBlock[] loopHeaders; @@ -787,7 +787,7 @@ public String toString() { protected BciBlockMapping(Bytecode code, DebugContext debug) { this.code = code; this.debug = debug; - this.exceptionHandlers = code.getExceptionHandlers().length != 0 ? code.getExceptionHandlers() : null; + this.exceptionHandlers = code.getExceptionHandlers(); this.blockMap = new BciBlock[code.getCodeSize()]; } @@ -801,7 +801,7 @@ public BitSet getBciExceptionHandlerIDs(int bci) { } public BciBlock getHandlerBlock(int handlerID) { - int handlerBci = exceptionHandlers[handlerID].getHandlerBCI(); + int handlerBci = exceptionHandlers.get(handlerID).getHandlerBCI(); assert blockMap[handlerBci] != null; return blockMap[handlerBci]; } @@ -967,8 +967,8 @@ private void computeBciExceptionHandlerIDs(BytecodeStream stream) { } /* Process which handlers can be taken from each bci. */ - for (int handlerID = exceptionHandlers.length - 1; handlerID >= 0; handlerID--) { - ExceptionHandler h = exceptionHandlers[handlerID]; + for (int handlerID = exceptionHandlers.size() - 1; handlerID >= 0; handlerID--) { + ExceptionHandler h = exceptionHandlers.get(handlerID); for (int bci = h.getStartBCI(); bci < h.getEndBCI(); bci++) { BitSet currentIDs = bciExceptionHandlerIDs[bci]; if (currentIDs == null) { @@ -1027,8 +1027,7 @@ protected Set makeExceptionEntries(boolean splitRanges) { Set requestedBlockStarts = new HashSet<>(); // start basic blocks at all exception handler blocks and mark them as exception entries - for (int i = 0; i < exceptionHandlers.length; i++) { - ExceptionHandler h = exceptionHandlers[i]; + for (ExceptionHandler h : exceptionHandlers) { BciBlock xhandler = startNewBlock(h.getHandlerBCI()); xhandler.setIsExceptionEntry(); requestedBlockStarts.add(xhandler); @@ -1567,7 +1566,7 @@ protected ExceptionDispatchBlock handleExceptions(int bci, boolean processNewBlo * We do not reuse exception dispatch blocks, because nested exception handlers * might have problems reasoning about the correct frame state. */ - ExceptionDispatchBlock curHandler = new ExceptionDispatchBlock(exceptionHandlers[handlerID], handlerID, bci); + ExceptionDispatchBlock curHandler = new ExceptionDispatchBlock(exceptionHandlers.get(handlerID), handlerID, bci); dispatchBlocks++; curHandler.addSuccessor(getHandlerBlock(handlerID)); if (lastHandler != null) { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BytecodeParser.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BytecodeParser.java index 2b851931a363..b82001699f3b 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BytecodeParser.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BytecodeParser.java @@ -509,7 +509,7 @@ public FrameState getInvocationPluginReturnState(JavaKind returnKind, ValueNode if (returnVal != null) { // Push the return value on the top of stack FrameState newFrameState = frameStateBuilder.create(stream.nextBCI(), getNonIntrinsicAncestor(), false, - new JavaKind[]{returnKind}, new ValueNode[]{returnVal}); + List.of(returnKind), new ValueNode[]{returnVal}); return newFrameState; } else if (returnKind != JavaKind.Void) { throw new InternalError(); @@ -524,7 +524,7 @@ public FrameState getInvocationPluginReturnState(JavaKind returnKind, ValueNode public FrameState getInvocationPluginBeforeState() { assert isParsingInvocationPlugin(); ResolvedJavaMethod callee = invocationPluginContext.targetMethod; - JavaKind[] argSlotKinds = callee.getSignature().toParameterKinds(!callee.isStatic()); + List argSlotKinds = callee.getSignature().toParameterKinds(!callee.isStatic()); return frameState.create(bci(), getNonIntrinsicAncestor(), false, argSlotKinds, invocationPluginContext.args); } @@ -568,7 +568,7 @@ static class InliningScope implements AutoCloseable { assert !parser.parsingIntrinsic(); this.parser = parser; mark = parser.getGraph().getMark(); - JavaKind[] argSlotKinds = callee.getSignature().toParameterKinds(!callee.isStatic()); + List argSlotKinds = callee.getSignature().toParameterKinds(!callee.isStatic()); stateBefore = parser.frameState.create(parser.bci(), parser.getNonIntrinsicAncestor(), false, argSlotKinds, args); } @@ -602,7 +602,7 @@ protected void processPlaceholderFrameStates() { // Swap the top-of-stack value with the return value ValueNode tos = frameStateBuilder.pop(returnKind); assert tos.getStackKind() == returnVal.getStackKind() : Assertions.errorMessage(tos, returnVal); - FrameState newFrameState = frameStateBuilder.create(parser.stream.nextBCI(), parser.getNonIntrinsicAncestor(), false, new JavaKind[]{returnKind}, + FrameState newFrameState = frameStateBuilder.create(parser.stream.nextBCI(), parser.getNonIntrinsicAncestor(), false, List.of(returnKind), new ValueNode[]{returnVal}); frameState.replaceAndDelete(newFrameState); newFrameState.setNodeSourcePosition(frameState.getNodeSourcePosition()); @@ -2214,7 +2214,6 @@ private void emitCheckForDeclaringClassChange(ResolvedJavaType declaringClass, V */ protected void emitCheckForInvokeSuperSpecial(ValueNode[] args) { ResolvedJavaType callingClass = method.getDeclaringClass(); - callingClass = getHostClass(callingClass); if (callingClass.isInterface()) { args[0] = emitIncompatibleClassChangeCheck(args[0], callingClass); } @@ -2232,12 +2231,6 @@ protected ValueNode emitIncompatibleClassChangeCheck(ValueNode object, ResolvedJ return append(PiNode.create(object, StampFactory.object(checkedTypeRef, true), guardingNode)); } - @SuppressWarnings("deprecation") - private static ResolvedJavaType getHostClass(ResolvedJavaType type) { - ResolvedJavaType hostClass = type.getHostClass(); - return hostClass != null ? hostClass : type; - } - protected JavaTypeProfile getProfileForInvoke(InvokeKind invokeKind) { if (invokeKind.isIndirect() && profilingInfo != null && this.optimisticOpts.useTypeCheckHints(getOptions())) { return profilingInfo.getTypeProfile(bci()); @@ -5453,9 +5446,8 @@ protected void genPutStatic(JavaField field) { ResolvedJavaType holder = resolvedField.getDeclaringClass(); if (classInitializationPlugin != null) { Supplier stateBefore = () -> { - JavaKind[] pushedSlotKinds = {field.getJavaKind()}; ValueNode[] pushedValues = {value}; - FrameState fs = frameState.create(bci(), getNonIntrinsicAncestor(), false, pushedSlotKinds, pushedValues); + FrameState fs = frameState.create(bci(), getNonIntrinsicAncestor(), false, List.of(field.getJavaKind()), pushedValues); assert stackSizeBefore == fs.stackSize() : Assertions.errorMessageContext("stackSizeBefore", stackSizeBefore, "fs.stackSize", fs.stackSize(), "fs", fs); return fs; }; diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/FrameStateBuilder.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/FrameStateBuilder.java index 26cfbb62cc45..df5e103fcb8f 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/FrameStateBuilder.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/FrameStateBuilder.java @@ -365,13 +365,13 @@ public FrameState create(int bci, StateSplit forStateSplit) { * @param pushedValues if non-null, values to {@link #push(JavaKind, ValueNode)} to the stack * before creating the {@link FrameState} */ - public FrameState create(int bci, BytecodeParser parent, boolean duringCall, JavaKind[] pushedSlotKinds, ValueNode[] pushedValues) { + public FrameState create(int bci, BytecodeParser parent, boolean duringCall, List pushedSlotKinds, ValueNode[] pushedValues) { if (outerFrameState == null && parent != null) { assert !parent.parsingIntrinsic() : "must already have the next non-intrinsic ancestor"; outerFrameState = parent.getFrameStateBuilder().create(parent.bci(), parent.getNonIntrinsicAncestor(), true, null, null); } if (bci == BytecodeFrame.AFTER_EXCEPTION_BCI && parent != null) { - return outerFrameState.duplicateModified(graph, outerFrameState.bci, FrameState.StackState.Rethrow, JavaKind.Void, new JavaKind[]{JavaKind.Object}, new ValueNode[]{stack[0]}, + return outerFrameState.duplicateModified(graph, outerFrameState.bci, FrameState.StackState.Rethrow, JavaKind.Void, List.of(JavaKind.Object), new ValueNode[]{stack[0]}, null); } if (bci == BytecodeFrame.INVALID_FRAMESTATE_BCI) { @@ -400,7 +400,7 @@ public FrameState create(int bci, BytecodeParser parent, boolean duringCall, Jav * state; may be {@code null} if no values are to be pushed. See * {@link #create(int, BytecodeParser, boolean, JavaKind[], ValueNode[])}. */ - private void verifyStackEffect(int bci, JavaKind[] pushedSlotKinds) { + private void verifyStackEffect(int bci, List pushedSlotKinds) { if (parser != null && (!parser.parsingIntrinsic() && parser.graphBuilderConfig.insertFullInfopoints())) { /* * We might be building the state for an infopoint, be less strict than for state diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/LambdaUtils.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/LambdaUtils.java index e65f0a13e43c..1986a20462a0 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/LambdaUtils.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/LambdaUtils.java @@ -35,6 +35,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import jdk.graal.compiler.bytecode.BytecodeStream; import jdk.graal.compiler.debug.GraalError; @@ -42,6 +43,7 @@ import jdk.vm.ci.common.JVMCIError; import jdk.vm.ci.meta.ConstantPool; import jdk.vm.ci.meta.JavaMethod; +import jdk.vm.ci.meta.ResolvedJavaField; import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaType; @@ -78,12 +80,12 @@ private LambdaUtils() { */ @SuppressWarnings("try") public static String findStableLambdaName(ResolvedJavaType lambdaType) { - ResolvedJavaMethod[] lambdaProxyMethods = Arrays.stream(lambdaType.getDeclaredMethods(false)).filter(m -> !m.isBridge() && m.isPublic()).toArray(ResolvedJavaMethod[]::new); + List lambdaProxyMethods = lambdaType.getDeclaredMethods(false).stream().filter(m -> !m.isBridge() && m.isPublic()).collect(Collectors.toList()); /* * Take only the first method to find invoked methods, because the result would be the same * for all other methods. */ - List invokedMethods = findInvokedMethods(lambdaProxyMethods[0]); + List invokedMethods = findInvokedMethods(lambdaProxyMethods.getFirst()); if (invokedMethods.isEmpty()) { StringBuilder sb = new StringBuilder(); sb.append("Lambda without a target invoke: ").append(lambdaType.toClassName()); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/DirectCallTargetNode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/DirectCallTargetNode.java index 0b1a06d1ba46..ff1fec9a4e57 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/DirectCallTargetNode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/DirectCallTargetNode.java @@ -32,18 +32,20 @@ import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + @NodeInfo public class DirectCallTargetNode extends LoweredCallTargetNode { public static final NodeClass TYPE = NodeClass.create(DirectCallTargetNode.class); - public DirectCallTargetNode(ValueNode[] arguments, StampPair returnStamp, JavaType[] signature, ResolvedJavaMethod target, CallingConvention.Type callType, + public DirectCallTargetNode(ValueNode[] arguments, StampPair returnStamp, List signature, ResolvedJavaMethod target, CallingConvention.Type callType, InvokeKind invokeKind) { this(TYPE, arguments, returnStamp, signature, target, callType, invokeKind); } - protected DirectCallTargetNode(NodeClass c, ValueNode[] arguments, StampPair returnStamp, JavaType[] signature, ResolvedJavaMethod target, - CallingConvention.Type callType, InvokeKind invokeKind) { + protected DirectCallTargetNode(NodeClass c, ValueNode[] arguments, StampPair returnStamp, List signature, ResolvedJavaMethod target, + CallingConvention.Type callType, InvokeKind invokeKind) { super(c, arguments, returnStamp, signature, target, callType, invokeKind); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/FrameState.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/FrameState.java index 6bfe61a69580..66c0867138c8 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/FrameState.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/FrameState.java @@ -319,7 +319,7 @@ public FrameState(FrameState outerFrameState, ValueNode[] locals, ValueNode[] stack, int stackSize, - JavaKind[] pushedSlotKinds, + List pushedSlotKinds, ValueNode[] pushedValues, ValueNode[] locks, List monitorIds, @@ -336,7 +336,7 @@ public void invalidateForDeoptimization() { validForDeoptimization = false; } - private static int computeSize(JavaKind[] slotKinds) { + private static int computeSize(List slotKinds) { int result = 0; if (slotKinds != null) { for (JavaKind slotKind : slotKinds) { @@ -346,7 +346,7 @@ private static int computeSize(JavaKind[] slotKinds) { return result; } - private void createValues(ValueNode[] locals, ValueNode[] stack, int initialStackSize, JavaKind[] pushedSlotKinds, ValueNode[] pushedValues, ValueNode[] locks) { + private void createValues(ValueNode[] locals, ValueNode[] stack, int initialStackSize, List pushedSlotKinds, ValueNode[] pushedValues, ValueNode[] locks) { assert this.values == null : Assertions.errorMessage(this.values); int lastNonNullLocal = locals.length - 1; while (lastNonNullLocal >= 0) { @@ -373,10 +373,10 @@ private void createValues(ValueNode[] locals, ValueNode[] stack, int initialStac this.values.initialize(index++, value); } if (pushedValues != null) { - assert pushedSlotKinds.length == pushedValues.length : Assertions.errorMessage(pushedSlotKinds, pushedValues, this); + assert pushedSlotKinds.size() == pushedValues.length : Assertions.errorMessage(pushedSlotKinds, pushedValues, this); for (int i = 0; i < pushedValues.length; i++) { this.values.initialize(index++, pushedValues[i]); - if (pushedSlotKinds[i].needsTwoSlots()) { + if (pushedSlotKinds.get(i).needsTwoSlots()) { this.values.initialize(index++, null); } } @@ -557,7 +557,7 @@ public FrameState duplicateModifiedDuringCall(int newBci, JavaKind popKind) { public FrameState duplicateModifiedBeforeCall(int newBci, JavaKind popKind, - JavaKind[] pushedSlotKinds, + List pushedSlotKinds, ValueNode[] pushedValues, List pushedVirtualObjectMappings) { return duplicateModified(graph(), newBci, StackState.BeforePop, popKind, pushedSlotKinds, pushedValues, pushedVirtualObjectMappings); @@ -573,14 +573,14 @@ public FrameState duplicateModified(JavaKind popKind, List pushedVirtualObjectMappings) { assert pushedValue != null; assert pushedValue.getStackKind() == pushedSlotKind : Assertions.errorMessage(pushedValue, popKind, this); - return duplicateModified(graph(), bci, stackState, popKind, new JavaKind[]{pushedSlotKind}, new ValueNode[]{pushedValue}, pushedVirtualObjectMappings); + return duplicateModified(graph(), bci, stackState, popKind, List.of(pushedSlotKind), new ValueNode[]{pushedValue}, pushedVirtualObjectMappings); } public FrameState duplicateModified(StructuredGraph graph, int newBci, StackState newStackState, JavaKind popKind, - JavaKind[] pushedSlotKinds, + List pushedSlotKinds, ValueNode[] pushedValues, List pushedVirtualObjectMappings) { return duplicateModified(graph, newBci, newStackState, popKind, pushedSlotKinds, pushedValues, pushedVirtualObjectMappings, true); @@ -596,7 +596,7 @@ public FrameState duplicateModified(StructuredGraph graph, int newBci, StackState newStackState, JavaKind popKind, - JavaKind[] pushedSlotKinds, + List pushedSlotKinds, ValueNode[] pushedValues, List pushedVirtualObjectMappings, boolean checkStackDepth) { @@ -605,9 +605,9 @@ public FrameState duplicateModified(StructuredGraph graph, int copyStackSize; int newStackSize = 0; if (pushedValues != null) { - assert pushedSlotKinds.length == pushedValues.length : Assertions.errorMessage(pushedSlotKinds, pushedValues); + assert pushedSlotKinds.size() == pushedValues.length : Assertions.errorMessage(pushedSlotKinds, pushedValues); for (int i = 0; i < pushedValues.length; i++) { - newStackSize += pushedSlotKinds[i].getSlotCount(); + newStackSize += pushedSlotKinds.get(i).getSlotCount(); } } if (newStackState == StackState.Rethrow && stackState != StackState.Rethrow && popKind == JavaKind.Void) { @@ -651,7 +651,7 @@ public FrameState duplicateModified(StructuredGraph graph, copiedVirtualObjectMappings = ensureHasVirtualObjectMapping((VirtualObjectNode) pushedValue, pushedVirtualObjectMappings, copiedVirtualObjectMappings); } newValues.add(pushedValue); - if (pushedSlotKinds[i].needsTwoSlots()) { + if (pushedSlotKinds.get(i).needsTwoSlots()) { newValues.add(null); } } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/IndirectCallTargetNode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/IndirectCallTargetNode.java index d3ef1afd08ca..4c015d7a0acc 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/IndirectCallTargetNode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/IndirectCallTargetNode.java @@ -32,21 +32,21 @@ import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + @NodeInfo public class IndirectCallTargetNode extends LoweredCallTargetNode { public static final NodeClass TYPE = NodeClass.create(IndirectCallTargetNode.class); @Input protected ValueNode computedAddress; - public IndirectCallTargetNode(ValueNode computedAddress, ValueNode[] arguments, StampPair returnStamp, JavaType[] signature, ResolvedJavaMethod target, - CallingConvention.Type callType, - InvokeKind invokeKind) { + public IndirectCallTargetNode(ValueNode computedAddress, ValueNode[] arguments, StampPair returnStamp, List signature, ResolvedJavaMethod target, + CallingConvention.Type callType, InvokeKind invokeKind) { this(TYPE, computedAddress, arguments, returnStamp, signature, target, callType, invokeKind); } protected IndirectCallTargetNode(NodeClass c, ValueNode computedAddress, ValueNode[] arguments, StampPair returnStamp, - JavaType[] signature, - ResolvedJavaMethod target, CallingConvention.Type callType, InvokeKind invokeKind) { + List signature, ResolvedJavaMethod target, CallingConvention.Type callType, InvokeKind invokeKind) { super(c, arguments, returnStamp, signature, target, callType, invokeKind); this.computedAddress = computedAddress; } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/LoweredCallTargetNode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/LoweredCallTargetNode.java index 72987edd5601..d8e5acbb5101 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/LoweredCallTargetNode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/LoweredCallTargetNode.java @@ -32,22 +32,23 @@ import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + @NodeInfo public abstract class LoweredCallTargetNode extends CallTargetNode { public static final NodeClass TYPE = NodeClass.create(LoweredCallTargetNode.class); - protected final JavaType[] signature; + protected final List signature; protected final CallingConvention.Type callType; - protected LoweredCallTargetNode(NodeClass c, ValueNode[] arguments, StampPair returnStamp, JavaType[] signature, - ResolvedJavaMethod target, - CallingConvention.Type callType, InvokeKind invokeKind) { + protected LoweredCallTargetNode(NodeClass c, ValueNode[] arguments, StampPair returnStamp, + List signature, ResolvedJavaMethod target, CallingConvention.Type callType, InvokeKind invokeKind) { super(c, arguments, target, invokeKind, returnStamp); this.signature = signature; this.callType = callType; } - public JavaType[] signature() { + public List signature() { return signature; } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/TypeCheckHints.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/TypeCheckHints.java index c1dfa535d348..afb739f068f3 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/TypeCheckHints.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/TypeCheckHints.java @@ -25,6 +25,7 @@ package jdk.graal.compiler.nodes; import java.util.Arrays; +import java.util.List; import jdk.graal.compiler.core.common.type.TypeReference; @@ -113,9 +114,9 @@ private static Hint[] makeHints(TypeReference targetType, JavaTypeProfile profil Hint[] hintsBuf = NO_HINTS; if (profile != null) { double notRecordedTypes = profile.getNotRecordedProbability(); - ProfiledType[] ptypes = profile.getTypes(); - if (notRecordedTypes < (1D - minHintHitProbability) && ptypes != null && ptypes.length > 0) { - hintsBuf = new Hint[ptypes.length]; + List ptypes = profile.getTypes(); + if (notRecordedTypes < (1D - minHintHitProbability) && ptypes != null && !ptypes.isEmpty()) { + hintsBuf = new Hint[ptypes.size()]; int hintCount = 0; for (ProfiledType ptype : ptypes) { if (targetType != null) { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/extended/BoxNode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/extended/BoxNode.java index bdc632ad0011..6de3616d06f6 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/extended/BoxNode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/extended/BoxNode.java @@ -145,7 +145,7 @@ public void virtualize(VirtualizerTool tool) { ValueNode alias = tool.getAlias(getValue()); VirtualBoxingNode newVirtual = createVirtualBoxingNode(); - assert newVirtual.getFields().length == 1 : Assertions.errorMessage(this, newVirtual); + assert newVirtual.getFields().size() == 1 : Assertions.errorMessage(this, newVirtual); tool.createVirtualObject(newVirtual, new ValueNode[]{alias}, Collections. emptyList(), getNodeSourcePosition(), false); tool.replaceWithVirtual(newVirtual); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/graphbuilderconf/InvocationPlugins.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/graphbuilderconf/InvocationPlugins.java index 0c666da8da77..f272cc3fdc02 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/graphbuilderconf/InvocationPlugins.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/graphbuilderconf/InvocationPlugins.java @@ -1249,7 +1249,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(false); + var methods = declaringClass.getDeclaredMethods(false); if (plugin.name.equals("")) { for (ResolvedJavaMethod m : methods) { if (m.getName().equals("") && m.getSignature().toMethodDescriptor().startsWith(plugin.argumentsDescriptor)) { @@ -1260,8 +1260,7 @@ public static ResolvedJavaMethod resolveJavaMethod(ResolvedJavaType declaringCla } ResolvedJavaMethod match = null; - for (int i = 0; i < methods.length; ++i) { - ResolvedJavaMethod m = methods[i]; + for (ResolvedJavaMethod m : methods) { if (plugin.isSameType(m)) { if (match == null) { match = m; @@ -1275,7 +1274,7 @@ public static ResolvedJavaMethod resolveJavaMethod(ResolvedJavaType declaringCla } else { if (!mReturnType.isAssignableFrom(matchReturnType)) { throw new NoSuchMethodError(String.format( - "Found 2 methods with same name and parameter types but unrelated return types:%n %s%n %s", match, m)); + "Found 2 methods with same name and parameter types but unrelated return types:%n %s%n %s", match, m)); } } } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/java/NewInstanceNode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/java/NewInstanceNode.java index d1466593247c..5acd4f82977b 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/java/NewInstanceNode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/java/NewInstanceNode.java @@ -26,6 +26,7 @@ import java.lang.ref.Reference; import java.util.Collections; +import java.util.List; import jdk.graal.compiler.core.common.type.StampFactory; import jdk.graal.compiler.core.common.type.TypeReference; @@ -83,10 +84,10 @@ public void virtualize(VirtualizerTool tool) { if (!tool.getMetaAccess().lookupJavaType(Reference.class).isAssignableFrom(instanceClass) && tool.getMetaAccessExtensionProvider().canVirtualize(instanceClass)) { VirtualInstanceNode virtualObject = new VirtualInstanceNode(instanceClass(), true); - ResolvedJavaField[] fields = virtualObject.getFields(); - ValueNode[] state = new ValueNode[fields.length]; + List fields = virtualObject.getFields(); + ValueNode[] state = new ValueNode[fields.size()]; for (int i = 0; i < state.length; i++) { - state[i] = ConstantNode.defaultForKind(tool.getMetaAccessExtensionProvider().getStorageKind(fields[i].getType()), graph()); + state[i] = ConstantNode.defaultForKind(tool.getMetaAccessExtensionProvider().getStorageKind(fields.get(i).getType()), graph()); } tool.createVirtualObject(virtualObject, state, Collections. emptyList(), getNodeSourcePosition(), false); tool.replaceWithVirtual(virtualObject); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/spi/SnippetParameterInfo.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/spi/SnippetParameterInfo.java index 9c34940c829c..a6aeab720a57 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/spi/SnippetParameterInfo.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/spi/SnippetParameterInfo.java @@ -145,11 +145,12 @@ private boolean initNames(ResolvedJavaMethod method, int parameterCount) { names[0] = "this"; offset = 1; } - ResolvedJavaMethod.Parameter[] params = method.getParameters(); + List params = method.getParameters(); if (params != null) { + // TODO what does null array mean previously? for (int i = offset; i < names.length; i++) { - if (params[i - offset].isNamePresent()) { - names[i] = params[i - offset].getName(); + if (params.get(i - offset).isNamePresent()) { + names[i] = params.get(i - offset).getName(); } } } else { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/virtual/VirtualInstanceNode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/virtual/VirtualInstanceNode.java index 1a147eadb3b5..31aaa65b481f 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/virtual/VirtualInstanceNode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/virtual/VirtualInstanceNode.java @@ -36,18 +36,20 @@ import jdk.vm.ci.meta.ResolvedJavaField; import jdk.vm.ci.meta.ResolvedJavaType; +import java.util.List; + @NodeInfo(nameTemplate = "VirtualInstance({p#objectId}) {p#type/s}") public class VirtualInstanceNode extends VirtualObjectNode { public static final NodeClass TYPE = NodeClass.create(VirtualInstanceNode.class); protected final ResolvedJavaType type; - protected final ResolvedJavaField[] fields; + protected final List fields; public VirtualInstanceNode(ResolvedJavaType type, boolean hasIdentity) { this(type, type.getInstanceFields(true), hasIdentity); } - public VirtualInstanceNode(ResolvedJavaType type, ResolvedJavaField[] fields, boolean hasIdentity) { + public VirtualInstanceNode(ResolvedJavaType type, List fields, boolean hasIdentity) { this(TYPE, type, fields, hasIdentity); } @@ -55,7 +57,7 @@ protected VirtualInstanceNode(NodeClass c, Resolv this(c, type, type.getInstanceFields(true), hasIdentity); } - protected VirtualInstanceNode(NodeClass c, ResolvedJavaType type, ResolvedJavaField[] fields, boolean hasIdentity) { + protected VirtualInstanceNode(NodeClass c, ResolvedJavaType type, List fields, boolean hasIdentity) { super(c, type, hasIdentity); this.type = type; this.fields = fields; @@ -68,14 +70,14 @@ public ResolvedJavaType type() { @Override public int entryCount() { - return fields.length; + return fields.size(); } public ResolvedJavaField field(int index) { - return fields[index]; + return fields.get(index); } - public ResolvedJavaField[] getFields() { + public List getFields() { return fields; } @@ -90,13 +92,13 @@ public String toString(Verbosity verbosity) { @Override public String entryName(int index) { - return fields[index].getName(); + return fields.get(index).getName(); } public int fieldIndex(ResolvedJavaField field) { // on average fields.length == ~6, so a linear search is fast enough - for (int i = 0; i < fields.length; i++) { - if (fields[i].equals(field)) { + for (int i = 0; i < fields.size(); i++) { + if (fields.get(i).equals(field)) { return i; } } @@ -110,8 +112,8 @@ public int entryIndexForOffset(MetaAccessProvider metaAccess, long constantOffse @Override public JavaKind entryKind(MetaAccessExtensionProvider metaAccessExtensionProvider, int index) { - assert index >= 0 && index < fields.length : Assertions.errorMessageContext("index", index, "fields", fields); - return metaAccessExtensionProvider.getStorageKind(fields[index].getType()); + assert index >= 0 && index < fields.size() : Assertions.errorMessageContext("index", index, "fields", fields); + return metaAccessExtensionProvider.getStorageKind(fields.get(index).getType()); } @Override diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/phases/common/inlining/walker/InliningData.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/phases/common/inlining/walker/InliningData.java index 025d87ea15e4..e3e4d4caaa39 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/phases/common/inlining/walker/InliningData.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/phases/common/inlining/walker/InliningData.java @@ -33,6 +33,7 @@ import java.util.BitSet; import java.util.Iterator; import java.util.LinkedList; +import java.util.List; import org.graalvm.collections.EconomicSet; import org.graalvm.collections.Equivalence; @@ -264,8 +265,8 @@ private InlineInfo getTypeCheckedInlineInfo(Invoke invoke, ResolvedJavaMethod ta return null; } - JavaTypeProfile.ProfiledType[] ptypes = typeProfile.getTypes(); - if (ptypes == null || ptypes.length <= 0) { + List ptypes = typeProfile.getTypes(); + if (ptypes == null || ptypes.size() <= 0) { InliningUtil.traceNotInlinedMethod(invoke, inliningDepth(), targetMethod, "no types in profile"); graph.notifyInliningDecision(invoke, false, "InliningPhase", null, null, null, invoke.getTargetMethod(), "no types in profile"); return null; @@ -288,14 +289,14 @@ private InlineInfo getTypeCheckedInlineInfo(Invoke invoke, ResolvedJavaMethod ta } } - if (ptypes.length == 1 && notRecordedTypeProbability == 0 && !speculationFailed) { + if (ptypes.size() == 1 && notRecordedTypeProbability == 0 && !speculationFailed) { if (!optimisticOpts.inlineMonomorphicCalls(options)) { InliningUtil.traceNotInlinedMethod(invoke, inliningDepth(), targetMethod, "inlining monomorphic calls is disabled"); graph.notifyInliningDecision(invoke, false, "InliningPhase", null, null, null, invoke.getTargetMethod(), "inlining monomorphic calls is disabled"); return null; } - ResolvedJavaType type = ptypes[0].getType(); + ResolvedJavaType type = ptypes.getFirst().getType(); assert type.isArray() || type.isConcrete(); ResolvedJavaMethod concrete = type.resolveConcreteMethod(targetMethod, contextType); if (!checkTargetConditions(invoke, concrete)) { @@ -306,32 +307,32 @@ private InlineInfo getTypeCheckedInlineInfo(Invoke invoke, ResolvedJavaMethod ta invoke.setPolymorphic(true); if (!optimisticOpts.inlinePolymorphicCalls(options) && notRecordedTypeProbability == 0) { - InliningUtil.traceNotInlinedMethod(invoke, inliningDepth(), targetMethod, "inlining polymorphic calls is disabled (%d types)", ptypes.length); - graph.notifyInliningDecision(invoke, false, "InliningPhase", null, null, null, invoke.getTargetMethod(), "inlining polymorphic calls is disabled (%d types)", ptypes.length); + InliningUtil.traceNotInlinedMethod(invoke, inliningDepth(), targetMethod, "inlining polymorphic calls is disabled (%d types)", ptypes.size()); + graph.notifyInliningDecision(invoke, false, "InliningPhase", null, null, null, invoke.getTargetMethod(), "inlining polymorphic calls is disabled (%d types)", ptypes.size()); return null; } if (!optimisticOpts.inlineMegamorphicCalls(options) && notRecordedTypeProbability > 0) { // due to filtering impossible types, notRecordedTypeProbability can be > 0 although // the number of types is lower than what can be recorded in a type profile - InliningUtil.traceNotInlinedMethod(invoke, inliningDepth(), targetMethod, "inlining megamorphic calls is disabled (%d types, %f %% not recorded types)", ptypes.length, + InliningUtil.traceNotInlinedMethod(invoke, inliningDepth(), targetMethod, "inlining megamorphic calls is disabled (%d types, %f %% not recorded types)", ptypes.size(), notRecordedTypeProbability * 100); graph.notifyInliningDecision(invoke, false, "InliningPhase", null, null, null, - invoke.getTargetMethod(), "inlining megamorphic calls is disabled (%d types, %f %% not recorded types)", ptypes.length, notRecordedTypeProbability); + invoke.getTargetMethod(), "inlining megamorphic calls is disabled (%d types, %f %% not recorded types)", ptypes.size(), notRecordedTypeProbability); return null; } // Find unique methods and their probabilities. ArrayList concreteMethods = new ArrayList<>(); ArrayList concreteMethodsProbabilities = new ArrayList<>(); - for (int i = 0; i < ptypes.length; i++) { - ResolvedJavaMethod concrete = ptypes[i].getType().resolveConcreteMethod(targetMethod, contextType); + for (JavaTypeProfile.ProfiledType ptype : ptypes) { + ResolvedJavaMethod concrete = ptype.getType().resolveConcreteMethod(targetMethod, contextType); if (concrete == null) { InliningUtil.traceNotInlinedMethod(invoke, inliningDepth(), targetMethod, "could not resolve method"); graph.notifyInliningDecision(invoke, false, "InliningPhase", null, null, null, invoke.getTargetMethod(), "could not resolve method"); return null; } int index = concreteMethods.indexOf(concrete); - double curProbability = ptypes[i].getProbability(); + double curProbability = ptype.getProbability(); if (index < 0) { index = concreteMethods.size(); concreteMethods.add(concrete); @@ -388,9 +389,9 @@ private InlineInfo getTypeCheckedInlineInfo(Invoke invoke, ResolvedJavaMethod ta if (usedTypes.isEmpty()) { // No type left that is worth checking for. - InliningUtil.traceNotInlinedMethod(invoke, inliningDepth(), targetMethod, "no types remaining after filtering less frequent types (%d types previously)", ptypes.length); + InliningUtil.traceNotInlinedMethod(invoke, inliningDepth(), targetMethod, "no types remaining after filtering less frequent types (%d types previously)", ptypes.size()); graph.notifyInliningDecision(invoke, false, "InliningPhase", null, null, null, invoke.getTargetMethod(), "no types remaining after filtering less frequent types (%d types previously)", - ptypes.length); + ptypes.size()); return null; } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/classfile/ClassfileBytecode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/classfile/ClassfileBytecode.java index 85223ec306b8..827157fc0550 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/classfile/ClassfileBytecode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/classfile/ClassfileBytecode.java @@ -27,6 +27,7 @@ import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; +import java.util.List; import jdk.graal.compiler.bytecode.Bytecode; import jdk.graal.compiler.bytecode.BytecodeProvider; @@ -130,9 +131,9 @@ public int getMaxStackSize() { } @Override - public ExceptionHandler[] getExceptionHandlers() { + public List getExceptionHandlers() { if (exceptionTableBytes == null) { - return new ExceptionHandler[0]; + return List.of(); } final int exceptionTableLength = exceptionTableBytes.length / EXCEPTION_HANDLER_TABLE_SIZE_IN_BYTES; @@ -165,7 +166,7 @@ public ExceptionHandler[] getExceptionHandlers() { } } - return handlers; + return List.of(handlers); } @Override diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/classfile/ClassfileBytecodeProvider.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/classfile/ClassfileBytecodeProvider.java index 6cab3c388b27..bea05852d47b 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/classfile/ClassfileBytecodeProvider.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/classfile/ClassfileBytecodeProvider.java @@ -27,6 +27,7 @@ import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.List; import jdk.graal.compiler.core.common.LibGraalSupport; import org.graalvm.collections.EconomicMap; @@ -248,7 +249,7 @@ ResolvedJavaMethod lookup(ResolvedJavaType type, String name, String descriptor) } } - private static EconomicMap createMethodMap(ResolvedJavaMethod[] methodArray) { + private static EconomicMap createMethodMap(List methodArray) { EconomicMap map = EconomicMap.create(); for (ResolvedJavaMethod m : methodArray) { map.put(new MethodKey(m.getName(), m.getSignature().toMethodDescriptor()), m); @@ -282,9 +283,9 @@ ResolvedJavaField lookup(ResolvedJavaType type, String name, String fieldType, b } } - private static EconomicMap createFieldMap(ResolvedJavaField[] fieldArray) { + private static EconomicMap createFieldMap(List fieldList) { EconomicMap map = EconomicMap.create(); - for (ResolvedJavaField f : fieldArray) { + for (ResolvedJavaField f : fieldList) { map.put(new FieldKey(f.getName(), f.getType().getName()), f); } return map; diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/nodes/ObjectClone.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/nodes/ObjectClone.java index 90be44788921..10748a49afc6 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/nodes/ObjectClone.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/nodes/ObjectClone.java @@ -25,6 +25,7 @@ package jdk.graal.compiler.replacements.nodes; import java.util.Collections; +import java.util.List; import jdk.graal.compiler.core.common.type.AbstractPointerStamp; import jdk.graal.compiler.core.common.type.ObjectStamp; @@ -121,11 +122,11 @@ default void virtualize(VirtualizerTool tool) { } if (!type.isArray()) { VirtualInstanceNode newVirtual = new VirtualInstanceNode(type, true); - ResolvedJavaField[] fields = newVirtual.getFields(); + List fields = newVirtual.getFields(); - ValueNode[] state = new ValueNode[fields.length]; - for (int i = 0; i < fields.length; i++) { - LoadFieldNode load = genLoadFieldNode(asNode().graph().getAssumptions(), originalAlias, fields[i]); + ValueNode[] state = new ValueNode[fields.size()]; + for (int i = 0; i < fields.size(); i++) { + LoadFieldNode load = genLoadFieldNode(asNode().graph().getAssumptions(), originalAlias, fields.get(i)); state[i] = load; tool.addNode(load); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/AbstractKnownTruffleTypes.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/AbstractKnownTruffleTypes.java index 163269812787..945f9f8262f9 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/AbstractKnownTruffleTypes.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/AbstractKnownTruffleTypes.java @@ -133,7 +133,7 @@ ResolvedJavaMethod findMethod(ResolvedJavaType declaringClass, String name, Stri throw new NoSuchMethodError(declaringClass.toJavaName() + "." + name + descriptor); } - protected ResolvedJavaField[] findInstanceFields(ResolvedJavaType declaringClass) { + protected List findInstanceFields(ResolvedJavaType declaringClass) { return getTypeCache(declaringClass).instanceFields; } @@ -160,17 +160,17 @@ private TypeCache getTypeCache(ResolvedJavaType declaringClass) { @SuppressWarnings({"unchecked", "rawtypes"}) private TypeCache createTypeCache(ResolvedJavaType declaringClass) { GraalError.guarantee(this.typeCache == null || !declaringClass.equals(this.typeCache.declaringClass), "duplicate consecutive cached type lookup"); - ResolvedJavaField[] instanceFields = declaringClass.getInstanceFields(false); - ResolvedJavaField[] staticFields = declaringClass.getStaticFields(); + List instanceFields = declaringClass.getInstanceFields(false); + List staticFields = declaringClass.getStaticFields(); - Map.Entry[] entries = new Map.Entry[instanceFields.length + staticFields.length]; - for (int i = 0; i < instanceFields.length; i++) { - ResolvedJavaField field = instanceFields[i]; + Map.Entry[] entries = new Map.Entry[instanceFields.size() + staticFields.size()]; + for (int i = 0; i < instanceFields.size(); i++) { + ResolvedJavaField field = instanceFields.get(i); entries[i] = Map.entry(field.getName(), field); } - for (int i = 0; i < staticFields.length; i++) { - ResolvedJavaField field = staticFields[i]; - entries[instanceFields.length + i] = Map.entry(field.getName(), field); + for (int i = 0; i < staticFields.size(); i++) { + ResolvedJavaField field = staticFields.get(i); + entries[instanceFields.size() + i] = Map.entry(field.getName(), field); } Map fields = Map.ofEntries(entries); GraalError.guarantee(fields.size() == entries.length, "duplicate field name"); @@ -183,7 +183,7 @@ private TypeCache createTypeCache(ResolvedJavaType declaringClass) { } private record TypeCache(ResolvedJavaType declaringClass, - ResolvedJavaField[] instanceFields, + List instanceFields, Map fields, Map> methods) { } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/KnownTruffleTypes.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/KnownTruffleTypes.java index b7a92208c0b6..4da0eced6d31 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/KnownTruffleTypes.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/KnownTruffleTypes.java @@ -146,7 +146,7 @@ public class KnownTruffleTypes extends AbstractKnownTruffleTypes { public final ResolvedJavaField FrameWithoutBoxing_EMPTY_OBJECT_ARRAY = findField(FrameWithoutBoxing, "EMPTY_OBJECT_ARRAY"); public final ResolvedJavaField FrameWithoutBoxing_EMPTY_LONG_ARRAY = findField(FrameWithoutBoxing, "EMPTY_LONG_ARRAY"); public final ResolvedJavaField FrameWithoutBoxing_EMPTY_BYTE_ARRAY = findField(FrameWithoutBoxing, "EMPTY_BYTE_ARRAY"); - public final ResolvedJavaField[] FrameWithoutBoxing_instanceFields = findInstanceFields(FrameWithoutBoxing); + public final List FrameWithoutBoxing_instanceFields = findInstanceFields(FrameWithoutBoxing); public final ResolvedJavaType AbstractAssumption = lookupTypeCached("com.oracle.truffle.api.impl.AbstractAssumption"); public final ResolvedJavaField AbstractAssumption_isValid = findField(AbstractAssumption, "isValid"); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/host/HostInliningPhase.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/host/HostInliningPhase.java index eccc77510aaf..9464fd5a10fe 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/host/HostInliningPhase.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/host/HostInliningPhase.java @@ -1111,13 +1111,13 @@ private static boolean shouldInlineMonomorphic(InliningPhaseContext context, Cal return false; } - JavaTypeProfile.ProfiledType[] ptypes = typeProfile.getTypes(); - if (ptypes == null || ptypes.length <= 0) { + List ptypes = typeProfile.getTypes(); + if (ptypes.isEmpty()) { call.reason = "not direct call: no parameter types in profile"; return false; } - if (ptypes.length != 1) { + if (ptypes.size() != 1) { var sb = new StringBuilder("not direct call: polymorphic inlining not supported. Types: "); for (ProfiledType type : ptypes) { sb.append(type.getType().toJavaName(false)).append(", "); @@ -1145,7 +1145,7 @@ private static boolean shouldInlineMonomorphic(InliningPhaseContext context, Cal return false; } - ResolvedJavaType type = ptypes[0].getType(); + ResolvedJavaType type = ptypes.getFirst().getType(); ResolvedJavaMethod concrete = type.resolveConcreteMethod(targetMethod, invoke.getContextType()); if (!shouldInlineTarget(context, call, concrete)) { return false; @@ -1205,7 +1205,7 @@ private UnmodifiableEconomicMap inlineGraph(InliningPhaseContext con SpeculationLog.SpeculationReason speculationReason = InliningUtil.createSpeculation(invoke, typeProfile); SpeculationLog speculationLog = targetGraph.getSpeculationLog(); - ResolvedJavaType resolvedType = typeProfile.getTypes()[0].getType(); + ResolvedJavaType resolvedType = typeProfile.getTypes().getFirst().getType(); InliningUtil.insertTypeGuard(context.highTierContext, invoke, resolvedType, speculationLog.speculate(speculationReason)); InliningUtil.replaceInvokeCallTarget(invoke, targetGraph, InvokeKind.Special, targetMethod); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/nodes/frame/NewFrameNode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/nodes/frame/NewFrameNode.java index 79a9776e0cb9..bfdb5770bf4f 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/nodes/frame/NewFrameNode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/nodes/frame/NewFrameNode.java @@ -214,7 +214,7 @@ public NewFrameNode(GraphBuilderContext b, ValueNode frameDescriptorNode, ValueN ResolvedJavaType frameType = types.FrameWithoutBoxing; - ResolvedJavaField[] frameFields = frameType.getInstanceFields(true); + List frameFields = frameType.getInstanceFields(true); this.virtualFrame = graph.add(new VirtualInstanceNode(frameType, frameFields, true)); ValueNode emptyObjectArray = constantObject(graph, b, types.FrameWithoutBoxing_EMPTY_OBJECT_ARRAY); @@ -332,9 +332,9 @@ public void virtualize(VirtualizerTool tool) { tool.createVirtualObject((VirtualObjectNode) virtualFrameArrays.get(AUXILIARY_SLOTS_ARRAY), auxiliarySlotArrayEntryState, Collections. emptyList(), sourcePosition, false); } - assert types.FrameWithoutBoxing_instanceFields.length == 6 : "Must have 6 known fields but found " + types.FrameWithoutBoxing_instanceFields; - ValueNode[] frameEntryState = new ValueNode[types.FrameWithoutBoxing_instanceFields.length]; - List frameFieldList = Arrays.asList(types.FrameWithoutBoxing_instanceFields); + assert types.FrameWithoutBoxing_instanceFields.size() == 6 : "Must have 6 known fields but found " + types.FrameWithoutBoxing_instanceFields; + ValueNode[] frameEntryState = new ValueNode[types.FrameWithoutBoxing_instanceFields.size()]; + List frameFieldList = types.FrameWithoutBoxing_instanceFields; frameEntryState[frameFieldList.indexOf(types.FrameWithoutBoxing_descriptor)] = getDescriptor(); frameEntryState[frameFieldList.indexOf(types.FrameWithoutBoxing_indexedLocals)] = virtualFrameArrays.get(INDEXED_OBJECT_ARRAY); frameEntryState[frameFieldList.indexOf(types.FrameWithoutBoxing_indexedPrimitiveLocals)] = virtualFrameArrays.get(INDEXED_PRIMITIVE_ARRAY); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/substitutions/TruffleGraphBuilderPlugins.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/substitutions/TruffleGraphBuilderPlugins.java index d79617595703..313b082babaa 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/substitutions/TruffleGraphBuilderPlugins.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/substitutions/TruffleGraphBuilderPlugins.java @@ -1119,7 +1119,7 @@ private static void registerDynamicObjectPlugins(InvocationPlugins plugins, Know types.UnsafeAccess.initialize(); } - ResolvedJavaField[] staticFields = types.UnsafeAccess.getStaticFields(); + List staticFields = types.UnsafeAccess.getStaticFields(); JavaConstant anyConstant = null; for (ResolvedJavaField field : staticFields) { if (field.getName().equals("ANY_LOCATION")) { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/vector/replacements/vectorapi/VectorAPIBoxingUtils.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/vector/replacements/vectorapi/VectorAPIBoxingUtils.java index 3160fb9b81d2..7253404e7af9 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/vector/replacements/vectorapi/VectorAPIBoxingUtils.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/vector/replacements/vectorapi/VectorAPIBoxingUtils.java @@ -62,6 +62,8 @@ import jdk.vm.ci.meta.ResolvedJavaField; import jdk.vm.ci.meta.ResolvedJavaType; +import java.util.List; + /** * Utilities related to unboxing Vector API values from constants or from memory. *

@@ -106,9 +108,9 @@ public static ValueNode tryReadSimdConstant(JavaConstant constant, CoreProviders if (vectorType == null) { return null; } - ResolvedJavaField[] fields = type.getInstanceFields(true); - GraalError.guarantee(fields.length == 1 && fields[0].getName().equals("payload"), "expected exactly one payload field in Vector API constant: %s", constant); - ResolvedJavaField payloadField = fields[0]; + List fields = type.getInstanceFields(true); + GraalError.guarantee(fields.size() == 1 && fields.getFirst().getName().equals("payload"), "expected exactly one payload field in Vector API constant: %s", constant); + ResolvedJavaField payloadField = fields.getFirst(); JavaConstant payloadConstant = constantReflection.readFieldValue(payloadField, constant); ResolvedJavaType payloadType = metaAccess.lookupJavaType(payloadConstant); GraalError.guarantee(payloadType.isArray() && payloadType.getElementalType().isPrimitive(), "expected primitive payload array: %s", payloadType); @@ -142,9 +144,9 @@ public static int[] tryReadShuffleConstant(JavaConstant constant, CoreProviders return null; } - ResolvedJavaField[] fields = type.getInstanceFields(true); - GraalError.guarantee(fields.length == 1 && fields[0].getName().equals("payload"), "expected exactly one payload field in Vector API constant: %s", constant); - ResolvedJavaField payloadField = fields[0]; + List fields = type.getInstanceFields(true); + GraalError.guarantee(fields.size() == 1 && fields.getFirst().getName().equals("payload"), "expected exactly one payload field in Vector API constant: %s", constant); + ResolvedJavaField payloadField = fields.getFirst(); JavaConstant payloadConstant = constantReflection.readFieldValue(payloadField, constant); ResolvedJavaType payloadType = metaAccess.lookupJavaType(payloadConstant); GraalError.guarantee(payloadType.isArray(), "must be an array %s", payloadType); @@ -215,9 +217,9 @@ static ValueNode unboxObject(ValueNode value, CoreProviders providers) { ObjectStamp objectStamp = (ObjectStamp) value.stamp(NodeView.DEFAULT); ResolvedJavaType type = objectStamp.type(); - ResolvedJavaField[] fields = type.getInstanceFields(true); - GraalError.guarantee(fields.length == 1 && fields[0].getName().equals("payload"), "expected exactly one payload field in Vector API class %s: %s", type, fields); - ResolvedJavaField payloadField = fields[0]; + List fields = type.getInstanceFields(true); + GraalError.guarantee(fields.size() == 1 && fields.getFirst().getName().equals("payload"), "expected exactly one payload field in Vector API class %s: %s", type, fields); + ResolvedJavaField payloadField = fields.getFirst(); FixedWithNextNode insertionPoint; if (value instanceof FixedWithNextNode fixed) { insertionPoint = fixed; diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/vector/replacements/vectorapi/VectorAPIType.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/vector/replacements/vectorapi/VectorAPIType.java index bd7934ea81eb..120338ee29e6 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/vector/replacements/vectorapi/VectorAPIType.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/vector/replacements/vectorapi/VectorAPIType.java @@ -40,6 +40,8 @@ import jdk.vm.ci.meta.ResolvedJavaField; import jdk.vm.ci.meta.ResolvedJavaType; +import java.util.List; + /** * Information about a Vector API vector type, such as element type, vector length, and the * corresponding {@link SimdStamp}. @@ -223,7 +225,7 @@ private VectorAPIType verify(ResolvedJavaType javaType, CoreProviders providers) ConstantReflectionProvider constantReflection = providers.getConstantReflection(); int vLength = -1; ResolvedJavaType eType = null; - ResolvedJavaField[] staticFields; + List staticFields; try { staticFields = javaType.getStaticFields(); } catch (Error e) { diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/context/object/AnalysisObject.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/context/object/AnalysisObject.java index e0cddbeeb550..541cc4885043 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/context/object/AnalysisObject.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/context/object/AnalysisObject.java @@ -225,7 +225,7 @@ final FieldTypeStore getInstanceFieldTypeStore(PointsToAnalysis bb, TypeFlow checkField(bb, objectFlow, context, field); if (instanceFieldsTypeStore == null) { - INSTANCE_FIELD_TYPE_STORE_UPDATER.compareAndSet(this, null, new AtomicReferenceArray<>(type.getInstanceFields(true).length)); + INSTANCE_FIELD_TYPE_STORE_UPDATER.compareAndSet(this, null, new AtomicReferenceArray<>(type.getInstanceFields(true).size())); } AnalysisError.guarantee(field.getPosition() >= 0 && field.getPosition() < instanceFieldsTypeStore.length(), "Field %s.%s has invalid position %d.", field.getDeclaringClass().toJavaName(), diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/heap/ImageHeapInstance.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/heap/ImageHeapInstance.java index a4b777b90d17..0b92f3fbbb60 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/heap/ImageHeapInstance.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/heap/ImageHeapInstance.java @@ -86,7 +86,7 @@ public ImageHeapInstance(AnalysisType type, JavaConstant hostedObject, int ident } public ImageHeapInstance(AnalysisType type) { - super(new InstanceData(type, null, new Object[type.getInstanceFields(true).length], -1, -1), false); + super(new InstanceData(type, null, new Object[type.getInstanceFields(true).size()], -1, -1), false); } private ImageHeapInstance(ConstantData data, boolean compressed) { diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/heap/ImageHeapScanner.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/heap/ImageHeapScanner.java index ed9942fdda4a..934ab8c4790b 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/heap/ImageHeapScanner.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/heap/ImageHeapScanner.java @@ -193,8 +193,8 @@ public TypeData computeTypeData(AnalysisType type) { * reachability status. The field value is processed when a field is marked as reachable, in * onFieldValueReachable(). */ - ResolvedJavaField[] staticFields = type.getStaticFields(); - TypeData data = new TypeData(staticFields.length); + List staticFields = type.getStaticFields(); + TypeData data = new TypeData(staticFields.size()); for (ResolvedJavaField javaField : staticFields) { AnalysisField field = (AnalysisField) javaField; ValueSupplier rawFieldValue = readHostedFieldValue(field, null); @@ -386,8 +386,8 @@ private ImageHeapInstance createImageHeapInstance(JavaConstant constant, Analysi } /* We are about to query the type's fields, the type must be marked as reachable. */ markTypeReachable(type, reason); - ResolvedJavaField[] instanceFields = type.getInstanceFields(true); - Object[] hostedFieldValues = new Object[instanceFields.length]; + List instanceFields = type.getInstanceFields(true); + Object[] hostedFieldValues = new Object[instanceFields.size()]; for (ResolvedJavaField javaField : instanceFields) { AnalysisField field = (AnalysisField) javaField; ValueSupplier rawFieldValue; diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/infrastructure/ResolvedSignature.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/infrastructure/ResolvedSignature.java index 4b55a2df1a2d..1668b1ff2547 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/infrastructure/ResolvedSignature.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/infrastructure/ResolvedSignature.java @@ -59,9 +59,9 @@ public static ResolvedSignature fromList(List return new ResolvedSignature<>(List.copyOf(parameterTypes), returnType); } - public static ResolvedSignature fromKinds(JavaKind[] parameterKinds, JavaKind returnKind, MetaAccessProvider metaAccess) { + public static ResolvedSignature fromKinds(List parameterKinds, JavaKind returnKind, MetaAccessProvider metaAccess) { return new ResolvedSignature<>( - Arrays.stream(parameterKinds).map(kind -> resolveType(kind, metaAccess)).collect(Collectors.toUnmodifiableList()), + parameterKinds.stream().map(kind -> resolveType(kind, metaAccess)).collect(Collectors.toUnmodifiableList()), resolveType(returnKind, metaAccess)); } diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisMetaAccess.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisMetaAccess.java index f6508f41ea86..6b4b37af6161 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisMetaAccess.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisMetaAccess.java @@ -28,6 +28,7 @@ import java.lang.reflect.Executable; import java.lang.reflect.Field; +import java.util.List; import java.util.Optional; import com.oracle.graal.pointsto.heap.TypedConstant; @@ -36,6 +37,7 @@ import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.MetaAccessProvider; +import jdk.vm.ci.meta.ResolvedJavaType; public class AnalysisMetaAccess extends UniverseMetaAccess { @@ -55,14 +57,14 @@ public AnalysisType lookupJavaType(Class clazz) { } @Override - public AnalysisType[] lookupJavaTypes(Class[] classes) { + public List lookupJavaTypes(Class[] classes) { AnalysisType[] result = new AnalysisType[classes.length]; for (int i = 0; i < result.length; ++i) { result[i] = this.lookupJavaType(classes[i]); } - return result; + return List.of(result); } public Optional optionalLookupJavaType(Class clazz) { diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisMethod.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisMethod.java index 47c9dd63ecdc..a375ccc15deb 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisMethod.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisMethod.java @@ -121,7 +121,7 @@ public abstract class AnalysisMethod extends AnalysisElement implements WrappedJ public static final AnalysisMethod[] EMPTY_ARRAY = new AnalysisMethod[0]; - public record Signature(String name, AnalysisType[] parameterTypes) { + public record Signature(String name, List parameterTypes) { } public final ResolvedJavaMethod wrapped; @@ -134,7 +134,7 @@ public record Signature(String name, AnalysisType[] parameterTypes) { private final boolean isInBaseLayer; private final boolean analyzedInPriorLayer; private final boolean hasNeverInlineDirective; - private final ExceptionHandler[] exceptionHandlers; + private final List exceptionHandlers; private final LocalVariableTable localVariableTable; private final String name; private final String qualifiedName; @@ -242,22 +242,23 @@ protected AnalysisMethod(AnalysisUniverse universe, ResolvedJavaMethod wrapped, } analyzedInPriorLayer = isInBaseLayer && universe.hostVM().analyzedInPriorLayer(this); - ExceptionHandler[] original = wrapped.getExceptionHandlers(); - exceptionHandlers = new ExceptionHandler[original.length]; - for (int i = 0; i < original.length; i++) { - ExceptionHandler h = original[i]; + List original = wrapped.getExceptionHandlers(); + ExceptionHandler[] exceptionHandlersRaw = new ExceptionHandler[original.size()]; + for (int i = 0; i < original.size(); i++) { + ExceptionHandler h = original.get(i); JavaType catchType = getCatchType(universe, wrapped, h); - exceptionHandlers[i] = new ExceptionHandler(h.getStartBCI(), h.getEndBCI(), h.getHandlerBCI(), h.catchTypeCPI(), catchType); + exceptionHandlersRaw[i] = new ExceptionHandler(h.getStartBCI(), h.getEndBCI(), h.getHandlerBCI(), h.catchTypeCPI(), catchType); } + exceptionHandlers = List.of(exceptionHandlersRaw); LocalVariableTable analysisLocalVariableTable = null; if (wrapped.getLocalVariableTable() != null) { try { - Local[] origLocals = wrapped.getLocalVariableTable().getLocals(); - Local[] newLocals = new Local[origLocals.length]; + List origLocals = wrapped.getLocalVariableTable().getLocals(); + Local[] newLocals = new Local[origLocals.size()]; ResolvedJavaType accessingClass = declaringClass.getWrapped(); for (int i = 0; i < newLocals.length; ++i) { - Local origLocal = origLocals[i]; + Local origLocal = origLocals.get(i); ResolvedJavaType origLocalType = origLocal.getType() instanceof ResolvedJavaType ? (ResolvedJavaType) origLocal.getType() : origLocal.getType().resolve(accessingClass); AnalysisType type = universe.lookup(origLocalType); newLocals[i] = new Local(origLocal.getName(), type, origLocal.getStartBCI(), origLocal.getEndBCI(), origLocal.getSlot()); @@ -743,7 +744,7 @@ public ResolvedSignature getSignature() { } @Override - public JavaType[] toParameterTypes() { + public List toParameterTypes() { throw JVMCIError.shouldNotReachHere("ResolvedJavaMethod.toParameterTypes returns the wrong result for constructors. Use toParameterList instead."); } @@ -793,7 +794,7 @@ public int getMaxStackSize() { } @Override - public Parameter[] getParameters() { + public List getParameters() { return wrapped.getParameters(); } @@ -883,7 +884,7 @@ public Set collectMethodImplementations(boolean includeInlinedMe } @Override - public ExceptionHandler[] getExceptionHandlers() { + public List getExceptionHandlers() { return exceptionHandlers; } @@ -908,7 +909,7 @@ public Annotation[][] getParameterAnnotations() { } @Override - public Type[] getGenericParameterTypes() { + public List getGenericParameterTypes() { return wrapped.getGenericParameterTypes(); } 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 3993bdabdc04..3d42978edd5f 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 @@ -83,10 +83,6 @@ public abstract class AnalysisType extends AnalysisElement implements WrappedJav private static final AtomicReferenceFieldUpdater UNIQUE_CONSTANT_UPDATER = // AtomicReferenceFieldUpdater.newUpdater(AnalysisType.class, AnalysisObject.class, "uniqueConstant"); - @SuppressWarnings("rawtypes")// - private static final AtomicReferenceFieldUpdater INTERCEPTORS_UPDATER = // - AtomicReferenceFieldUpdater.newUpdater(AnalysisType.class, Object.class, "interceptors"); - private static final AtomicReferenceFieldUpdater subtypeReachableNotificationsUpdater = AtomicReferenceFieldUpdater .newUpdater(AnalysisType.class, Object.class, "subtypeReachableNotifications"); @@ -171,8 +167,8 @@ public abstract class AnalysisType extends AnalysisElement implements WrappedJav private final AnalysisType componentType; private final AnalysisType elementalType; - private final AnalysisType[] interfaces; - private AnalysisMethod[] declaredMethods; + private final List interfaces; + private List declaredMethods; private Set dispatchTableMethods; private AnalysisType[] allInterfaces; @@ -327,7 +323,7 @@ public AnalysisType(AnalysisUniverse universe, ResolvedJavaType javaType, JavaKi if (superClass != null) { superClass.addSubType(this); } - if (isInterface() && interfaces.length == 0) { + if (isInterface() && interfaces.isEmpty()) { objectType.addSubType(this); } for (AnalysisType interf : interfaces) { @@ -354,15 +350,15 @@ public AnalysisType(AnalysisUniverse universe, ResolvedJavaType javaType, JavaKi }); } - private AnalysisType[] convertTypes(ResolvedJavaType[] originalTypes) { - List result = new ArrayList<>(originalTypes.length); + private List convertTypes(List originalTypes) { + List result = new ArrayList<>(originalTypes.size()); for (ResolvedJavaType originalType : originalTypes) { if (universe.hostVM.skipInterface(universe, originalType, wrapped)) { continue; } result.add(universe.lookup(originalType)); } - return result.toArray(AnalysisType.EMPTY_ARRAY); + return List.copyOf(result); } public AnalysisType getArrayClass(int dim) { @@ -1044,7 +1040,7 @@ public AnalysisType getSuperclass() { } @Override - public AnalysisType[] getInterfaces() { + public List getInterfaces() { return interfaces; } @@ -1201,8 +1197,8 @@ public ResolvedJavaField findInstanceFieldWithOffset(long offset, JavaKind expec * Although all elements are of type AnalysisField, we set this array to be of type * ResolvedJavaField so that runtime compilation does not need to convert the array type. */ - private volatile ResolvedJavaField[] instanceFieldsWithSuper; - private volatile ResolvedJavaField[] instanceFieldsWithoutSuper; + private volatile List instanceFieldsWithSuper; + private volatile List instanceFieldsWithoutSuper; public void clearInstanceFieldsCache() { instanceFieldsWithSuper = null; @@ -1214,8 +1210,8 @@ public void clearInstanceFieldsCache() { * AnalysisField and can be casted to AnalysisField without problem. */ @Override - public ResolvedJavaField[] getInstanceFields(boolean includeSuperclasses) { - ResolvedJavaField[] result = includeSuperclasses ? instanceFieldsWithSuper : instanceFieldsWithoutSuper; + public List getInstanceFields(boolean includeSuperclasses) { + List result = includeSuperclasses ? instanceFieldsWithSuper : instanceFieldsWithoutSuper; if (result != null) { return result; } else { @@ -1223,12 +1219,12 @@ public ResolvedJavaField[] getInstanceFields(boolean includeSuperclasses) { } } - private ResolvedJavaField[] initializeInstanceFields(boolean includeSuperclasses) { + private List initializeInstanceFields(boolean includeSuperclasses) { List list = new ArrayList<>(); if (includeSuperclasses && getSuperclass() != null) { - list.addAll(Arrays.asList(getSuperclass().getInstanceFields(true))); + list.addAll(getSuperclass().getInstanceFields(true)); } - ResolvedJavaField[] result = convertFields(interceptInstanceFields(wrapped.getInstanceFields(false)), list, includeSuperclasses); + List result = convertFields(wrapped.getInstanceFields(false), list, includeSuperclasses); if (includeSuperclasses) { instanceFieldsWithSuper = result; } else { @@ -1245,11 +1241,10 @@ private ResolvedJavaField[] initializeInstanceFields(boolean includeSuperclasses */ static final Comparator FIELD_COMPARATOR = Comparator.comparing(ResolvedJavaField::getName).thenComparing(f -> f.getType().toJavaName()); - private ResolvedJavaField[] convertFields(ResolvedJavaField[] originals, List list, boolean listIncludesSuperClassesFields) { - ResolvedJavaField[] localOriginals = originals; + private List convertFields(List originals, List list, boolean listIncludesSuperClassesFields) { + ResolvedJavaField[] localOriginals = originals.toArray(new ResolvedJavaField[originals.size()]); if (universe.hostVM.sortFields()) { /* Clone the originals; it is a reference to the wrapped type's instanceFields array. */ - localOriginals = originals.clone(); Arrays.sort(localOriginals, FIELD_COMPARATOR); } for (ResolvedJavaField original : localOriginals) { @@ -1270,7 +1265,7 @@ private ResolvedJavaField[] convertFields(ResolvedJavaField[] originals, List getStaticFields() { return convertFields(wrapped.getStaticFields(), new ArrayList<>(), false); } @@ -1320,14 +1315,14 @@ public AnalysisType getEnclosingType() { } @Override - public ResolvedJavaMethod[] getDeclaredMethods() { + public List getDeclaredMethods() { return getDeclaredMethods(true); } @Override - public AnalysisMethod[] getDeclaredMethods(boolean forceLink) { + public List getDeclaredMethods(boolean forceLink) { GraalError.guarantee(forceLink == false, "only use getDeclaredMethods without forcing to link, because linking can throw LinkageError"); - AnalysisMethod[] result = declaredMethods; + List result = declaredMethods; if (result == null) { result = universe.lookup(wrapped.getDeclaredMethods(forceLink)); /* Ensure array element initializations are published before publishing the array. */ @@ -1346,14 +1341,14 @@ public List getAllMethods(boolean forceLink) { } @Override - public ResolvedJavaMethod[] getDeclaredConstructors() { + public List getDeclaredConstructors() { return getDeclaredConstructors(true); } @Override - public AnalysisMethod[] getDeclaredConstructors(boolean forceLink) { + public List 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)); + return List.copyOf(universe.lookup(wrapped.getDeclaredConstructors(forceLink))); } public AnalysisMethod findConstructor(Signature signature) { @@ -1469,12 +1464,6 @@ public boolean isCloneableWithAllocation() { return isCloneableWithAllocation; } - @SuppressWarnings("deprecation") - @Override - public ResolvedJavaType getHostClass() { - return universe.lookup(wrapped.getHostClass()); - } - @Override public AnalysisUniverse getUniverse() { return universe; @@ -1503,20 +1492,4 @@ public boolean equals(Object obj) { public boolean isAnnotation() { return (getModifiers() & ANNOTATION) != 0; } - - public void addInstanceFieldsInterceptor(InstanceFieldsInterceptor interceptor) { - ConcurrentLightHashSet.addElement(this, INTERCEPTORS_UPDATER, interceptor); - } - - private ResolvedJavaField[] interceptInstanceFields(ResolvedJavaField[] fields) { - ResolvedJavaField[] result = fields; - for (Object interceptor : ConcurrentLightHashSet.getElements(this, INTERCEPTORS_UPDATER)) { - result = ((InstanceFieldsInterceptor) interceptor).interceptInstanceFields(universe, result, this); - } - return result; - } - - public interface InstanceFieldsInterceptor { - ResolvedJavaField[] interceptInstanceFields(AnalysisUniverse universe, ResolvedJavaField[] fields, AnalysisType type); - } } diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisUniverse.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisUniverse.java index e09ba6b7ad9d..cec35d0bac97 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisUniverse.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisUniverse.java @@ -461,17 +461,17 @@ private static void prepareMethodImplementations(AnalysisMethod method) { } } - public AnalysisMethod[] lookup(JavaMethod[] inputs) { - List result = new ArrayList<>(inputs.length); - for (JavaMethod method : inputs) { - if (hostVM.platformSupported((ResolvedJavaMethod) method)) { + public List lookup(List inputs) { + List result = new ArrayList<>(inputs.size()); + for (ResolvedJavaMethod method : inputs) { + if (hostVM.platformSupported(method)) { AnalysisMethod aMethod = lookup(method); if (aMethod != null) { result.add(aMethod); } } } - return result.toArray(AnalysisMethod.EMPTY_ARRAY); + return result; } @Override diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerMethod.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerMethod.java index 2d32cc0189ab..0e2fd9b3e57d 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerMethod.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerMethod.java @@ -26,6 +26,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; +import java.util.List; import com.oracle.graal.pointsto.infrastructure.ResolvedSignature; @@ -167,8 +168,8 @@ public boolean canBeStaticallyBound() { } @Override - public ExceptionHandler[] getExceptionHandlers() { - return new ExceptionHandler[0]; + public List getExceptionHandlers() { + return List.of(); } @Override @@ -197,7 +198,7 @@ public Annotation[][] getParameterAnnotations() { } @Override - public Type[] getGenericParameterTypes() { + public List getGenericParameterTypes() { throw unimplemented(); } diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerType.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerType.java index af487cc728b3..fcf363fe4987 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerType.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerType.java @@ -62,10 +62,10 @@ public class BaseLayerType extends BaseLayerElement implements ResolvedJavaType, private final ResolvedJavaType enclosingType; private final ResolvedJavaType componentType; private final ResolvedJavaType superClass; - private final ResolvedJavaType[] interfaces; + private final List interfaces; private final ResolvedJavaType objectType; - private ResolvedJavaField[] instanceFields; - private ResolvedJavaField[] instanceFieldsWithSuper; + private List instanceFields; + private List instanceFieldsWithSuper; public BaseLayerType(String name, int baseLayerId, int modifiers, boolean isInterface, boolean isEnum, boolean isInitialized, boolean isLinked, String sourceFileName, ResolvedJavaType enclosingType, ResolvedJavaType componentType, ResolvedJavaType superClass, ResolvedJavaType[] interfaces, ResolvedJavaType objectType, @@ -82,16 +82,16 @@ public BaseLayerType(String name, int baseLayerId, int modifiers, boolean isInte this.enclosingType = enclosingType; this.componentType = componentType; this.superClass = superClass; - this.interfaces = interfaces; + this.interfaces = List.of(interfaces); this.objectType = objectType; } public void setInstanceFields(ResolvedJavaField[] instanceFields) { - this.instanceFields = instanceFields; + this.instanceFields = List.of(instanceFields); } public void setInstanceFieldsWithSuper(ResolvedJavaField[] instanceFieldsWithSuper) { - this.instanceFieldsWithSuper = instanceFieldsWithSuper; + this.instanceFieldsWithSuper = List.of(instanceFieldsWithSuper); } @Override @@ -184,7 +184,7 @@ public ResolvedJavaType getSuperclass() { } @Override - public ResolvedJavaType[] getInterfaces() { + public List getInterfaces() { return interfaces; } @@ -247,8 +247,8 @@ public Assumptions.AssumptionResult findUniqueConcreteMethod } @Override - public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) { - return new ResolvedJavaMethod[0]; + public List getDeclaredMethods(boolean forceLink) { + return List.of(); } @Override @@ -257,12 +257,12 @@ public List getAllMethods(boolean forceLink) { } @Override - public ResolvedJavaField[] getInstanceFields(boolean includeSuperclasses) { + public List getInstanceFields(boolean includeSuperclasses) { return includeSuperclasses ? instanceFieldsWithSuper : instanceFields; } @Override - public ResolvedJavaField[] getStaticFields() { + public List getStaticFields() { throw AnalysisError.shouldNotReachHere("This type is incomplete and should not be used."); } @@ -292,12 +292,12 @@ public ResolvedJavaType getEnclosingType() { } @Override - public ResolvedJavaMethod[] getDeclaredConstructors() { + public List getDeclaredConstructors() { throw AnalysisError.shouldNotReachHere("This type is incomplete and should not be used."); } @Override - public ResolvedJavaMethod[] getDeclaredMethods() { + public List getDeclaredMethods() { throw AnalysisError.shouldNotReachHere("This type is incomplete and should not be used."); } diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/phases/SubstrateIntrinsicGraphBuilder.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/phases/SubstrateIntrinsicGraphBuilder.java index f2f769d27d8d..167a756b847e 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/phases/SubstrateIntrinsicGraphBuilder.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/phases/SubstrateIntrinsicGraphBuilder.java @@ -63,7 +63,7 @@ public void setStateAfter(StateSplit sideEffect) { private FrameState getFrameState(ValueNode returnVal) { ValueNode[] locals = arguments; - JavaKind[] pushedSlotKinds = null; + List pushedSlotKinds = List.of(); ValueNode[] pushedValues = null; ValueNode[] locks = ValueNode.EMPTY_ARRAY; ValueNode[] stack; @@ -92,7 +92,7 @@ public FrameState getInvocationPluginReturnState(JavaKind retKind, ValueNode ret protected void setExceptionState(StateSplit exceptionObject) { ValueNode[] locals = arguments; ValueNode[] stack = {exceptionObject.asNode()}; - JavaKind[] pushedSlotKinds = null; + List pushedSlotKinds = List.of(); ValueNode[] pushedValues = null; ValueNode[] locks = ValueNode.EMPTY_ARRAY; List monitorIds = null; @@ -124,7 +124,7 @@ protected void mergeUnwinds() { /* Creating FrameState for new UnwindNode. */ ValueNode[] locals = arguments; ValueNode[] stack = {exceptionValue}; - JavaKind[] pushedSlotKinds = null; + List pushedSlotKinds = List.of(); ValueNode[] pushedValues = null; ValueNode[] locks = ValueNode.EMPTY_ARRAY; List monitorIds = null; diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/results/StrengthenGraphs.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/results/StrengthenGraphs.java index ca214f4442a3..90f717a890f8 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/results/StrengthenGraphs.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/results/StrengthenGraphs.java @@ -791,9 +791,9 @@ private void assignInvokeProfiles(Invoke invoke, InvokeTypeFlow invokeFlow, Coll */ JavaMethodProfile methodProfile = makeMethodProfile(callees, assumeNotRecorded); - assert typeProfile == null || typeProfile.getTypes().length > 1 || assumeNotRecorded : "Should devirtualize with typeProfile=" + typeProfile + " and methodProfile=" + methodProfile + + assert typeProfile == null || typeProfile.getTypes().size() > 1 || assumeNotRecorded : "Should devirtualize with typeProfile=" + typeProfile + " and methodProfile=" + methodProfile + " and callees" + callees + " invoke " + invokeFlow + " " + invokeFlow.getReceiver() + " in method " + getQualifiedName(graph); - assert methodProfile == null || methodProfile.getMethods().length > 1 || assumeNotRecorded : "Should devirtualize with typeProfile=" + typeProfile + " and methodProfile=" + methodProfile + + assert methodProfile == null || methodProfile.getMethods().size() > 1 || assumeNotRecorded : "Should devirtualize with typeProfile=" + typeProfile + " and methodProfile=" + methodProfile + " and callees" + callees + " invoke " + invokeFlow + " " + invokeFlow.getReceiver() + " in method " + getQualifiedName(graph); setInvokeProfiles(invoke, typeProfile, methodProfile); diff --git a/substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/DowncallStubsHolder.java b/substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/DowncallStubsHolder.java index a145973f85e7..1e38856ec3fc 100644 --- a/substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/DowncallStubsHolder.java +++ b/substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/DowncallStubsHolder.java @@ -39,7 +39,7 @@ public final class DowncallStubsHolder { @Platforms(Platform.HOSTED_ONLY.class) public static ConstantPool getConstantPool(MetaAccessProvider metaAccess) { - return metaAccess.lookupJavaType(DowncallStubsHolder.class).getDeclaredConstructors()[0].getConstantPool(); + return metaAccess.lookupJavaType(DowncallStubsHolder.class).getDeclaredConstructors().getFirst().getConstantPool(); } /** diff --git a/substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/UpcallStubsHolder.java b/substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/UpcallStubsHolder.java index e76dfe455bfe..6987a6926a4b 100644 --- a/substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/UpcallStubsHolder.java +++ b/substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/UpcallStubsHolder.java @@ -41,7 +41,7 @@ public final class UpcallStubsHolder { @Platforms(Platform.HOSTED_ONLY.class) public static ConstantPool getConstantPool(MetaAccessProvider metaAccess) { - return metaAccess.lookupJavaType(UpcallStubsHolder.class).getDeclaredConstructors()[0].getConstantPool(); + return metaAccess.lookupJavaType(UpcallStubsHolder.class).getDeclaredConstructors().getFirst().getConstantPool(); } /** diff --git a/substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/SubstrateAArch64Backend.java b/substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/SubstrateAArch64Backend.java index 6f6fd57bf7b2..fd0acd6af0e5 100755 --- a/substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/SubstrateAArch64Backend.java +++ b/substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/SubstrateAArch64Backend.java @@ -39,6 +39,7 @@ import java.util.Arrays; import java.util.Collection; +import java.util.List; import java.util.function.BiConsumer; import org.graalvm.nativeimage.ImageSingletons; @@ -720,7 +721,7 @@ public void visitBreakpointNode(BreakpointNode node) { sig[i] = node.arguments().get(i).stamp(NodeView.DEFAULT).javaType(gen.getMetaAccess()); } - CallingConvention convention = gen.getRegisterConfig().getCallingConvention(SubstrateCallingConventionKind.Java.toType(true), null, sig, gen); + CallingConvention convention = gen.getRegisterConfig().getCallingConvention(SubstrateCallingConventionKind.Java.toType(true), null, List.of(sig), gen); append(new AArch64BreakpointOp(visitInvokeArguments(convention, node.arguments()))); } diff --git a/substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/SubstrateAArch64RegisterConfig.java b/substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/SubstrateAArch64RegisterConfig.java index 5d5021edd46e..9a530bd71349 100755 --- a/substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/SubstrateAArch64RegisterConfig.java +++ b/substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/SubstrateAArch64RegisterConfig.java @@ -277,11 +277,11 @@ private static int darwinNativeStackParameterAssignment(ValueKindFactory valu } @Override - public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaType[] parameterTypes, ValueKindFactory valueKindFactory) { + public CallingConvention getCallingConvention(Type t, JavaType returnType, List parameterTypes, ValueKindFactory valueKindFactory) { SubstrateCallingConventionType type = (SubstrateCallingConventionType) t; boolean isEntryPoint = type.nativeABI() && !type.outgoing; - AllocatableValue[] locations = new AllocatableValue[parameterTypes.length]; + AllocatableValue[] locations = new AllocatableValue[parameterTypes.size()]; JavaKind[] kinds = new JavaKind[locations.length]; int firstActualArgument = 0; @@ -301,7 +301,7 @@ public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaT * possible to implement this using some kind of "SinkValue" as the location of the * argument. In the meantime, we put it in r8. */ - JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes[0], metaAccess, target); + JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes.getFirst(), metaAccess, target); kinds[0] = kind; ValueKind paramValueKind = valueKindFactory.getValueKind(isEntryPoint ? kind : kind.getStackKind()); locations[0] = AArch64.r8.asValue(paramValueKind); @@ -326,8 +326,8 @@ public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaT int currentGeneral = 0; int currentFP = 0; - for (int i = firstActualArgument; i < parameterTypes.length; i++) { - JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes[i], metaAccess, target); + for (int i = firstActualArgument; i < parameterTypes.size(); i++) { + JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes.get(i), metaAccess, target); kinds[i] = kind; Register register = null; @@ -386,10 +386,10 @@ public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaT } } else { Set usedRegisters = new HashSet<>(); - VMError.guarantee(parameterTypes.length == type.fixedParameterAssignment.length, "Parameters/assignments size mismatch."); + VMError.guarantee(parameterTypes.size() == type.fixedParameterAssignment.length, "Parameters/assignments size mismatch."); for (int i = firstActualArgument; i < locations.length; i++) { - JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes[i], metaAccess, target); + JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes.get(i), metaAccess, target); kinds[i] = kind; ValueKind paramValueKind = valueKindFactory.getValueKind(isEntryPoint ? kind : kind.getStackKind()); diff --git a/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64Backend.java b/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64Backend.java index cd13e0b2279e..75bdad461b25 100644 --- a/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64Backend.java +++ b/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64Backend.java @@ -883,7 +883,7 @@ public void visitBreakpointNode(BreakpointNode node) { sig[i] = node.arguments().get(i).stamp(NodeView.DEFAULT).javaType(gen.getMetaAccess()); } - CallingConvention convention = gen.getRegisterConfig().getCallingConvention(SubstrateCallingConventionKind.Java.toType(true), null, sig, gen); + CallingConvention convention = gen.getRegisterConfig().getCallingConvention(SubstrateCallingConventionKind.Java.toType(true), null, List.of(sig), gen); append(new AMD64BreakpointOp(visitInvokeArguments(convention, node.arguments()))); } diff --git a/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64RegisterConfig.java b/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64RegisterConfig.java index 20f8d8b819b3..176d60a9a0d3 100644 --- a/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64RegisterConfig.java +++ b/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64RegisterConfig.java @@ -275,7 +275,7 @@ public boolean shouldUseBasePointer() { } @Override - public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaType[] parameterTypes, ValueKindFactory valueKindFactory) { + public CallingConvention getCallingConvention(Type t, JavaType returnType, List parameterTypes, ValueKindFactory valueKindFactory) { SubstrateCallingConventionType type = (SubstrateCallingConventionType) t; boolean isEntryPoint = type.nativeABI() && !type.outgoing; @@ -286,7 +286,7 @@ public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaT */ int currentStackOffset = type.nativeABI() ? nativeParamsStackOffset : target.wordSize; - AllocatableValue[] locations = new AllocatableValue[parameterTypes.length]; + AllocatableValue[] locations = new AllocatableValue[parameterTypes.size()]; JavaKind[] kinds = new JavaKind[locations.length]; int firstActualArgument = 0; @@ -307,7 +307,7 @@ public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaT * argument. In the meantime, we put it in a scratch register. r10 contains the target, * rax the number of vector args, so r11 is the only scratch register left. */ - JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes[0], metaAccess, target); + JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes.getFirst(), metaAccess, target); kinds[0] = kind; ValueKind paramValueKind = valueKindFactory.getValueKind(isEntryPoint ? kind : kind.getStackKind()); locations[0] = r11.asValue(paramValueKind); @@ -317,8 +317,8 @@ public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaT int currentGeneral = 0; int currentXMM = 0; - for (int i = firstActualArgument; i < parameterTypes.length; i++) { - JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes[i], metaAccess, target); + for (int i = firstActualArgument; i < parameterTypes.size(); i++) { + JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes.get(i), metaAccess, target); kinds[i] = kind; if (type.nativeABI() && Platform.includedIn(Platform.WINDOWS.class)) { @@ -377,10 +377,10 @@ public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaT } else { final int baseStackOffset = currentStackOffset; Set usedRegisters = new HashSet<>(); - VMError.guarantee(parameterTypes.length == type.fixedParameterAssignment.length, "Parameters/assignments size mismatch."); + VMError.guarantee(parameterTypes.size() == type.fixedParameterAssignment.length, "Parameters/assignments size mismatch."); for (int i = firstActualArgument; i < locations.length; i++) { - JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes[i], metaAccess, target); + JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes.get(i), metaAccess, target); kinds[i] = kind; ValueKind paramValueKind = valueKindFactory.getValueKind(isEntryPoint ? kind : kind.getStackKind()); diff --git a/substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/LLVMGenerator.java b/substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/LLVMGenerator.java index 6cda1e21fec5..6f874dd77626 100644 --- a/substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/LLVMGenerator.java +++ b/substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/LLVMGenerator.java @@ -438,8 +438,8 @@ boolean isVoidReturnType(LLVMTypeRef returnType) { private LLVMTypeRef[] getLLVMFunctionArgTypes(ResolvedJavaMethod method, boolean forMainFunction) { ResolvedJavaType receiver = method.hasReceiver() ? method.getDeclaringClass() : null; - JavaType[] javaParameterTypes = method.getSignature().toParameterTypes(receiver); - return Arrays.stream(javaParameterTypes).map(type -> getLLVMStackType(getTypeKind(type.resolve(null), forMainFunction))).toArray(LLVMTypeRef[]::new); + List javaParameterTypes = method.getSignature().toParameterTypes(receiver); + return javaParameterTypes.stream().map(type -> getLLVMStackType(getTypeKind(type.resolve(null), forMainFunction))).toArray(LLVMTypeRef[]::new); } /** diff --git a/substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/NodeLLVMBuilder.java b/substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/NodeLLVMBuilder.java index 42e50b9d2bc3..961bbba58e06 100644 --- a/substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/NodeLLVMBuilder.java +++ b/substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/NodeLLVMBuilder.java @@ -652,7 +652,7 @@ private LLVMTypeRef getUnknownCallReturnType(LoweredCallTargetNode callTarget) { } private LLVMTypeRef[] getUnknownCallArgumentTypes(LoweredCallTargetNode callTarget) { - return Arrays.stream(callTarget.signature()).map(argType -> gen.getLLVMStackType(gen.getTypeKind(argType.resolve(null), false))).toArray(LLVMTypeRef[]::new); + return callTarget.signature().stream().map(argType -> gen.getLLVMStackType(gen.getTypeKind(argType.resolve(null), false))).toArray(LLVMTypeRef[]::new); } /* Other nodes */ diff --git a/substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/util/LLVMObjectFileReader.java b/substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/util/LLVMObjectFileReader.java index 969d824f3fea..cc822178078f 100644 --- a/substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/util/LLVMObjectFileReader.java +++ b/substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/util/LLVMObjectFileReader.java @@ -57,6 +57,7 @@ import jdk.vm.ci.code.DebugInfo; import jdk.vm.ci.code.ReferenceMap; +import jdk.vm.ci.code.VirtualObject; import jdk.vm.ci.code.site.Call; import jdk.vm.ci.code.site.Infopoint; import jdk.vm.ci.code.site.InfopointReason; @@ -198,7 +199,7 @@ private static DebugInfo copyWithReferenceMap(DebugInfo debugInfo, ReferenceMap return null; } - DebugInfo newInfo = new DebugInfo(debugInfo.getBytecodePosition(), debugInfo.getVirtualObjectMapping()); + DebugInfo newInfo = new DebugInfo(debugInfo.getBytecodePosition(), debugInfo.getVirtualObjectMapping().toArray(new VirtualObject[0])); newInfo.setCalleeSaveInfo(debugInfo.getCalleeSaveInfo()); newInfo.setReferenceMap(referenceMap); return newInfo; diff --git a/substratevm/src/com.oracle.svm.core.graal.riscv64/src/com/oracle/svm/core/graal/riscv64/SubstrateRISCV64RegisterConfig.java b/substratevm/src/com.oracle.svm.core.graal.riscv64/src/com/oracle/svm/core/graal/riscv64/SubstrateRISCV64RegisterConfig.java index 786eec95aca6..a20762bb4781 100644 --- a/substratevm/src/com.oracle.svm.core.graal.riscv64/src/com/oracle/svm/core/graal/riscv64/SubstrateRISCV64RegisterConfig.java +++ b/substratevm/src/com.oracle.svm.core.graal.riscv64/src/com/oracle/svm/core/graal/riscv64/SubstrateRISCV64RegisterConfig.java @@ -217,7 +217,7 @@ private int javaStackParameterAssignment(ValueKindFactory valueKindFactory, A } @Override - public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaType[] parameterTypes, ValueKindFactory valueKindFactory) { + public CallingConvention getCallingConvention(Type t, JavaType returnType, List parameterTypes, ValueKindFactory valueKindFactory) { SubstrateCallingConventionType type = (SubstrateCallingConventionType) t; if (type.fixedParameterAssignment != null || type.returnSaving != null) { throw unsupportedFeature("Fixed parameter assignments and return saving are not yet supported on this platform."); @@ -225,7 +225,7 @@ public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaT boolean isEntryPoint = type.nativeABI() && !type.outgoing; - AllocatableValue[] locations = new AllocatableValue[parameterTypes.length]; + AllocatableValue[] locations = new AllocatableValue[parameterTypes.size()]; int currentGeneral = 0; int currentFP = 0; @@ -238,8 +238,8 @@ public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaT int currentStackOffset = (type.nativeABI() ? nativeParamsStackOffset : target.wordSize); JavaKind[] kinds = new JavaKind[locations.length]; - for (int i = 0; i < parameterTypes.length; i++) { - JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes[i], metaAccess, target); + for (int i = 0; i < parameterTypes.size(); i++) { + JavaKind kind = ObjectLayout.getCallSignatureKind(isEntryPoint, parameterTypes.get(i), metaAccess, target); kinds[i] = kind; Register register = null; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CodeInfoEncoder.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CodeInfoEncoder.java index 72ba9839f536..7c8e13d59f67 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CodeInfoEncoder.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CodeInfoEncoder.java @@ -29,12 +29,14 @@ import java.util.BitSet; import java.util.EnumSet; +import java.util.List; import java.util.Objects; import java.util.TreeMap; import java.util.function.Consumer; import java.util.function.IntFunction; import java.util.stream.Stream; +import jdk.vm.ci.meta.ResolvedJavaField; import org.graalvm.collections.EconomicSet; import org.graalvm.collections.Equivalence; import org.graalvm.nativeimage.ImageSingletons; @@ -830,11 +832,11 @@ private void verifyVirtualObject(CompilationResult compilation, VirtualObject ex assert expectedLength == actualLength : actualFrame; } else { - SharedField[] expectedFields = (SharedField[]) expectedType.getInstanceFields(true); + List expectedFields = expectedType.getInstanceFields(true); int fieldIdx = 0; int valueIdx = 0; while (valueIdx < expectedObject.getValues().length) { - SharedField expectedField = expectedFields[fieldIdx]; + SharedField expectedField = (SharedField) expectedFields.get(fieldIdx); fieldIdx += 1; JavaValue expectedValue = expectedObject.getValues()[valueIdx]; JavaKind valueKind = expectedObject.getSlotKind(valueIdx); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CompilationResultFrameTree.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CompilationResultFrameTree.java index c31ee7208676..e612662238d0 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CompilationResultFrameTree.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CompilationResultFrameTree.java @@ -345,9 +345,9 @@ private static Local[] getLocalsBySlot(ResolvedJavaMethod method) { LocalVariableTable lvt = method.getLocalVariableTable(); Local[] nonEmptySortedLocals = null; if (lvt != null) { - Local[] locals = lvt.getLocals(); - if (locals != null && locals.length > 0) { - nonEmptySortedLocals = Arrays.copyOf(locals, locals.length); + List locals = lvt.getLocals(); + if (locals.size() > 0) { + nonEmptySortedLocals = locals.toArray(new Local[locals.size()]); Arrays.sort(nonEmptySortedLocals, (Local l1, Local l2) -> l1.getSlot() - l2.getSlot()); } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/FrameInfoEncoder.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/FrameInfoEncoder.java index 4b98de972b1a..7e612f8bfeb7 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/FrameInfoEncoder.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/FrameInfoEncoder.java @@ -36,6 +36,7 @@ import java.util.Set; import com.oracle.svm.core.encoder.SymbolEncoder; +import jdk.vm.ci.meta.ResolvedJavaField; import org.graalvm.collections.EconomicMap; import org.graalvm.collections.Equivalence; import org.graalvm.nativeimage.ImageSingletons; @@ -777,13 +778,13 @@ private void makeVirtualObject(FrameData data, VirtualObject virtualObject, bool * We must add filling constants for padding, so that values are contiguous. The * deoptimization code does not have access to field information. */ - SharedField[] fields = (SharedField[]) type.getInstanceFields(true); + List fields = type.getInstanceFields(true); long curOffset = objectLayout.getFirstFieldOffset(); int fieldIdx = 0; int valueIdx = 0; while (valueIdx < virtualObject.getValues().length) { - SharedField field = fields[fieldIdx]; + SharedField field = (SharedField) fields.get(fieldIdx); fieldIdx += 1; JavaValue value = virtualObject.getValues()[valueIdx]; JavaKind valueKind = virtualObject.getSlotKind(valueIdx); @@ -797,7 +798,7 @@ private void makeVirtualObject(FrameData data, VirtualObject virtualObject, bool * These values span two fields - so we have to ignore a field. */ kind = valueKind; - assert fields[fieldIdx].getJavaKind() == field.getJavaKind() : field; + assert fields.get(fieldIdx).getJavaKind() == field.getJavaKind() : field; fieldIdx++; } 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 1a7055b1ef4a..cf8c816e7390 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(false)[0].getConstantPool(); + return metaAccess.lookupJavaType(IsolateEnterStub.class).getDeclaredConstructors(false).getFirst().getConstantPool(); } private IsolateEnterStub() { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/SubstrateForeignCallLinkage.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/SubstrateForeignCallLinkage.java index 9bac644128b6..5b8d5bc4273c 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/SubstrateForeignCallLinkage.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/SubstrateForeignCallLinkage.java @@ -25,6 +25,7 @@ package com.oracle.svm.core.graal.meta; import jdk.graal.compiler.core.common.spi.ForeignCallLinkage; +import jdk.vm.ci.meta.ResolvedJavaType; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; @@ -40,6 +41,8 @@ import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.Value; +import java.util.List; + public class SubstrateForeignCallLinkage implements ForeignCallLinkage { private final SubstrateForeignCallsProvider provider; @@ -59,7 +62,7 @@ public SubstrateForeignCallLinkage(SubstrateForeignCallsProvider provider, Subst public CallingConvention getOutgoingCallingConvention() { if (outgoingCallingConvention == null) { JavaType resType = provider.metaAccess.lookupJavaType(descriptor.getResultType()); - JavaType[] argTypes = provider.metaAccess.lookupJavaTypes(descriptor.getArgumentTypes()); + var argTypes = provider.metaAccess.lookupJavaTypes(descriptor.getArgumentTypes()); SubstrateCallingConventionKind callingConventionKind = ((SharedMethod) method).getCallingConventionKind(); outgoingCallingConvention = provider.registerConfig.getCallingConvention(callingConventionKind.toType(true), resType, argTypes, provider); } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/nodes/ComputedIndirectCallTargetNode.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/nodes/ComputedIndirectCallTargetNode.java index 4240630ae1d6..35adc8ee7473 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/nodes/ComputedIndirectCallTargetNode.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/nodes/ComputedIndirectCallTargetNode.java @@ -37,6 +37,8 @@ import jdk.vm.ci.meta.ResolvedJavaField; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + /** * Indirect call with a computed address. The address computation is emitted only after LIR * generation, which ensures that no other instructions get scheduled in between the computation and @@ -94,7 +96,7 @@ public ResolvedJavaField getField() { @Input protected ValueNode addressBase; private final Computation[] addressComputation; - public ComputedIndirectCallTargetNode(ValueNode addressBase, Computation[] addressComputation, ValueNode[] arguments, StampPair returnStamp, JavaType[] signature, ResolvedJavaMethod target) { + public ComputedIndirectCallTargetNode(ValueNode addressBase, Computation[] addressComputation, ValueNode[] arguments, StampPair returnStamp, List signature, ResolvedJavaMethod target) { super(TYPE, arguments, returnStamp, signature, target, SubstrateCallingConventionKind.Java.toType(true), InvokeKind.Static); this.addressBase = addressBase; this.addressComputation = addressComputation; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/replacements/SubstrateGraphKit.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/replacements/SubstrateGraphKit.java index e922c4dd48c4..fabda2257735 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/replacements/SubstrateGraphKit.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/replacements/SubstrateGraphKit.java @@ -251,12 +251,12 @@ public InvokeNode createIndirectCall(ValueNode targetAddress, List ar return createIndirectCall(targetAddress, args, signature.toParameterTypes(null), returnStamp, returnKind, callKind); } - private InvokeNode createIndirectCall(ValueNode targetAddress, List args, JavaType[] parameterTypes, Stamp returnStamp, JavaKind returnKind, + private InvokeNode createIndirectCall(ValueNode targetAddress, List args, List parameterTypes, Stamp returnStamp, JavaKind returnKind, SubstrateCallingConventionKind callKind) { return createIndirectCall(targetAddress, args, parameterTypes, returnStamp, returnKind, callKind.toType(true)); } - private InvokeNode createIndirectCall(ValueNode targetAddress, List args, JavaType[] parameterTypes, Stamp returnStamp, JavaKind returnKind, + private InvokeNode createIndirectCall(ValueNode targetAddress, List args, List parameterTypes, Stamp returnStamp, JavaKind returnKind, CallingConvention.Type convention) { frameState.clearStack(); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/NonSnippetLowerings.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/NonSnippetLowerings.java index 3bdb830c6f47..abdcf8a145fd 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/NonSnippetLowerings.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/NonSnippetLowerings.java @@ -336,7 +336,7 @@ public void lower(FixedNode node, LoweringTool tool) { nodesToLower.add(nullCheck); } SharedMethod method = (SharedMethod) callTarget.targetMethod(); - JavaType[] signature = method.getSignature().toParameterTypes(callTarget.isStatic() ? null : method.getDeclaringClass()); + List signature = method.getSignature().toParameterTypes(callTarget.isStatic() ? null : method.getDeclaringClass()); CallingConvention.Type callType = method.getCallingConventionKind().toType(true); InvokeKind invokeKind = callTarget.invokeKind(); SharedMethod[] implementations = method.getImplementations(); @@ -484,19 +484,19 @@ public void lower(FixedNode node, LoweringTool tool) { } @SuppressWarnings("unused") - protected LoweredCallTargetNode createDirectCall(StructuredGraph graph, MethodCallTargetNode callTarget, NodeInputList parameters, JavaType[] signature, + protected LoweredCallTargetNode createDirectCall(StructuredGraph graph, MethodCallTargetNode callTarget, NodeInputList parameters, List signature, CallingConvention.Type callType, InvokeKind invokeKind, SharedMethod targetMethod, FixedNode node) { return graph.add(new DirectCallTargetNode(parameters.toArray(ValueNode.EMPTY_ARRAY), callTarget.returnStamp(), signature, targetMethod, callType, invokeKind)); } - protected IndirectCallTargetNode createIndirectCall(StructuredGraph graph, MethodCallTargetNode callTarget, NodeInputList parameters, SharedMethod method, JavaType[] signature, + protected IndirectCallTargetNode createIndirectCall(StructuredGraph graph, MethodCallTargetNode callTarget, NodeInputList parameters, SharedMethod method, List signature, CallingConvention.Type callType, InvokeKind invokeKind, ValueNode entry) { JavaMethodProfile methodProfile = callTarget instanceof SubstrateMethodCallTargetNode substrateCallTarget ? substrateCallTarget.getMethodProfile() : null; return graph.add(new SubstrateIndirectCallTargetNode(entry, parameters.toArray(ValueNode.EMPTY_ARRAY), callTarget.returnStamp(), signature, method, callType, invokeKind, methodProfile)); } - private static CallTargetNode createUnreachableCallTarget(LoweringTool tool, FixedNode node, NodeInputList parameters, StampPair returnStamp, JavaType[] signature, + private static CallTargetNode createUnreachableCallTarget(LoweringTool tool, FixedNode node, NodeInputList parameters, StampPair returnStamp, List signature, SharedMethod method, CallingConvention.Type callType, InvokeKind invokeKind) { StructuredGraph graph = node.graph(); 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 150e651615b3..5969a1e055f1 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(false)[0].getConstantPool(); + return metaAccess.lookupJavaType(JNIJavaCallVariantWrapperHolder.class).getDeclaredConstructors(false).getFirst().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 9f39180f2868..f8eb3c14bce7 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(false)[0].getConstantPool(); + return metaAccess.lookupJavaType(JNIJavaCallWrapperHolder.class).getDeclaredConstructors(false).getFirst().getConstantPool(); } private JNIJavaCallWrapperHolder() { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/nodes/SubstrateIndirectCallTargetNode.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/nodes/SubstrateIndirectCallTargetNode.java index 1f36a7d140ad..3296e432fa1d 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/nodes/SubstrateIndirectCallTargetNode.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/nodes/SubstrateIndirectCallTargetNode.java @@ -34,24 +34,26 @@ import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + @NodeInfo public class SubstrateIndirectCallTargetNode extends IndirectCallTargetNode { public static final NodeClass TYPE = NodeClass.create(SubstrateIndirectCallTargetNode.class); private final JavaMethodProfile methodProfile; - public SubstrateIndirectCallTargetNode(ValueNode computedAddress, ValueNode[] arguments, StampPair returnStamp, JavaType[] signature, ResolvedJavaMethod target, + public SubstrateIndirectCallTargetNode(ValueNode computedAddress, ValueNode[] arguments, StampPair returnStamp, List signature, ResolvedJavaMethod target, CallingConvention.Type callType, InvokeKind invokeKind, JavaMethodProfile methodProfile) { this(TYPE, computedAddress, arguments, returnStamp, signature, target, callType, invokeKind, methodProfile); } - public SubstrateIndirectCallTargetNode(ValueNode computedAddress, ValueNode[] arguments, StampPair returnStamp, JavaType[] signature, ResolvedJavaMethod target, + public SubstrateIndirectCallTargetNode(ValueNode computedAddress, ValueNode[] arguments, StampPair returnStamp, List signature, ResolvedJavaMethod target, CallingConvention.Type callType, InvokeKind invokeKind) { this(TYPE, computedAddress, arguments, returnStamp, signature, target, callType, invokeKind, null); } protected SubstrateIndirectCallTargetNode(NodeClass type, ValueNode computedAddress, ValueNode[] arguments, StampPair returnStamp, - JavaType[] signature, ResolvedJavaMethod target, CallingConvention.Type callType, InvokeKind invokeKind, JavaMethodProfile methodProfile) { + List signature, ResolvedJavaMethod target, CallingConvention.Type callType, InvokeKind invokeKind, JavaMethodProfile methodProfile) { super(type, computedAddress, arguments, returnStamp, signature, target, callType, invokeKind); this.methodProfile = methodProfile; } diff --git a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/hosted/runtimecompilation/GraalGraphObjectReplacer.java b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/hosted/runtimecompilation/GraalGraphObjectReplacer.java index af1702a2dbb3..4ab73eec4792 100644 --- a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/hosted/runtimecompilation/GraalGraphObjectReplacer.java +++ b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/hosted/runtimecompilation/GraalGraphObjectReplacer.java @@ -24,6 +24,7 @@ */ package com.oracle.svm.graal.hosted.runtimecompilation; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -378,10 +379,10 @@ private static AnalysisType toAnalysisType(JavaType original) { } private SubstrateField[] createAllInstanceFields(ResolvedJavaType originalType) { - ResolvedJavaField[] originalFields = originalType.getInstanceFields(true); - SubstrateField[] sFields = new SubstrateField[originalFields.length]; - for (int idx = 0; idx < originalFields.length; idx++) { - sFields[idx] = createField(originalFields[idx]); + List originalFields = originalType.getInstanceFields(true); + SubstrateField[] sFields = new SubstrateField[originalFields.size()]; + for (int idx = 0; idx < originalFields.size(); idx++) { + sFields[idx] = createField(originalFields.get(idx)); } return sFields; } diff --git a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateMethod.java b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateMethod.java index c2ca2d57ea3b..1983e466c962 100644 --- a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateMethod.java +++ b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateMethod.java @@ -31,6 +31,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Modifier; import java.lang.reflect.Type; +import java.util.List; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; @@ -376,7 +377,7 @@ public boolean canBeStaticallyBound() { } @Override - public ExceptionHandler[] getExceptionHandlers() { + public List getExceptionHandlers() { throw shouldNotReachHereAtRuntime(); // ExcludeFromJacocoGeneratedReport } @@ -422,7 +423,7 @@ public Annotation[][] getParameterAnnotations() { } @Override - public Type[] getGenericParameterTypes() { + public List getGenericParameterTypes() { throw intentionallyUnimplemented(); // ExcludeFromJacocoGeneratedReport } 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 b2f7d8d39047..02fea58ff047 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 @@ -26,6 +26,7 @@ import java.lang.annotation.Annotation; import java.util.Arrays; +import java.util.List; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; @@ -233,13 +234,13 @@ public SubstrateType getSuperclass() { } @Override - public ResolvedJavaType[] getInterfaces() { + public List getInterfaces() { DynamicHub[] hubs = hub.getInterfaces(); SubstrateType[] result = new SubstrateType[hubs.length]; for (int i = 0; i < result.length; i++) { result[i] = SubstrateMetaAccess.singleton().lookupJavaTypeFromHub(hubs[i]); } - return result; + return List.of(result); } private SubstrateType getSuperType() { @@ -296,7 +297,7 @@ public ResolvedJavaType getArrayClass() { } @Override - public SubstrateField[] getInstanceFields(boolean includeSuperclasses) { + public List getInstanceFields(boolean includeSuperclasses) { if (rawAllInstanceFields == null) { /* * The type was created at run time from the Class, so we do not have field information. @@ -307,7 +308,7 @@ public SubstrateField[] getInstanceFields(boolean includeSuperclasses) { SubstrateType superclass = getSuperclass(); if (includeSuperclasses || superclass == null) { - return rawAllInstanceFields; + return List.of(rawAllInstanceFields); } else { int totalCount = getInstanceFieldCount(); @@ -315,13 +316,13 @@ public SubstrateField[] getInstanceFields(boolean includeSuperclasses) { assert totalCount >= superCount; if (totalCount == superCount) { - return SubstrateField.EMPTY_ARRAY; + return List.of(); } else if (superCount == 0) { - return rawAllInstanceFields; + return List.of(rawAllInstanceFields); } else { - assert Arrays.equals(superclass.getInstanceFields(true), + assert Arrays.equals(superclass.getInstanceFields(true).toArray(), Arrays.copyOf(rawAllInstanceFields, superCount)) : "Superclass fields must be the first elements of the fields defined in this class"; - return Arrays.copyOfRange(rawAllInstanceFields, superCount, totalCount); + return List.of(rawAllInstanceFields).subList(superCount, totalCount); } } } @@ -331,7 +332,7 @@ public int getInstanceFieldCount() { } @Override - public ResolvedJavaField[] getStaticFields() { + public List getStaticFields() { throw VMError.intentionallyUnimplemented(); // ExcludeFromJacocoGeneratedReport } @@ -411,22 +412,22 @@ public ResolvedJavaType getEnclosingType() { } @Override - public ResolvedJavaMethod[] getDeclaredConstructors() { + public List getDeclaredConstructors() { return getDeclaredConstructors(true); } @Override - public ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) { + public List getDeclaredConstructors(boolean forceLink) { throw VMError.intentionallyUnimplemented(); // ExcludeFromJacocoGeneratedReport } @Override - public ResolvedJavaMethod[] getDeclaredMethods() { + public List getDeclaredMethods() { return getDeclaredMethods(true); } @Override - public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) { + public List getDeclaredMethods(boolean forceLink) { throw VMError.intentionallyUnimplemented(); // ExcludeFromJacocoGeneratedReport } @@ -462,12 +463,6 @@ public boolean isCloneableWithAllocation() { return SubstrateMetaAccess.singleton().lookupJavaType(Cloneable.class).isAssignableFrom(this); } - @SuppressWarnings("deprecation") - @Override - public ResolvedJavaType getHostClass() { - throw VMError.intentionallyUnimplemented(); // ExcludeFromJacocoGeneratedReport - } - @Override public int hashCode() { return hub.hashCode(); diff --git a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/pltgot/PLTGOTNonSnippetLowerings.java b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/pltgot/PLTGOTNonSnippetLowerings.java index 5216dc48dab4..66bac321b994 100644 --- a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/pltgot/PLTGOTNonSnippetLowerings.java +++ b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/pltgot/PLTGOTNonSnippetLowerings.java @@ -24,6 +24,7 @@ */ package com.oracle.svm.graal.pltgot; +import java.util.List; import java.util.Map; import org.graalvm.nativeimage.Platform; @@ -85,7 +86,7 @@ private static final class InvokeThroughGOTLowering extends NonSnippetLowerings. } @Override - protected LoweredCallTargetNode createDirectCall(StructuredGraph graph, MethodCallTargetNode callTarget, NodeInputList parameters, JavaType[] signature, + protected LoweredCallTargetNode createDirectCall(StructuredGraph graph, MethodCallTargetNode callTarget, NodeInputList parameters, List signature, CallingConvention.Type callType, CallTargetNode.InvokeKind invokeKind, SharedMethod callee, FixedNode node) { SharedMethod caller = (SharedMethod) graph.method(); if (methodAddressResolutionSupport.shouldCallViaPLTGOT(caller, callee)) { @@ -106,7 +107,7 @@ protected LoweredCallTargetNode createDirectCall(StructuredGraph graph, MethodCa } @Override - protected IndirectCallTargetNode createIndirectCall(StructuredGraph graph, MethodCallTargetNode callTarget, NodeInputList parameters, SharedMethod callee, JavaType[] signature, + protected IndirectCallTargetNode createIndirectCall(StructuredGraph graph, MethodCallTargetNode callTarget, NodeInputList parameters, SharedMethod callee, List signature, CallingConvention.Type callType, CallTargetNode.InvokeKind invokeKind, ValueNode entry) { SharedMethod caller = (SharedMethod) graph.method(); /* diff --git a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/pltgot/SubstrateGOTCallTargetNode.java b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/pltgot/SubstrateGOTCallTargetNode.java index c90c6f187114..98ffa5cf5a39 100644 --- a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/pltgot/SubstrateGOTCallTargetNode.java +++ b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/pltgot/SubstrateGOTCallTargetNode.java @@ -34,12 +34,14 @@ import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + @NodeInfo public final class SubstrateGOTCallTargetNode extends SubstrateIndirectCallTargetNode { public static final NodeClass TYPE = NodeClass.create(SubstrateGOTCallTargetNode.class); - public SubstrateGOTCallTargetNode(ValueNode computedAddress, ValueNode[] arguments, StampPair returnStamp, JavaType[] signature, ResolvedJavaMethod target, CallingConvention.Type callType, - InvokeKind invokeKind) { + public SubstrateGOTCallTargetNode(ValueNode computedAddress, ValueNode[] arguments, StampPair returnStamp, List signature, ResolvedJavaMethod target, CallingConvention.Type callType, + InvokeKind invokeKind) { super(TYPE, computedAddress, arguments, returnStamp, signature, target, callType, invokeKind, null); } } diff --git a/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/DowncallStub.java b/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/DowncallStub.java index 84b5024c0da2..aae2c3c8436f 100644 --- a/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/DowncallStub.java +++ b/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/DowncallStub.java @@ -90,7 +90,7 @@ @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+17/src/hotspot/cpu/aarch64/downcallLinker_aarch64.cpp") class DowncallStub extends NonBytecodeMethod { public static Signature createSignature(MetaAccessProvider metaAccess) { - return ResolvedSignature.fromKinds(new JavaKind[]{JavaKind.Object}, JavaKind.Object, metaAccess); + return ResolvedSignature.fromKinds(List.of(JavaKind.Object), JavaKind.Object, metaAccess); } private final NativeEntryPointInfo nep; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ameta/AnalysisConstantReflectionProvider.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ameta/AnalysisConstantReflectionProvider.java index 0185470e6b48..5700d2df4318 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ameta/AnalysisConstantReflectionProvider.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ameta/AnalysisConstantReflectionProvider.java @@ -24,6 +24,7 @@ */ package com.oracle.svm.hosted.ameta; +import java.util.List; import java.util.Objects; import java.util.Set; import java.util.function.ObjIntConsumer; @@ -141,9 +142,9 @@ public JavaConstant unboxPrimitive(JavaConstant source) { AnalysisType type = imageHeapConstant.getType(); if (BOXING_CLASSES.contains(type.getJavaClass())) { imageHeapConstant.ensureReaderInstalled(); - ResolvedJavaField[] fields = type.getInstanceFields(true); - assert fields.length == 1 && fields[0].getName().equals("value"); - return ((ImageHeapInstance) imageHeapConstant).readFieldValue((AnalysisField) fields[0]); + List fields = type.getInstanceFields(true); + assert fields.size() == 1 && fields.getFirst().getName().equals("value"); + return ((ImageHeapInstance) imageHeapConstant).readFieldValue((AnalysisField) fields.getFirst()); } /* Not a valid boxed primitive. */ return null; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/analysis/DynamicHubInitializer.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/analysis/DynamicHubInitializer.java index 665dad23abe4..842adf52262e 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/analysis/DynamicHubInitializer.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/analysis/DynamicHubInitializer.java @@ -26,6 +26,7 @@ import java.lang.reflect.Field; import java.util.Arrays; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -293,28 +294,28 @@ private ClassInitializationInfo buildRuntimeInitializationInfo(AnalysisType type } class InterfacesEncodingKey { - final AnalysisType[] aInterfaces; + final List aInterfaces; - InterfacesEncodingKey(AnalysisType[] aInterfaces) { + InterfacesEncodingKey(List aInterfaces) { this.aInterfaces = aInterfaces; } DynamicHub[] createHubs() { - DynamicHub[] hubs = new DynamicHub[aInterfaces.length]; + DynamicHub[] hubs = new DynamicHub[aInterfaces.size()]; for (int i = 0; i < hubs.length; i++) { - hubs[i] = hostVM.dynamicHub(aInterfaces[i]); + hubs[i] = hostVM.dynamicHub(aInterfaces.get(i)); } return hubs; } @Override public boolean equals(Object obj) { - return obj instanceof InterfacesEncodingKey && Arrays.equals(aInterfaces, ((InterfacesEncodingKey) obj).aInterfaces); + return obj instanceof InterfacesEncodingKey other && aInterfaces.equals(other.aInterfaces); } @Override public int hashCode() { - return Arrays.hashCode(aInterfaces); + return aInterfaces.hashCode(); } } @@ -323,11 +324,11 @@ public int hashCode() { */ private void fillInterfaces(AnalysisType type, DynamicHub hub) { AnalysisError.guarantee(hub.getInterfacesEncoding() == null, "Interfaces already computed for %s.", type.toJavaName(true)); - AnalysisType[] aInterfaces = type.getInterfaces(); - if (aInterfaces.length == 0) { + List aInterfaces = type.getInterfaces(); + if (aInterfaces.isEmpty()) { hub.setInterfacesEncoding(null); - } else if (aInterfaces.length == 1) { - hub.setInterfacesEncoding(hostVM.dynamicHub(aInterfaces[0])); + } else if (aInterfaces.size() == 1) { + hub.setInterfacesEncoding(hostVM.dynamicHub(aInterfaces.getFirst())); } else { /* * Many interfaces arrays are the same, e.g., all arrays implement the same two diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/analysis/NativeImagePointsToAnalysis.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/analysis/NativeImagePointsToAnalysis.java index c08ebd6e0b04..da9436e9234a 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/analysis/NativeImagePointsToAnalysis.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/analysis/NativeImagePointsToAnalysis.java @@ -157,8 +157,8 @@ public void onTypeReachable(AnalysisType type) { * Using getInstanceFields and getStaticFields allows to include the fields from the * substitution class. */ - Stream.concat(Arrays.stream(getOrDefault(type, t -> t.getInstanceFields(true), new AnalysisField[0])), - Arrays.stream(getOrDefault(type, AnalysisType::getStaticFields, new AnalysisField[0]))) + Stream.concat(getOrDefault(type, t -> t.getInstanceFields(true).stream(), Stream.empty()), + getOrDefault(type, t -> t.getStaticFields().stream(), Stream.empty())) .filter(field -> field != null && classInclusionPolicy.isFieldIncluded((AnalysisField) field)) .forEach(field -> classInclusionPolicy.includeField((AnalysisField) field)); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionMethod.java index 225558af0ebb..410539e24858 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionMethod.java @@ -29,6 +29,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Type; +import java.util.List; import com.oracle.graal.pointsto.infrastructure.GraphProvider; import com.oracle.graal.pointsto.infrastructure.OriginalMethodProvider; @@ -190,8 +191,8 @@ public boolean canBeStaticallyBound() { } @Override - public ExceptionHandler[] getExceptionHandlers() { - return new ExceptionHandler[0]; + public List getExceptionHandlers() { + return List.of(); } @Override @@ -223,7 +224,7 @@ public AnnotatedElement getAnnotationRoot() { } @Override - public Parameter[] getParameters() { + public List getParameters() { return original.getParameters(); } @@ -233,7 +234,7 @@ public Annotation[][] getParameterAnnotations() { } @Override - public Type[] getGenericParameterTypes() { + public List getGenericParameterTypes() { return original.getGenericParameterTypes(); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionType.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionType.java index 20adad53717f..ae9ebfc3c8cd 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionType.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionType.java @@ -133,12 +133,6 @@ public boolean isAssignableFrom(ResolvedJavaType other) { return original.isAssignableFrom(other); } - @SuppressWarnings("deprecation") - @Override - public ResolvedJavaType getHostClass() { - return original.getHostClass(); - } - @Override public boolean isJavaLangObject() { return original.isJavaLangObject(); @@ -155,7 +149,7 @@ public ResolvedJavaType getSuperclass() { } @Override - public ResolvedJavaType[] getInterfaces() { + public List getInterfaces() { return original.getInterfaces(); } @@ -205,12 +199,12 @@ public AssumptionResult findUniqueConcreteMethod(ResolvedJav } @Override - public ResolvedJavaField[] getInstanceFields(boolean includeSuperclasses) { + public List getInstanceFields(boolean includeSuperclasses) { return original.getInstanceFields(includeSuperclasses); } @Override - public ResolvedJavaField[] getStaticFields() { + public List getStaticFields() { return original.getStaticFields(); } @@ -240,28 +234,28 @@ public ResolvedJavaType getEnclosingType() { } @Override - public ResolvedJavaMethod[] getDeclaredConstructors() { + public List getDeclaredConstructors() { return getDeclaredConstructors(true); } @Override - public ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) { + public List 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() { + public List getDeclaredMethods() { return getDeclaredMethods(true); } @Override - public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) { + public List getDeclaredMethods(boolean forceLink) { return original.getDeclaredMethods(forceLink); } @Override - public List getAllMethods(boolean forceLink) { + public List getAllMethods(boolean forceLink) { return original.getAllMethods(forceLink); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/NativeLibraries.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/NativeLibraries.java index 41a00032cac5..52d3d4313de9 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/NativeLibraries.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/NativeLibraries.java @@ -550,8 +550,8 @@ public void registerElementInfo(AnnotatedElement e, ElementInfo elementInfo) { public ElementInfo findElementInfo(AnnotatedElement element) { Object element1 = unwrap(element); ElementInfo result = elementToInfo.get(element1); - if (result == null && element1 instanceof ResolvedJavaType && ((ResolvedJavaType) element1).getInterfaces().length == 1) { - result = findElementInfo(((ResolvedJavaType) element1).getInterfaces()[0]); + if (result == null && element1 instanceof ResolvedJavaType && ((ResolvedJavaType) element1).getInterfaces().size() == 1) { + result = findElementInfo(((ResolvedJavaType) element1).getInterfaces().getFirst()); } return result; } 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 b4f22367d1c5..836a7cea61dd 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 @@ -266,7 +266,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(false)).anyMatch(v -> v.getDeclaredAnnotation(InvokeCFunctionPointer.class) != null); + type.getDeclaredMethods(false).stream().anyMatch(v -> v.getDeclaredAnnotation(InvokeCFunctionPointer.class) != null); } /** diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/AnalysisToHostedGraphTransplanter.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/AnalysisToHostedGraphTransplanter.java index 22837011f519..7bb9e771a565 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/AnalysisToHostedGraphTransplanter.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/AnalysisToHostedGraphTransplanter.java @@ -171,9 +171,9 @@ protected void transplantEscapeAnalysisState(StructuredGraph graph) { for (VirtualInstanceNode node : graph.getNodes(VirtualInstanceNode.TYPE)) { AnalysisType aType = (AnalysisType) node.type(); - ResolvedJavaField[] aFields = node.getFields(); - assert Arrays.equals(aFields, aType.getInstanceFields(true)); - HostedField[] hFields = universe.lookup(aType).getInstanceFields(true); + List aFields = node.getFields(); + assert aFields.equals(aType.getInstanceFields(true)); + List hFields = universe.lookup(aType).getInstanceFields(true); /* * We cannot directly write the final field `VirtualInstanceNode.fields`. So we rely on * the NodeClass mechanism, which is also used to transplant all other fields. @@ -200,11 +200,11 @@ private void transplantVirtualObjectState(VirtualObjectNode virtualObject, List< * `AnalysisField.getPosition` gives us the index of the field in the analysis-level * list of field values. */ - assert virtualObject.entryCount() == aType.getInstanceFields(true).length; - HostedField[] hFields = universe.lookup(aType).getInstanceFields(true); + assert virtualObject.entryCount() == aType.getInstanceFields(true).size(); + List hFields = universe.lookup(aType).getInstanceFields(true); for (HostedField hField : hFields) { int aPosition = hField.wrapped.getPosition(); - assert hField.wrapped.equals(aType.getInstanceFields(true)[aPosition]); + assert hField.wrapped.equals(aType.getInstanceFields(true).get(aPosition)); hValues.add(aValues.get(aObjectStartIndex + aPosition)); } } 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 0cd79b174e31..fc3152ec98a5 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 @@ -143,7 +143,7 @@ private static ResolvedSignature createSignature(AnalysisMetho } @Override - public Parameter[] getParameters() { + public List getParameters() { return targetMethod.getParameters(); } @@ -195,13 +195,13 @@ public StructuredGraph buildGraph(DebugContext debug, AnalysisMethod method, Hos } if (!createdReturnNode) { - AnalysisMethod[] bailoutMethods = kit.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", + List bailoutMethods = kit.getMetaAccess().lookupJavaType(bailoutCustomizer).getDeclaredMethods(false); + UserError.guarantee(bailoutMethods.size() == 1 && bailoutMethods.getFirst().isStatic(), "Prologue bailout customization class must declare exactly one static method: %s -> %s", targetMethod, bailoutCustomizer); - InvokeWithExceptionNode invokeBailoutCustomizer = generatePrologueOrEpilogueInvoke(kit, bailoutMethods[0], invokePrologue); - VMError.guarantee(bailoutMethods[0].getSignature().getReturnKind() == method.getSignature().getReturnKind(), - "Return type mismatch: %s is incompatible with %s", bailoutMethods[0], targetMethod); + InvokeWithExceptionNode invokeBailoutCustomizer = generatePrologueOrEpilogueInvoke(kit, bailoutMethods.getFirst(), invokePrologue); + VMError.guarantee(bailoutMethods.getFirst().getSignature().getReturnKind() == method.getSignature().getReturnKind(), + "Return type mismatch: %s is incompatible with %s", bailoutMethods.getFirst(), targetMethod); kit.createReturn(invokeBailoutCustomizer, targetMethod.getSignature().getReturnKind()); } @@ -408,15 +408,15 @@ private InvokeWithExceptionNode generatePrologue(HostedGraphKit kit, List prologueMethods = prologue.getDeclaredMethods(false); + UserError.guarantee(prologueMethods.size() == 1 && prologueMethods.getFirst().isStatic(), "Prologue class must declare exactly one static method: %s -> %s", targetMethod, prologue); - UserError.guarantee(Uninterruptible.Utils.isUninterruptible(prologueMethods[0]), - "Prologue method must be annotated with @%s: %s", Uninterruptible.class.getSimpleName(), prologueMethods[0]); - ValueNode[] prologueArgs = matchPrologueParameters(kit, parameterTypes, args, prologueMethods[0]); - return generatePrologueOrEpilogueInvoke(kit, prologueMethods[0], prologueArgs); + UserError.guarantee(Uninterruptible.Utils.isUninterruptible(prologueMethods.getFirst()), + "Prologue method must be annotated with @%s: %s", Uninterruptible.class.getSimpleName(), prologueMethods.getFirst()); + ValueNode[] prologueArgs = matchPrologueParameters(kit, parameterTypes, args, prologueMethods.getFirst()); + return generatePrologueOrEpilogueInvoke(kit, prologueMethods.getFirst(), prologueArgs); } // Automatically choose prologue from signature and annotations and call @@ -432,9 +432,9 @@ private InvokeWithExceptionNode generatePrologue(HostedGraphKit kit, List prologueMethods = kit.getMetaAccess().lookupJavaType(prologueClass).getDeclaredMethods(false); + assert prologueMethods.size() == 1 && prologueMethods.getFirst().isStatic() : "Prologue class must declare exactly one static method"; + return generatePrologueOrEpilogueInvoke(kit, prologueMethods.getFirst(), contextValue); } private static InvokeWithExceptionNode generatePrologueOrEpilogueInvoke(SubstrateGraphKit kit, AnalysisMethod method, ValueNode... args) { @@ -547,16 +547,16 @@ private void generateExceptionHandler(ResolvedJavaMethod method, HostedGraphKit } else { AnalysisType throwable = kit.getMetaAccess().lookupJavaType(Throwable.class); AnalysisType handler = kit.getMetaAccess().lookupJavaType(entryPointData.getExceptionHandler()); - AnalysisMethod[] handlerMethods = handler.getDeclaredMethods(false); - UserError.guarantee(handlerMethods.length == 1 && handlerMethods[0].isStatic(), + List handlerMethods = handler.getDeclaredMethods(false); + UserError.guarantee(handlerMethods.size() == 1 && handlerMethods.getFirst().isStatic(), "Exception handler class must declare exactly one static method: %s -> %s", targetMethod, handler); - UserError.guarantee(Uninterruptible.Utils.isUninterruptible(handlerMethods[0]), - "Exception handler method must be annotated with @%s: %s", Uninterruptible.class.getSimpleName(), handlerMethods[0]); - List handlerParameterTypes = handlerMethods[0].toParameterList(); + UserError.guarantee(Uninterruptible.Utils.isUninterruptible(handlerMethods.getFirst()), + "Exception handler method must be annotated with @%s: %s", Uninterruptible.class.getSimpleName(), handlerMethods.getFirst()); + List handlerParameterTypes = handlerMethods.getFirst().toParameterList(); UserError.guarantee(handlerParameterTypes.size() == 1 && - handlerParameterTypes.get(0).isAssignableFrom(throwable), - "Exception handler method must have exactly one parameter of type Throwable: %s -> %s", targetMethod, handlerMethods[0]); - InvokeWithExceptionNode handlerInvoke = kit.startInvokeWithException(handlerMethods[0], InvokeKind.Static, kit.getFrameState(), kit.bci(), exception); + handlerParameterTypes.getFirst().isAssignableFrom(throwable), + "Exception handler method must have exactly one parameter of type Throwable: %s -> %s", targetMethod, handlerMethods.getFirst()); + InvokeWithExceptionNode handlerInvoke = kit.startInvokeWithException(handlerMethods.getFirst(), InvokeKind.Static, kit.getFrameState(), kit.bci(), exception); kit.noExceptionPart(); ValueNode returnValue = handlerInvoke; if (handlerInvoke.getStackKind() != returnKind) { @@ -569,7 +569,7 @@ private void generateExceptionHandler(ResolvedJavaMethod method, HostedGraphKit returnValue = kit.unique(new SignExtendNode(returnValue, returnKind.getBitCount())); } else { throw UserError.abort("Exception handler method return type must be assignable to entry point method return type: %s -> %s", - targetMethod, handlerMethods[0]); + targetMethod, handlerMethods.getFirst()); } } @@ -615,12 +615,12 @@ private void generateEpilogue(HostedGraphKit kit) { return; } AnalysisType epilogue = kit.getMetaAccess().lookupJavaType(epilogueClass); - AnalysisMethod[] epilogueMethods = epilogue.getDeclaredMethods(false); - UserError.guarantee(epilogueMethods.length == 1 && epilogueMethods[0].isStatic() && epilogueMethods[0].getSignature().getParameterCount(false) == 0, + List epilogueMethods = epilogue.getDeclaredMethods(false); + UserError.guarantee(epilogueMethods.size() == 1 && epilogueMethods.getFirst().isStatic() && epilogueMethods.getFirst().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]), - "Epilogue method must be annotated with @%s: %s", Uninterruptible.class.getSimpleName(), epilogueMethods[0]); - generatePrologueOrEpilogueInvoke(kit, epilogueMethods[0]); + UserError.guarantee(Uninterruptible.Utils.isUninterruptible(epilogueMethods.getFirst()), + "Epilogue method must be annotated with @%s: %s", Uninterruptible.class.getSimpleName(), epilogueMethods.getFirst()); + generatePrologueOrEpilogueInvoke(kit, epilogueMethods.getFirst()); } public boolean isNotPublished() { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CEntryPointJavaCallStubMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CEntryPointJavaCallStubMethod.java index d384b6831f03..ba5c69b44654 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CEntryPointJavaCallStubMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CEntryPointJavaCallStubMethod.java @@ -82,10 +82,10 @@ protected void emitCallerEpilogue(HostedGraphKit kit) { CEntryPointOptions options = getOriginal().getAnnotation(CEntryPointOptions.class); if (options != null && options.callerEpilogue() != null && options.callerEpilogue() != CEntryPointOptions.NoCallerEpilogue.class) { AnalysisType epilogue = kit.getMetaAccess().lookupJavaType(options.callerEpilogue()); - AnalysisMethod[] epilogueMethods = epilogue.getDeclaredMethods(false); - UserError.guarantee(epilogueMethods.length == 1 && epilogueMethods[0].isStatic() && epilogueMethods[0].getSignature().getParameterCount(false) == 0, + List epilogueMethods = epilogue.getDeclaredMethods(false); + UserError.guarantee(epilogueMethods.size() == 1 && epilogueMethods.getFirst().isStatic() && epilogueMethods.getFirst().getSignature().getParameterCount(false) == 0, "Caller epilogue class must declare exactly one static method without parameters: %s -> %s", getOriginal(), epilogue); - kit.createInvokeWithExceptionAndUnwind(epilogueMethods[0], CallTargetNode.InvokeKind.Static, kit.getFrameState(), kit.bci()); + kit.createInvokeWithExceptionAndUnwind(epilogueMethods.getFirst(), CallTargetNode.InvokeKind.Static, kit.getFrameState(), kit.bci()); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/NonBytecodeMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/NonBytecodeMethod.java index 9316b94ba121..0046f400e297 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/NonBytecodeMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/NonBytecodeMethod.java @@ -28,6 +28,7 @@ import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Modifier; import java.lang.reflect.Type; +import java.util.List; import com.oracle.graal.pointsto.infrastructure.GraphProvider; import com.oracle.graal.pointsto.infrastructure.OriginalMethodProvider; @@ -100,7 +101,7 @@ public Signature getSignature() { } @Override - public Parameter[] getParameters() { + public List getParameters() { throw VMError.intentionallyUnimplemented(); // ExcludeFromJacocoGeneratedReport } @@ -170,8 +171,8 @@ public boolean canBeStaticallyBound() { } @Override - public ExceptionHandler[] getExceptionHandlers() { - return new ExceptionHandler[0]; + public List getExceptionHandlers() { + return List.of(); } @Override @@ -198,7 +199,7 @@ public Annotation[][] getParameterAnnotations() { } @Override - public Type[] getGenericParameterTypes() { + public List getGenericParameterTypes() { throw VMError.intentionallyUnimplemented(); // ExcludeFromJacocoGeneratedReport } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/HeapDumpFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/HeapDumpFeature.java index 5378018ac5f0..6a9524ccdc34 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/HeapDumpFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/HeapDumpFeature.java @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; +import java.util.List; import com.oracle.svm.core.encoder.SymbolEncoder; import org.graalvm.collections.EconomicMap; @@ -193,7 +194,7 @@ private static void encodeMetadata(UnsafeArrayTypeWriter output, Collection collectFields(ResolvedJavaField[] input) { + private static ArrayList collectFields(List input) { /* Collect all fields that have a location. */ ArrayList result = new ArrayList<>(); for (ResolvedJavaField f : input) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImage.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImage.java index 6928eea7bdf3..cc16ba61d8d2 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImage.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImage.java @@ -355,7 +355,7 @@ private void writeMethodHeader(HostedMethod m, CSourceCodeWriter writer, boolean String sep = ""; AnnotatedType[] annotatedParameterTypes = getAnnotatedParameterTypes(m); - Parameter[] parameters = m.getParameters(); + List parameters = m.getParameters(); assert parameters != null; for (int i = 0; i < m.getSignature().getParameterCount(false); i++) { writer.append(sep); @@ -366,9 +366,9 @@ private void writeMethodHeader(HostedMethod m, CSourceCodeWriter writer, boolean annotatedParameterTypes[i].isAnnotationPresent(CConst.class), isUnsigned(annotatedParameterTypes[i]), metaAccess, nativeLibs)); - if (parameters[i].isNamePresent()) { + if (parameters.get(i).isNamePresent()) { writer.append(" "); - writer.append(parameters[i].getName()); + writer.append(parameters.get(i).getName()); } } writer.appendln(");"); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageCodeCache.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageCodeCache.java index 54d3baa9705a..c06e797df4bf 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageCodeCache.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageCodeCache.java @@ -483,7 +483,7 @@ protected void buildRuntimeMetadata(DebugContext debug, SnippetReflectionProvide HostedType hostedType = hUniverse.optionalLookup(analysisType); if (hostedType != null) { for (AnalysisMethod.Signature methodSignature : methodSignatures) { - HostedType[] parameterTypes = hUniverse.optionalLookup(methodSignature.parameterTypes()); + HostedType[] parameterTypes = hUniverse.optionalLookup(methodSignature.parameterTypes().toArray(HostedType.EMPTY_ARRAY)); if (parameterTypes != null) { runtimeMetadataEncoder.addNegativeMethodQueryMetadata(hostedType, methodSignature.name(), parameterTypes); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageDebugInfoProvider.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageDebugInfoProvider.java index f61b8a60640a..b62f9bda14a7 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageDebugInfoProvider.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageDebugInfoProvider.java @@ -495,9 +495,9 @@ public String loaderName() { @Override public Stream fieldInfoProvider() { - Stream instanceFieldsStream = Arrays.stream(hostedType.getInstanceFields(false)).map(this::createDebugFieldInfo); - if (hostedType instanceof HostedInstanceClass && hostedType.getStaticFields().length > 0) { - Stream staticFieldsStream = Arrays.stream(hostedType.getStaticFields()).map(this::createDebugStaticFieldInfo); + Stream instanceFieldsStream = hostedType.getInstanceFields(false).stream().map(this::createDebugFieldInfo); + if (hostedType instanceof HostedInstanceClass && !hostedType.getStaticFields().isEmpty()) { + Stream staticFieldsStream = hostedType.getStaticFields().stream().map(this::createDebugStaticFieldInfo); return Stream.concat(instanceFieldsStream, staticFieldsStream); } else { return instanceFieldsStream; @@ -525,7 +525,7 @@ public ResolvedJavaType superClass() { @Override public Stream interfaces() { // map through getOriginal so we can use the result as an id type - return Arrays.stream(hostedType.getInterfaces()).map(interfaceType -> getOriginal(interfaceType)); + return hostedType.getInterfaces().stream().map(interfaceType -> getOriginal(interfaceType)); } private NativeImageDebugFieldInfo createDebugFieldInfo(HostedField field) { @@ -2029,9 +2029,8 @@ private Local[] getLocalsBySlot() { LocalVariableTable lvt = method.getLocalVariableTable(); Local[] nonEmptySortedLocals = null; if (lvt != null) { - Local[] locals = lvt.getLocalsAt(bci); - if (locals != null && locals.length > 0) { - nonEmptySortedLocals = Arrays.copyOf(locals, locals.length); + nonEmptySortedLocals = lvt.getLocalsAt(bci).toArray(new Local[0]); + if (nonEmptySortedLocals != null && nonEmptySortedLocals.length > 0) { Arrays.sort(nonEmptySortedLocals, (Local l1, Local l2) -> l1.getSlot() - l2.getSlot()); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageHeapWriter.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageHeapWriter.java index 23398ec5499a..8f9138fe5d1e 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageHeapWriter.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageHeapWriter.java @@ -399,7 +399,7 @@ private void writeObject(ObjectInfo info, RelocatableBuffer buffer) { HostedInstanceClass instanceClazz = (HostedInstanceClass) clazz; long idHashOffset; - Stream instanceFields = Arrays.stream(clazz.getInstanceFields(true)).filter(HostedField::isRead); + Stream instanceFields = clazz.getInstanceFields(true).stream().filter(HostedField::isRead); if (dynamicHubLayout.isDynamicHub(clazz)) { /* diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerLoader.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerLoader.java index 6b12e65087dd..e0506cbf6866 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerLoader.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerLoader.java @@ -1512,7 +1512,7 @@ private JavaConstant getHostedFieldValue(ImageHeapInstance instance, AnalysisFie } private static AnalysisField getFieldFromIndex(ImageHeapInstance instance, int i) { - return (AnalysisField) instance.getType().getInstanceFields(true)[i]; + return (AnalysisField) instance.getType().getInstanceFields(true).get(i); } private void addBaseLayerObject(int id, long objectOffset, Supplier imageHeapConstantSupplier) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerWriter.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerWriter.java index 30ac5015e2d8..c18febf67691 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerWriter.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerWriter.java @@ -440,7 +440,7 @@ private void persistType(AnalysisType type, Supplier ((AnalysisField) f).getId())); + initInts(builder::initFields, type.getInstanceFields(true).stream().mapToInt(f -> ((AnalysisField) f).getId())); builder.setClassJavaName(type.toJavaName()); builder.setClassName(type.getName()); builder.setModifiers(type.getModifiers()); @@ -465,10 +465,10 @@ private void persistType(AnalysisType type, Supplier ((AnalysisField) f).getId())); - initInts(builder::initInstanceFieldIdsWithSuper, Arrays.stream(type.getInstanceFields(true)).mapToInt(f -> ((AnalysisField) f).getId())); - initInts(builder::initStaticFieldIds, Arrays.stream(type.getStaticFields()).mapToInt(f -> ((AnalysisField) f).getId())); + initInts(builder::initInterfaces, type.getInterfaces().stream().mapToInt(AnalysisType::getId)); + initInts(builder::initInstanceFieldIds, type.getInstanceFields(false).stream().mapToInt(f -> ((AnalysisField) f).getId())); + initInts(builder::initInstanceFieldIdsWithSuper, type.getInstanceFields(true).stream().mapToInt(f -> ((AnalysisField) f).getId())); + initInts(builder::initStaticFieldIds, type.getStaticFields().stream().mapToInt(f -> ((AnalysisField) f).getId())); persistAnnotations(type, builder::initAnnotationList); builder.setIsInstantiated(type.isInstantiated()); 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 e63b7b408d10..d90654b9db26 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 @@ -747,7 +747,7 @@ private static void finishFieldBeforeCompilation(String name, JNIAccessibleField private static boolean anyFieldMatches(ResolvedJavaType sub, String name) { try { - return Stream.concat(Stream.of(sub.getInstanceFields(false)), Stream.of(sub.getStaticFields())) + return Stream.concat(sub.getInstanceFields(false).stream(), sub.getStaticFields().stream()) .anyMatch(f -> f.getName().equals(name)); } catch (LinkageError ex) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNICallTrampolineMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNICallTrampolineMethod.java index 81065a75cfa6..5ef7b47a2641 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNICallTrampolineMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNICallTrampolineMethod.java @@ -118,7 +118,7 @@ public CompileFunction createCustomCompileFunction() { parameters.add(providers.getMetaAccess().lookupJavaType(JNIMethodId.class)); ResolvedJavaType returnType = providers.getWordTypes().getWordImplType(); CallingConvention callingConvention = backend.getCodeCache().getRegisterConfig().getCallingConvention( - SubstrateCallingConventionKind.Native.toType(true), returnType, parameters.toArray(new JavaType[0]), backend); + SubstrateCallingConventionKind.Native.toType(true), returnType, parameters, backend); RegisterValue threadArg = (RegisterValue) callingConvention.getArgument(0); // JNIEnv int threadIsolateOffset = ImageSingletons.lookup(VMThreadFeature.class).offsetOf(VMThreads.IsolateTL); RegisterValue methodIdArg = (RegisterValue) callingConvention.getArgument(parameters.size() - 1); 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 b8849a58a2e6..23d55303f26f 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 @@ -113,7 +113,7 @@ public void beforeAnalysis(BeforeAnalysisAccess arg) { AnalysisType invokes = metaAccess.lookupJavaType(JNIInvocationInterface.class); AnalysisType exports = metaAccess.lookupJavaType(JNIInvocationInterface.Exports.class); AnalysisType functions = metaAccess.lookupJavaType(JNIFunctions.class); - Stream analysisMethods = Stream.of(invokes, functions, exports).flatMap(type -> Stream.of(type.getDeclaredMethods(false))); + Stream analysisMethods = Stream.of(invokes, functions, exports).flatMap(type -> type.getDeclaredMethods(false).stream()); Stream unimplementedMethods = Stream.of((AnalysisMethod) getSingleMethod(metaAccess, UnimplementedWithJNIEnvArgument.class), (AnalysisMethod) getSingleMethod(metaAccess, UnimplementedWithJavaVMArgument.class)); Stream.concat(analysisMethods, unimplementedMethods).forEach(method -> { @@ -146,9 +146,9 @@ private static CFunctionPointer prepareCallTrampoline(CompilationAccessImpl acce } private static ResolvedJavaMethod getSingleMethod(MetaAccessProvider metaAccess, Class holder) { - ResolvedJavaMethod[] methods = metaAccess.lookupJavaType(holder).getDeclaredMethods(false); - assert methods.length == 1; - return methods[0]; + List methods = metaAccess.lookupJavaType(holder).getDeclaredMethods(false); + assert methods.size() == 1; + return methods.getFirst(); } private static CFunctionPointer getStubFunctionPointer(CompilationAccessImpl access, HostedMethod method) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIJavaCallVariantWrapperMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIJavaCallVariantWrapperMethod.java index cd59f8fbecde..466b645405e2 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIJavaCallVariantWrapperMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIJavaCallVariantWrapperMethod.java @@ -136,7 +136,7 @@ private static Signature createSignature(Signature callWrapperSignature, CallVar if (returnType.isObject()) { returnType = wordKind; // handle } - return ResolvedSignature.fromKinds(args.toArray(JavaKind[]::new), returnType, originalMetaAccess); + return ResolvedSignature.fromKinds(args, returnType, originalMetaAccess); } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIJavaCallWrapperMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIJavaCallWrapperMethod.java index 837a586856e9..33b7db1a3303 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIJavaCallWrapperMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIJavaCallWrapperMethod.java @@ -96,7 +96,7 @@ public boolean canInvokeConstructorOnObject(ResolvedJavaMethod constructor, Meta public static ResolvedSignature getGeneralizedSignatureForTarget(ResolvedJavaMethod targetMethod, MetaAccessProvider originalMetaAccess) { /* Note: does not include the receiver. */ - JavaKind[] paramKinds = targetMethod.getSignature().toParameterKinds(false); + List paramKinds = targetMethod.getSignature().toParameterKinds(false); JavaKind returnKind = targetMethod.getSignature().getReturnKind(); if (targetMethod.isConstructor()) { @@ -144,7 +144,7 @@ private static ResolvedSignature createSignature(Signature tar if (returnKind.isObject()) { returnKind = wordKind; // handle } - return ResolvedSignature.fromKinds(args, returnKind, originalMetaAccess); + return ResolvedSignature.fromKinds(List.of(args), returnKind, originalMetaAccess); } @Override @@ -241,7 +241,7 @@ private static ValueNode createMethodCallWithReceiver(JNIGraphKit kit, ResolvedS ValueNode[] argsWithReceiver = new ValueNode[1 + args.length]; argsWithReceiver[0] = kit.maybeCreateExplicitNullCheck(receiver); System.arraycopy(args, 0, argsWithReceiver, 1, args.length); - JavaType[] paramTypes = invokeSignature.toParameterTypes(kit.getMetaAccess().lookupJavaType(Object.class)); + List paramTypes = invokeSignature.toParameterTypes(kit.getMetaAccess().lookupJavaType(Object.class)); return createMethodCall(kit, invokeSignature.getReturnType(), paramTypes, methodAddress, argsWithReceiver); } @@ -258,7 +258,7 @@ private static ValueNode createNewObjectCall(JNIGraphKit kit, ResolvedSignature< return createMethodCall(kit, invokeSignature.getReturnType(), invokeSignature.toParameterTypes(null), newObjectAddress, args); } - private static ValueNode createMethodCall(JNIGraphKit kit, JavaType returnType, JavaType[] paramTypes, ValueNode methodAddress, ValueNode[] args) { + private static ValueNode createMethodCall(JNIGraphKit kit, JavaType returnType, List paramTypes, ValueNode methodAddress, ValueNode[] args) { StampPair returnStamp = StampFactory.forDeclaredType(kit.getAssumptions(), returnType, false); CallTargetNode callTarget = new SubstrateIndirectCallTargetNode(methodAddress, args, returnStamp, paramTypes, null, SubstrateCallingConventionKind.Java.toType(true), CallTargetNode.InvokeKind.Static); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/lambda/LambdaParser.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/lambda/LambdaParser.java index e7dfb464f045..8d87a5f678f5 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/lambda/LambdaParser.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/lambda/LambdaParser.java @@ -26,6 +26,7 @@ import java.lang.reflect.Member; import java.util.Arrays; +import java.util.List; import java.util.stream.Stream; import com.oracle.graal.pointsto.phases.NoClassInitializationPlugin; @@ -78,9 +79,10 @@ public static StructuredGraph createMethodGraph(ResolvedJavaMethod method, Optio } public static Stream allExecutablesDeclaredInClass(ResolvedJavaType t) { - return Stream.concat(Stream.concat( - Arrays.stream(t.getDeclaredMethods(false)), - Arrays.stream(t.getDeclaredConstructors(false))), + return Stream.concat( + Stream.concat( + t.getDeclaredMethods(false).stream(), + t.getDeclaredConstructors(false).stream()), t.getClassInitializer() == null ? Stream.empty() : Stream.of(t.getClassInitializer())); } @@ -106,9 +108,8 @@ private static Class getLambdaClassFromMemberField(Constant constant) { return null; } - ResolvedJavaField[] fields = constantType.getInstanceFields(true); ResolvedJavaField targetField = null; - for (ResolvedJavaField field : fields) { + for (ResolvedJavaField field : constantType.getInstanceFields(true)) { if (field.getName().equals("member")) { targetField = field; break; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedArrayClass.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedArrayClass.java index 011991d34145..f323bd1e20ed 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedArrayClass.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedArrayClass.java @@ -28,6 +28,8 @@ import jdk.vm.ci.meta.JavaKind; +import java.util.List; + public class HostedArrayClass extends HostedClass { private final HostedType componentType; @@ -80,8 +82,8 @@ public int getArrayDimension() { } @Override - public HostedField[] getInstanceFields(boolean includeSuperclasses) { - return HostedField.EMPTY_ARRAY; + public List getInstanceFields(boolean includeSuperclasses) { + return List.of(); } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInstanceClass.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInstanceClass.java index d3462aea281f..ab3007156948 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInstanceClass.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInstanceClass.java @@ -31,6 +31,8 @@ import jdk.vm.ci.meta.ResolvedJavaField; import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.util.List; + public class HostedInstanceClass extends HostedClass { protected HostedField[] instanceFieldsWithoutSuper; @@ -74,8 +76,8 @@ public int getArrayDimension() { } @Override - public HostedField[] getInstanceFields(boolean includeSuperclasses) { - return includeSuperclasses ? instanceFieldsWithSuper : instanceFieldsWithoutSuper; + public List getInstanceFields(boolean includeSuperclasses) { + return List.of(includeSuperclasses ? instanceFieldsWithSuper : instanceFieldsWithoutSuper); } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInterface.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInterface.java index 3ac6d0f87c05..e3b581169135 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInterface.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInterface.java @@ -28,6 +28,8 @@ import jdk.vm.ci.meta.JavaKind; +import java.util.List; + /** * The closed world analysis "removes" interfaces in the sense that all implementers are known. So * interface method calls are reduced to virtual method calls. Constants (static final fields) are @@ -88,7 +90,7 @@ public int getArrayDimension() { } @Override - public HostedField[] getInstanceFields(boolean includeSuperclasses) { - return HostedField.EMPTY_ARRAY; + public List getInstanceFields(boolean includeSuperclasses) { + return List.of(); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedMethod.java index 83e2b56e7ad7..7969e6d90da4 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedMethod.java @@ -31,6 +31,7 @@ import java.lang.reflect.Type; import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; @@ -91,7 +92,7 @@ public final class HostedMethod extends HostedElement implements SharedMethod, W private final HostedType holder; private final ResolvedSignature signature; private final ConstantPool constantPool; - private final ExceptionHandler[] handlers; + private final List handlers; /** * Contains the index of the method within the appropriate table. * @@ -147,11 +148,11 @@ static HostedMethod create(HostedUniverse universe, AnalysisMethod wrapped, Host ConstantPool constantPool, ExceptionHandler[] handlers) { LocalVariableTable localVariableTable = createLocalVariableTable(universe, wrapped); - return create0(wrapped, holder, signature, constantPool, handlers, wrapped.getMultiMethodKey(), null, localVariableTable); + return create0(wrapped, holder, signature, constantPool, List.of(handlers), wrapped.getMultiMethodKey(), null, localVariableTable); } private static HostedMethod create0(AnalysisMethod wrapped, HostedType holder, ResolvedSignature signature, - ConstantPool constantPool, ExceptionHandler[] handlers, MultiMethodKey key, Map multiMethodMap, LocalVariableTable localVariableTable) { + ConstantPool constantPool, List handlers, MultiMethodKey key, Map multiMethodMap, LocalVariableTable localVariableTable) { var generator = new HostedMethodNameFactory.NameGenerator() { @Override @@ -186,10 +187,10 @@ private static LocalVariableTable createLocalVariableTable(HostedUniverse univer return null; } try { - Local[] origLocals = lvt.getLocals(); - Local[] newLocals = new Local[origLocals.length]; + List origLocals = lvt.getLocals(); + Local[] newLocals = new Local[origLocals.size()]; for (int i = 0; i < newLocals.length; ++i) { - Local origLocal = origLocals[i]; + Local origLocal = origLocals.get(i); JavaType origType = origLocal.getType(); if (!universe.contains(origType)) { throw new UnsupportedFeatureException("No HostedType for given AnalysisType"); @@ -204,7 +205,7 @@ private static LocalVariableTable createLocalVariableTable(HostedUniverse univer } private HostedMethod(AnalysisMethod wrapped, HostedType holder, ResolvedSignature signature, ConstantPool constantPool, - ExceptionHandler[] handlers, String name, String uniqueShortName, LocalVariableTable localVariableTable, MultiMethodKey multiMethodKey, + List handlers, String name, String uniqueShortName, LocalVariableTable localVariableTable, MultiMethodKey multiMethodKey, Map multiMethodMap) { this.wrapped = wrapped; this.holder = holder; @@ -314,7 +315,7 @@ public AnalysisMethod getWrapped() { } @Override - public Parameter[] getParameters() { + public List getParameters() { return wrapped.getParameters(); } @@ -413,7 +414,7 @@ public ResolvedSignature getSignature() { } @Override - public JavaType[] toParameterTypes() { + public List toParameterTypes() { throw JVMCIError.shouldNotReachHere("ResolvedJavaMethod.toParameterTypes returns the wrong result for constructors."); } @@ -490,7 +491,7 @@ public boolean canBeStaticallyBound() { } @Override - public ExceptionHandler[] getExceptionHandlers() { + public List getExceptionHandlers() { return handlers; } @@ -515,7 +516,7 @@ public Annotation[][] getParameterAnnotations() { } @Override - public Type[] getGenericParameterTypes() { + public List getGenericParameterTypes() { return wrapped.getGenericParameterTypes(); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedPrimitiveType.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedPrimitiveType.java index 690bc721e8fa..756481fc551a 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedPrimitiveType.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedPrimitiveType.java @@ -28,6 +28,8 @@ import jdk.vm.ci.meta.JavaKind; +import java.util.List; + public class HostedPrimitiveType extends HostedType { public HostedPrimitiveType(HostedUniverse universe, AnalysisType wrapped, JavaKind kind, JavaKind storageKind) { @@ -80,8 +82,8 @@ public int getArrayDimension() { } @Override - public HostedField[] getInstanceFields(boolean includeSuperclasses) { - return HostedField.EMPTY_ARRAY; + public List getInstanceFields(boolean includeSuperclasses) { + return List.of(); } @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 bfdd7004d9a3..87f84c8bfb3a 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 @@ -43,6 +43,8 @@ import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaType; +import java.util.List; + public abstract class HostedType extends HostedElement implements SharedType, WrappedJavaType, OriginalClassProvider { public static final int INVALID_TYPECHECK_ID = -1; @@ -56,11 +58,11 @@ public abstract class HostedType extends HostedElement implements SharedType, Wr private final JavaKind storageKind; private final HostedClass superClass; - private final HostedInterface[] interfaces; + private final List interfaces; protected HostedArrayClass arrayType; protected HostedType[] subTypes; - protected HostedField[] staticFields; + protected List staticFields; boolean loadedFromPriorLayer; protected int typeID; @@ -148,7 +150,7 @@ public HostedType(HostedUniverse universe, AnalysisType wrapped, JavaKind kind, this.kind = kind; this.storageKind = storageKind; this.superClass = superClass; - this.interfaces = interfaces; + this.interfaces = List.of(interfaces); this.typeID = INVALID_TYPECHECK_ID; } @@ -380,10 +382,10 @@ public HostedType getArrayClass(int dimension) { } @Override - public abstract HostedField[] getInstanceFields(boolean includeSuperclasses); + public abstract List getInstanceFields(boolean includeSuperclasses); @Override - public ResolvedJavaField[] getStaticFields() { + public List getStaticFields() { assert staticFields != null; return staticFields; } @@ -394,7 +396,7 @@ public final HostedClass getSuperclass() { } @Override - public final HostedInterface[] getInterfaces() { + public final List getInterfaces() { return interfaces; } @@ -493,23 +495,23 @@ public HostedType getEnclosingType() { } @Override - public ResolvedJavaMethod[] getDeclaredConstructors() { + public List getDeclaredConstructors() { return getDeclaredConstructors(true); } @Override - public HostedMethod[] getDeclaredConstructors(boolean forceLink) { + public List 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() { + public List getDeclaredMethods() { return getDeclaredMethods(true); } @Override - public HostedMethod[] getDeclaredMethods(boolean forceLink) { + public List 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)); } @@ -548,12 +550,6 @@ public boolean isCloneableWithAllocation() { return wrapped.isCloneableWithAllocation(); } - @SuppressWarnings("deprecation") - @Override - public ResolvedJavaType getHostClass() { - return universe.lookup(wrapped.getHostClass()); - } - @Override public ResolvedJavaType unwrapTowardsOriginalType() { return wrapped; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedUniverse.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedUniverse.java index b5ae3b400ed1..1e965491ece6 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedUniverse.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedUniverse.java @@ -420,12 +420,12 @@ public HostedMethod optionalLookup(JavaMethod method) { return methods.get(method); } - public HostedMethod[] lookup(JavaMethod[] inputs) { - HostedMethod[] result = new HostedMethod[inputs.length]; // EMPTY_ARRAY failing here + public List lookup(List inputs) { + HostedMethod[] result = new HostedMethod[inputs.size()]; // EMPTY_ARRAY failing here for (int i = 0; i < result.length; i++) { - result[i] = lookup(inputs[i]); + result[i] = lookup(inputs.get(i)); } - return result; + return List.of(result); } @Override @@ -480,7 +480,7 @@ private void printTypes(PrintWriter writer) { if (type.getSuperclass() != null) { writer.format("extends %d %s ", type.getSuperclass().getTypeID(), type.getSuperclass().toJavaName(false)); } - if (type.getInterfaces().length > 0) { + if (type.getInterfaces().size() > 0) { writer.print("implements "); String sep = ""; for (HostedInterface interf : type.getInterfaces()) { @@ -542,8 +542,7 @@ private void printTypes(PrintWriter writer) { } else if (type.isInstanceClass()) { - HostedField[] instanceFields = type.getInstanceFields(false); - instanceFields = Arrays.copyOf(instanceFields, instanceFields.length); + HostedField[] instanceFields = type.getInstanceFields(false).toArray(new HostedField[0]); Arrays.sort(instanceFields, Comparator.comparing(HostedField::toString)); for (HostedField field : instanceFields) { writer.println(" f " + field.getLocation() + ": " + field.format("%T %n")); @@ -603,7 +602,7 @@ private static Optional proxyType(HostedType type) { boolean isProxy = Proxy.isProxyClass(baseType.getJavaClass()); assert isProxy == (baseType.toJavaName(false).startsWith("$Proxy") && !(type.getWrapped().getWrapped() instanceof BaseLayerType)); if (isProxy) { - return Optional.of(baseType.getInterfaces()); + return Optional.of(baseType.getInterfaces().toArray(new HostedType[0])); } else { return Optional.empty(); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/TypeCheckBuilder.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/TypeCheckBuilder.java index 05325eb950ee..18db2b492996 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/TypeCheckBuilder.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/TypeCheckBuilder.java @@ -327,7 +327,7 @@ private Map> computeElementParentMap(List aInterfaces = aType.getInterfaces(); + HostedInterface[] sInterfaces = aInterfaces.isEmpty() ? HostedInterface.EMPTY_ARRAY : new HostedInterface[aInterfaces.size()]; + for (int i = 0; i < aInterfaces.size(); i++) { + sInterfaces[i] = (HostedInterface) makeType(aInterfaces.get(i)); } JavaKind kind = aType.getJavaKind(); @@ -346,10 +346,10 @@ private HostedMethod makeMethod(AnalysisMethod aMethod) { constantPool = makeConstantPool(aMethod.getConstantPool(), aDeclaringClass); } - ExceptionHandler[] aHandlers = aMethod.getExceptionHandlers(); - ExceptionHandler[] sHandlers = new ExceptionHandler[aHandlers.length]; - for (int i = 0; i < aHandlers.length; i++) { - ExceptionHandler h = aHandlers[i]; + List aHandlers = aMethod.getExceptionHandlers(); + ExceptionHandler[] sHandlers = new ExceptionHandler[aHandlers.size()]; + for (int i = 0; i < aHandlers.size(); i++) { + ExceptionHandler h = aHandlers.get(i); JavaType catchType = h.getCatchType(); if (h.getCatchType() instanceof AnalysisType) { catchType = lookupType((AnalysisType) catchType); @@ -848,9 +848,9 @@ private void layoutStaticFields() { for (HostedType type : hUniverse.getTypes()) { List fieldsOfType = fieldsOfTypes[type.getTypeID()]; if (fieldsOfType != null) { - type.staticFields = fieldsOfType.toArray(new HostedField[fieldsOfType.size()]); + type.staticFields = List.copyOf(fieldsOfType); } else { - type.staticFields = HostedField.EMPTY_ARRAY; + type.staticFields = List.of(); } } @@ -888,9 +888,8 @@ private void collectDeclaredMethods() { private void collectMethodImplementations() { for (HostedMethod method : hUniverse.methods.values()) { - // Reuse the implementations from the analysis method. - method.implementations = hUniverse.lookup(method.wrapped.collectMethodImplementations(false).toArray(AnalysisMethod.EMPTY_ARRAY)); + method.implementations = hUniverse.lookup(List.copyOf(method.wrapped.collectMethodImplementations(false))).toArray(HostedMethod.EMPTY_ARRAY); Arrays.sort(method.implementations, HostedUniverse.METHOD_COMPARATOR); } } @@ -1018,9 +1017,8 @@ private static WordBase[] createVTable(HostedMethod[] methods) { } private static ReferenceMapEncoder.Input createReferenceMap(HostedType type) { - HostedField[] fields = type.getInstanceFields(true); SubstrateReferenceMap referenceMap = new SubstrateReferenceMap(); - for (HostedField field : fields) { + for (HostedField field : type.getInstanceFields(true)) { if (field.getType().getStorageKind() == JavaKind.Object && field.hasLocation() && !excludeFromReferenceMap(field)) { referenceMap.markReferenceAtOffset(field.getLocation(), true); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/AnalysisGraphBuilderPhase.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/AnalysisGraphBuilderPhase.java index ed5a4290ba1b..557f48b3a7d8 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/AnalysisGraphBuilderPhase.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/AnalysisGraphBuilderPhase.java @@ -165,7 +165,7 @@ protected void genInvokeDynamic(int cpi, int opcode) { return; } - int parameterLength = bootstrap.getMethod().getParameters().length; + int parameterLength = bootstrap.getMethod().getParameters().size(); List staticArgumentsList = bootstrap.getStaticArguments(); boolean isVarargs = bootstrap.getMethod().isVarArgs(); int bci = bci(); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/CInterfaceInvocationPlugin.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/CInterfaceInvocationPlugin.java index ffbd5030f59f..8e8539251ea5 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/CInterfaceInvocationPlugin.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/CInterfaceInvocationPlugin.java @@ -28,6 +28,7 @@ import static com.oracle.svm.core.util.VMError.shouldNotReachHereUnexpectedInput; import java.util.Arrays; +import java.util.List; import jdk.graal.compiler.word.Word; import org.graalvm.nativeimage.ImageSingletons; @@ -698,12 +699,12 @@ private boolean replaceJavaFunctionPointerInvoke(GraphBuilderContext b, Analysis } assert b.getInvokeKind() == InvokeKind.Interface; - JavaType[] parameterTypes = method.getSignature().toParameterTypes(null); + List parameterTypes = method.getSignature().toParameterTypes(null); // We "discard" the receiver from the signature by pretending we are a static method assert args.length >= 1; ValueNode methodAddress = args[0]; ValueNode[] argsWithoutReceiver = Arrays.copyOfRange(args, 1, args.length); - assert argsWithoutReceiver.length == parameterTypes.length; + assert argsWithoutReceiver.length == parameterTypes.size(); Stamp returnStamp; if (b.getWordTypes().isWord(b.getInvokeReturnType())) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/SharedGraphBuilderPhase.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/SharedGraphBuilderPhase.java index 2e6b6ccb1314..7d18e9f52aac 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/SharedGraphBuilderPhase.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/phases/SharedGraphBuilderPhase.java @@ -437,18 +437,18 @@ private static List getSessionArguments(ResolvedJavaMethod method, final ResolvedJavaType classType = ((SubstitutionType) ((AnalysisType) metaAccess.lookupJavaType(Class.class)).getWrapped()).getOriginal(); assert classType != null; - Parameter[] p = method.getParameters(); - if (!p[0].getType().equals(sessionType)) { + List p = method.getParameters(); + if (!p.getFirst().getType().equals(sessionType)) { // no sessions involved return List.of(); } - if (p.length < 3) { + if (p.size() < 3) { // length does not match return List.of(); } int pIndex = method.hasReceiver() ? 1 : 0; - if (p[1].getType().equals(utilsType)) { + if (p.get(1).getType().equals(utilsType)) { // eg forceInternal(MemorySessionImpl session, MappedMemoryUtilsProxy mappedUtils, // FileDescriptor fd, long address, boolean isSync, long index, long length) { ValueNode session = graph.getParameter(pIndex++); @@ -458,7 +458,7 @@ private static List getSessionArguments(ResolvedJavaMethod method, SessionCheck check = new SessionCheck(session, null, offset); verifySession(sessionType, baseType, offsetType, check, metaAccess); return List.of(check); - } else if (p[1].getType().equals(sessionType)) { + } else if (p.get(1).getType().equals(sessionType)) { // 2 session case ValueNode s1Session = graph.getParameter(pIndex++); ValueNode s2Session = graph.getParameter(pIndex++); @@ -474,7 +474,7 @@ private static List getSessionArguments(ResolvedJavaMethod method, } else { // 1 session case ValueNode session = graph.getParameter(pIndex++); - if (p[1].getType().equals(classType)) { + if (p.get(1).getType().equals(classType)) { // example with a vmClass - // storeIntoMemorySegmentScopedInternal(MemorySessionImpl session, // Class vmClass, Class e, int length,V v, @@ -493,7 +493,7 @@ private static List getSessionArguments(ResolvedJavaMethod method, * If any of these invariants stops holding the verifySession call below will * fail hard and we will be noticed of new/changed API. */ - while (!p[pIndex].getType().equals(abstractSegmentImpl)) { + while (!p.get(pIndex).getType().equals(abstractSegmentImpl)) { pIndex++; } @@ -1418,7 +1418,7 @@ private Object loadConstantDynamic(int cpi, int opcode) { } if (!BootstrapMethodConfiguration.singleton().isCondyAllowedAtBuildTime(bootstrapMethod)) { - int parameterLength = bootstrap.getMethod().getParameters().length; + int parameterLength = bootstrap.getMethod().getParameters().size(); List staticArguments = bootstrap.getStaticArguments(); boolean isVarargs = bootstrap.getMethod().isVarArgs(); Class typeClass = getSnippetReflection().asObject(Class.class, bootstrap.getType()); @@ -1508,7 +1508,7 @@ protected Object resolveLinkedObject(int bci, int cpi, int opcode, BootstrapMeth * arguments in an array. */ if (isVarargs) { - JavaType varargClass = bootstrapMethod.getParameters()[parameterLength - 1].getType().getComponentType(); + JavaType varargClass = bootstrapMethod.getParameters().get(parameterLength - 1).getType().getComponentType(); arguments[arguments.length - 1] = append(new NewArrayNode(((AnalysisMetaAccess) getMetaAccess()).getUniverse().lookup(varargClass), ConstantNode.forInt(staticArgumentsList.size() - arguments.length + 4, getGraph()), true)); } @@ -1524,8 +1524,8 @@ protected Object resolveLinkedObject(int bci, int cpi, int opcode, BootstrapMeth int argCpi = primitiveConstant.asInt(); Object argConstant = loadConstantDynamic(argCpi, opcode == Opcodes.INVOKEDYNAMIC ? Opcodes.LDC : opcode); if (argConstant instanceof ValueNode valueNode) { - ResolvedJavaMethod.Parameter[] parameters = bootstrapMethod.getParameters(); - if (valueNode.getStackKind().isPrimitive() && i + 3 <= parameters.length && !parameters[i + 3].getKind().isPrimitive()) { + List parameters = bootstrapMethod.getParameters(); + if (valueNode.getStackKind().isPrimitive() && i + 3 <= parameters.size() && !parameters.get(i + 3).getKind().isPrimitive()) { currentNode = append(BoxNode.create(valueNode, getMetaAccess().lookupJavaType(valueNode.getStackKind().toBoxedJavaClass()), valueNode.getStackKind())); } else { currentNode = valueNode; @@ -1732,7 +1732,7 @@ private boolean isBootstrapInvocationInvalid(BootstrapMethodInvocation bootstrap } protected boolean checkBootstrapParameters(ResolvedJavaMethod bootstrapMethod, List staticArguments, boolean condy) { - int parametersLength = bootstrapMethod.getParameters().length; + int parametersLength = bootstrapMethod.getParameters().size(); Class[] parameters = signatureToClasses(bootstrapMethod); if (bootstrapMethod.isVarArgs()) { /* diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java index 513e0a887e9d..6c0bb705f281 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java @@ -518,7 +518,7 @@ public void registerConstructorLookup(ConfigurationCondition condition, Class registerMethod(cnd, true, declaringClass.getDeclaredConstructor(parameterTypes)); } catch (NoSuchMethodException e) { negativeConstructorLookups.computeIfAbsent(metaAccess.lookupJavaType(declaringClass), (key) -> ConcurrentHashMap.newKeySet()) - .add(metaAccess.lookupJavaTypes(parameterTypes)); + .add(metaAccess.lookupJavaTypes(parameterTypes).toArray(AnalysisType.EMPTY_ARRAY)); } catch (LinkageError le) { registerLinkageError(declaringClass, le, constructorLookupExceptions); } @@ -691,8 +691,8 @@ private void checkSubtypeForOverridingFields(AnalysisType subtype, Collection subClassFields = new HashSet<>(); - subClassFields.addAll(Arrays.asList(subtype.getInstanceFields(false))); - subClassFields.addAll(Arrays.asList(subtype.getStaticFields())); + subClassFields.addAll(subtype.getInstanceFields(false)); + subClassFields.addAll(subtype.getStaticFields()); for (ResolvedJavaField javaField : subClassFields) { for (AnalysisField registeredField : superclassFields) { AnalysisField subclassField = (AnalysisField) javaField; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionExpandSignatureMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionExpandSignatureMethod.java index 374069e9706c..c2530c1baa3e 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionExpandSignatureMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionExpandSignatureMethod.java @@ -25,6 +25,7 @@ package com.oracle.svm.hosted.reflect; import java.lang.reflect.Executable; +import java.util.List; import com.oracle.graal.pointsto.meta.AnalysisMethod; import com.oracle.graal.pointsto.meta.AnalysisType; @@ -115,7 +116,7 @@ public StructuredGraph buildGraph(DebugContext ctx, AnalysisMethod method, Hoste signature[i + receiverOffset] = kit.getMetaAccess().lookupJavaType(argTypes[i]); } - CallTargetNode callTarget = kit.append(new SubstrateIndirectCallTargetNode(invokedMethod, args, StampPair.createSingle(StampFactory.forKind(returnKind)), signature, null, + CallTargetNode callTarget = kit.append(new SubstrateIndirectCallTargetNode(invokedMethod, args, StampPair.createSingle(StampFactory.forKind(returnKind)), List.of(signature), null, SubstrateCallingConventionKind.Java.toType(true), InvokeKind.Static)); InvokeWithExceptionNode invoke = kit.startInvokeWithException(callTarget, kit.getFrameState(), kit.bci()); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotatedMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotatedMethod.java index 3822edfbbabc..8d8d6c591a08 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotatedMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotatedMethod.java @@ -28,6 +28,7 @@ import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Type; import java.util.Arrays; +import java.util.List; import org.graalvm.nativeimage.AnnotationAccess; @@ -170,7 +171,7 @@ public boolean canBeStaticallyBound() { } @Override - public ExceptionHandler[] getExceptionHandlers() { + public List getExceptionHandlers() { return original.getExceptionHandlers(); } @@ -205,7 +206,7 @@ public Annotation[][] getParameterAnnotations() { } @Override - public Type[] getGenericParameterTypes() { + public List getGenericParameterTypes() { return original.getGenericParameterTypes(); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java index b2d9c4c2b546..a67a7d297c56 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java @@ -894,7 +894,7 @@ private ResolvedJavaField findOriginalField(Field annotatedField, Class origi * {sun.reflect,jdk.internal.reflect}.Reflection.fieldFilterMap. Try to find the field * via the ResolvedJavaType. */ - ResolvedJavaField[] fields; + List fields; if (Modifier.isStatic(annotatedField.getModifiers())) { fields = metaAccess.lookupJavaType(originalClass).getStaticFields(); } else { 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 a35ee51a9d62..f373ec75aa3b 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 @@ -25,6 +25,7 @@ package com.oracle.svm.hosted.substitute; import java.lang.reflect.AnnotatedElement; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -51,12 +52,14 @@ public class InjectedFieldsType implements ResolvedJavaType, OriginalClassProvid private final ResolvedJavaType original; - private final ResolvedJavaField[][] instanceFields; + private final List instanceFieldsWithoutSuper; + private final List instanceFieldsWithSuper; public InjectedFieldsType(ResolvedJavaType original) { this.original = original; - this.instanceFields = new ResolvedJavaField[][]{original.getInstanceFields(false), original.getInstanceFields(true)}; + this.instanceFieldsWithoutSuper = new ArrayList<>(original.getInstanceFields(false)); + this.instanceFieldsWithSuper = new ArrayList<>(original.getInstanceFields(true)); } public ResolvedJavaType getOriginal() { @@ -69,16 +72,13 @@ public ResolvedJavaType unwrapTowardsOriginalType() { } public void addInjectedField(ResolvedJavaField field) { - for (int i = 0; i < instanceFields.length; i++) { - ResolvedJavaField[] newFields = Arrays.copyOf(instanceFields[i], instanceFields[i].length + 1, ResolvedJavaField[].class); - newFields[newFields.length - 1] = field; - instanceFields[i] = newFields; - } + instanceFieldsWithoutSuper.add(field); + instanceFieldsWithSuper.add(field); } @Override - public ResolvedJavaField[] getInstanceFields(boolean includeSuperclasses) { - return instanceFields[includeSuperclasses ? 1 : 0]; + public List getInstanceFields(boolean includeSuperclasses) { + return List.copyOf(includeSuperclasses ? instanceFieldsWithSuper : instanceFieldsWithoutSuper); } @Override @@ -162,7 +162,7 @@ public ResolvedJavaType getSuperclass() { } @Override - public ResolvedJavaType[] getInterfaces() { + public List getInterfaces() { return original.getInterfaces(); } @@ -207,7 +207,7 @@ public AssumptionResult findUniqueConcreteMethod(ResolvedJav } @Override - public ResolvedJavaField[] getStaticFields() { + public List getStaticFields() { return original.getStaticFields(); } @@ -242,29 +242,29 @@ public ResolvedJavaType getEnclosingType() { } @Override - public ResolvedJavaMethod[] getDeclaredConstructors() { + public List getDeclaredConstructors() { return getDeclaredConstructors(true); } @Override - public ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) { + public List 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() { + public List getDeclaredMethods() { return getDeclaredMethods(true); } @Override - public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) { + public List getDeclaredMethods(boolean forceLink) { VMError.guarantee(forceLink == false, "only use getDeclaredMethods without forcing to link, because linking can throw LinkageError"); return original.getDeclaredMethods(forceLink); } @Override - public List getAllMethods(boolean forceLink) { + public List getAllMethods(boolean forceLink) { VMError.guarantee(forceLink == false, "only use getAllMethods without forcing to link, because linking can throw LinkageError"); return original.getAllMethods(forceLink); } @@ -299,12 +299,6 @@ public boolean isCloneableWithAllocation() { throw JVMCIError.unimplemented(); } - @SuppressWarnings("deprecation") - @Override - public ResolvedJavaType getHostClass() { - return original.getHostClass(); - } - @Override public String toString() { return "InjectedFieldsType<" + original.toString() + ">"; 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 5093ade0e0e4..bf0af88cd1b3 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(false)[0].getConstantPool(); + this.constantPool = substitutionBaseMethod.getDeclaringClass().getDeclaredConstructors(false).getFirst().getConstantPool(); } @Override @@ -264,8 +264,8 @@ public boolean canBeStaticallyBound() { } @Override - public ExceptionHandler[] getExceptionHandlers() { - return new ExceptionHandler[0]; + public List getExceptionHandlers() { + return List.of(); } @Override @@ -297,7 +297,7 @@ public Annotation[][] getParameterAnnotations() { } @Override - public Type[] getGenericParameterTypes() { + public List getGenericParameterTypes() { throw VMError.intentionallyUnimplemented(); // ExcludeFromJacocoGeneratedReport } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/SubstitutionMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/SubstitutionMethod.java index 505227a3ab3a..cb3497f55f4e 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/SubstitutionMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/SubstitutionMethod.java @@ -30,6 +30,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Type; +import java.util.List; import com.oracle.graal.pointsto.infrastructure.GraphProvider; import com.oracle.graal.pointsto.infrastructure.OriginalMethodProvider; @@ -77,11 +78,11 @@ public SubstitutionMethod(ResolvedJavaMethod original, ResolvedJavaMethod annota * So do the resolution early, because users of the local variable table only have * access to the original. */ - Local[] origLocals = annotated.getLocalVariableTable().getLocals(); - Local[] newLocals = new Local[origLocals.length]; + List origLocals = annotated.getLocalVariableTable().getLocals(); + Local[] newLocals = new Local[origLocals.size()]; ResolvedJavaType accessingClass = annotated.getDeclaringClass(); for (int i = 0; i < newLocals.length; i++) { - Local origLocal = origLocals[i]; + Local origLocal = origLocals.get(i); newLocals[i] = new Local(origLocal.getName(), origLocal.getType().resolve(accessingClass), origLocal.getStartBCI(), origLocal.getEndBCI(), origLocal.getSlot()); } newLocalVariableTable = new LocalVariableTable(newLocals); @@ -198,7 +199,7 @@ public boolean canBeStaticallyBound() { } @Override - public ExceptionHandler[] getExceptionHandlers() { + public List getExceptionHandlers() { return annotated.getExceptionHandlers(); } @@ -228,12 +229,12 @@ public Annotation[][] getParameterAnnotations() { } @Override - public Parameter[] getParameters() { + public List getParameters() { return original.getParameters(); } @Override - public Type[] getGenericParameterTypes() { + public List getGenericParameterTypes() { return original.getGenericParameterTypes(); } 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 5e3802a996c3..e63fcc7af301 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 @@ -26,6 +26,7 @@ import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Modifier; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -58,13 +59,16 @@ public class SubstitutionType implements ResolvedJavaType, OriginalClassProvider */ private final boolean isUserSubstitution; - private final ResolvedJavaField[][] instanceFields; + private final List instanceFieldsWithoutSuper; + private final List instanceFieldsWithSuper; public SubstitutionType(ResolvedJavaType original, ResolvedJavaType annotated, boolean isUserSubstitution) { this.annotated = annotated; this.original = original; this.isUserSubstitution = isUserSubstitution; - this.instanceFields = new ResolvedJavaField[][]{annotated.getInstanceFields(false), annotated.getInstanceFields(true)}; + + this.instanceFieldsWithoutSuper = new ArrayList<>(annotated.getInstanceFields(false)); + this.instanceFieldsWithSuper = new ArrayList<>(annotated.getInstanceFields(true)); } public boolean isUserSubstitution() { @@ -85,16 +89,13 @@ public ResolvedJavaType unwrapTowardsOriginalType() { } void addInstanceField(ResolvedJavaField field) { - for (int i = 0; i < instanceFields.length; i++) { - ResolvedJavaField[] newFields = Arrays.copyOf(instanceFields[i], instanceFields[i].length + 1, ResolvedJavaField[].class); - newFields[newFields.length - 1] = field; - instanceFields[i] = newFields; - } + instanceFieldsWithoutSuper.add(field); + instanceFieldsWithSuper.add(field); } @Override - public ResolvedJavaField[] getInstanceFields(boolean includeSuperclasses) { - return instanceFields[includeSuperclasses ? 1 : 0]; + public List getInstanceFields(boolean includeSuperclasses) { + return List.copyOf(includeSuperclasses ? instanceFieldsWithSuper : instanceFieldsWithoutSuper); } @Override @@ -188,7 +189,7 @@ public ResolvedJavaType getSuperclass() { } @Override - public ResolvedJavaType[] getInterfaces() { + public List getInterfaces() { return annotated.getInterfaces(); } @@ -245,7 +246,7 @@ public AssumptionResult findUniqueConcreteMethod(ResolvedJav } @Override - public ResolvedJavaField[] getStaticFields() { + public List getStaticFields() { return annotated.getStaticFields(); } @@ -280,29 +281,29 @@ public ResolvedJavaType getEnclosingType() { } @Override - public ResolvedJavaMethod[] getDeclaredConstructors() { + public List getDeclaredConstructors() { return getDeclaredConstructors(true); } @Override - public ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) { + public List 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() { + public List getDeclaredMethods() { return getDeclaredMethods(true); } @Override - public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) { + public List getDeclaredMethods(boolean forceLink) { VMError.guarantee(forceLink == false, "only use getDeclaredMethods without forcing to link, because linking can throw LinkageError"); return annotated.getDeclaredMethods(forceLink); } @Override - public List getAllMethods(boolean forceLink) { + public List getAllMethods(boolean forceLink) { VMError.guarantee(forceLink == false, "only use getAllMethods without forcing to link, because linking can throw LinkageError"); return annotated.getAllMethods(forceLink); } @@ -338,12 +339,6 @@ public boolean isCloneableWithAllocation() { throw JVMCIError.unimplemented(); } - @SuppressWarnings("deprecation") - @Override - public ResolvedJavaType getHostClass() { - return original.getHostClass(); - } - @Override public String toString() { return "SubstitutionType"; diff --git a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaMethod.java b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaMethod.java index 99e5d72e63e2..47590f851de7 100644 --- a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaMethod.java +++ b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaMethod.java @@ -29,6 +29,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.graalvm.nativeimage.Platform; @@ -76,7 +77,7 @@ public final class InterpreterResolvedJavaMethod implements ResolvedJavaMethod { private final LineNumberTable lineNumberTable; - private ExceptionHandler[] exceptionHandlers; + private List exceptionHandlers; private LocalVariableTable localVariableTable; @@ -142,7 +143,7 @@ private InterpreterResolvedJavaMethod(String name, int maxLocals, int maxStackSi this.declaringClass = declaringClass; this.signature = signature; this.interpretedCode = code; - this.exceptionHandlers = exceptionHandlers; + this.exceptionHandlers = List.of(exceptionHandlers); this.lineNumberTable = lineNumberTable; this.localVariableTable = localVariableTable; @@ -278,10 +279,8 @@ public boolean isConstructor() { } @Override - public ExceptionHandler[] getExceptionHandlers() { - ExceptionHandler[] result = exceptionHandlers; - VMError.guarantee(result != null); - return result; + public List getExceptionHandlers() { + return exceptionHandlers; } @Override @@ -311,7 +310,7 @@ public String toString() { @Platforms(Platform.HOSTED_ONLY.class) public void setExceptionHandlers(ExceptionHandler[] exceptionHandlers) { - this.exceptionHandlers = MetadataUtil.requireNonNull(exceptionHandlers); + this.exceptionHandlers = List.of(MetadataUtil.requireNonNull(exceptionHandlers)); } @Platforms(Platform.HOSTED_ONLY.class) @@ -493,7 +492,7 @@ public Annotation[][] getParameterAnnotations() { } @Override - public Type[] getGenericParameterTypes() { + public List getGenericParameterTypes() { throw VMError.intentionallyUnimplemented(); } diff --git a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaType.java b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaType.java index cbd43dfa7791..3298b180184e 100644 --- a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaType.java +++ b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaType.java @@ -46,7 +46,6 @@ * closed world e.g. instantiable, instantiated, effectively final ... */ public abstract class InterpreterResolvedJavaType implements ResolvedJavaType { - public static final ResolvedJavaMethod[] NO_METHODS = new ResolvedJavaMethod[0]; private final String name; private final Class clazz; @@ -222,12 +221,12 @@ public final Assumptions.AssumptionResult findUniqueConcrete } @Override - public final ResolvedJavaField[] getInstanceFields(boolean includeSuperclasses) { + public final List getInstanceFields(boolean includeSuperclasses) { throw VMError.intentionallyUnimplemented(); } @Override - public final ResolvedJavaField[] getStaticFields() { + public final List getStaticFields() { throw VMError.intentionallyUnimplemented(); } @@ -257,13 +256,13 @@ public final ResolvedJavaType getEnclosingType() { } @Override - public final ResolvedJavaMethod[] getDeclaredConstructors() { + public final List getDeclaredConstructors() { throw VMError.intentionallyUnimplemented(); } @Override - public ResolvedJavaMethod[] getDeclaredMethods() { - return NO_METHODS; + public List getDeclaredMethods() { + return List.of(); } @Override diff --git a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedObjectType.java b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedObjectType.java index e65e639b3982..7153b00ada6a 100644 --- a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedObjectType.java +++ b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedObjectType.java @@ -40,13 +40,15 @@ import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaType; +import java.util.List; + public final class InterpreterResolvedObjectType extends InterpreterResolvedJavaType { private final InterpreterResolvedJavaType componentType; private final int modifiers; private final InterpreterResolvedObjectType superclass; - private final InterpreterResolvedObjectType[] interfaces; - private InterpreterResolvedJavaMethod[] declaredMethods; + private final List interfaces; + private List declaredMethods; // Populated after analysis. private InterpreterConstantPool constantPool; @@ -79,7 +81,7 @@ private InterpreterResolvedObjectType(String name, int modifiers, InterpreterRes this.modifiers = modifiers; this.componentType = componentType; this.superclass = superclass; - this.interfaces = interfaces; + this.interfaces = List.of(interfaces); this.constantPool = constantPool; this.sourceFileName = sourceFileName; } @@ -93,7 +95,7 @@ private InterpreterResolvedObjectType(String name, int modifiers, InterpreterRes assert isWordType == WordBase.class.isAssignableFrom(javaClass); this.modifiers = modifiers; this.superclass = superclass; - this.interfaces = interfaces; + this.interfaces = List.of(interfaces); this.componentType = componentType; this.constantPool = constantPool; this.sourceFileName = DynamicHub.fromClass(javaClass).getSourceFileName(); @@ -109,7 +111,7 @@ private InterpreterResolvedObjectType(ResolvedJavaType originalType, String name this.modifiers = modifiers; this.componentType = componentType; this.superclass = superclass; - this.interfaces = interfaces; + this.interfaces = List.of(interfaces); this.constantPool = constantPool; this.sourceFileName = sourceFileName; } @@ -181,7 +183,7 @@ public InterpreterResolvedObjectType getSuperclass() { } @Override - public InterpreterResolvedObjectType[] getInterfaces() { + public List getInterfaces() { return this.interfaces; } @@ -228,11 +230,11 @@ public VTableHolder getVtableHolder() { } @Override - public ResolvedJavaMethod[] getDeclaredMethods() { + public List getDeclaredMethods() { return declaredMethods; } public void setDeclaredMethods(InterpreterResolvedJavaMethod[] declaredMethods) { - this.declaredMethods = declaredMethods; + this.declaredMethods = List.of(declaredMethods); } } diff --git a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedPrimitiveType.java b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedPrimitiveType.java index 23052e89d08a..b3f79d8fb51e 100644 --- a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedPrimitiveType.java +++ b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedPrimitiveType.java @@ -25,6 +25,7 @@ package com.oracle.svm.interpreter.metadata; import java.lang.reflect.Modifier; +import java.util.List; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.ResolvedJavaType; @@ -95,8 +96,8 @@ public ResolvedJavaType getSuperclass() { } @Override - public ResolvedJavaType[] getInterfaces() { - return new ResolvedJavaType[0]; + public List getInterfaces() { + return List.of(); } @Override diff --git a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/serialization/Serializers.java b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/serialization/Serializers.java index 8af19bf757c3..038a117c6992 100644 --- a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/serialization/Serializers.java +++ b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/serialization/Serializers.java @@ -453,7 +453,7 @@ public static ValueSerializer> newReferenceConstantSerializ return new LocalVariableTable(locals); }, (context, out, value) -> { - context.writerFor(Local[].class).write(context, out, value.getLocals()); + context.writerFor(Local[].class).write(context, out, value.getLocals().toArray(new Local[0])); }); static final int[] EMPTY_INT_ARRAY = new int[0]; @@ -581,7 +581,7 @@ public static ValueSerializer> newReferenceConstantSerializ InterpreterResolvedJavaType componentType = value.getComponentType(); InterpreterResolvedObjectType superclass = value.getSuperclass(); - InterpreterResolvedObjectType[] interfaces = value.getInterfaces(); + InterpreterResolvedObjectType[] interfaces = value.getInterfaces().toArray(new InterpreterResolvedObjectType[0]); // Constant pools are serialized separately, to break reference cycles, and // patched after deserialization. @@ -644,7 +644,7 @@ public static ValueSerializer> newReferenceConstantSerializ InterpreterResolvedObjectType declaringClass = value.getDeclaringClass(); InterpreterUnresolvedSignature signature = value.getSignature(); byte[] code = value.getInterpretedCode(); - ExceptionHandler[] exceptionHandlers = value.getExceptionHandlers(); + ExceptionHandler[] exceptionHandlers = value.getExceptionHandlers().toArray(new ExceptionHandler[0]); LineNumberTable lineNumberTable = value.getLineNumberTable(); LocalVariableTable localVariableTable = value.getLocalVariableTable(); /* diff --git a/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/BuildTimeConstantPool.java b/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/BuildTimeConstantPool.java index bb667e9adba2..82d4d75a60df 100644 --- a/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/BuildTimeConstantPool.java +++ b/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/BuildTimeConstantPool.java @@ -239,13 +239,13 @@ public static BuildTimeConstantPool create(InterpreterResolvedObjectType type) { return btcp; } - private ExceptionHandler[] processExceptionHandlers(ExceptionHandler[] hostExceptionHandlers) { - if (hostExceptionHandlers.length == 0) { + private ExceptionHandler[] processExceptionHandlers(List hostExceptionHandlers) { + if (hostExceptionHandlers.isEmpty()) { return EMPTY_EXCEPTION_HANDLERS; } - ExceptionHandler[] handlers = new ExceptionHandler[hostExceptionHandlers.length]; + ExceptionHandler[] handlers = new ExceptionHandler[hostExceptionHandlers.size()]; for (int i = 0; i < handlers.length; i++) { - ExceptionHandler host = hostExceptionHandlers[i]; + ExceptionHandler host = hostExceptionHandlers.get(i); JavaType resolvedCatchType = null; JavaType interpreterCatchType = null; int catchTypeCPI = 0; diff --git a/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/BuildTimeInterpreterUniverse.java b/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/BuildTimeInterpreterUniverse.java index ea7ef86ae6a2..c68c18b12a21 100644 --- a/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/BuildTimeInterpreterUniverse.java +++ b/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/BuildTimeInterpreterUniverse.java @@ -159,10 +159,10 @@ public static InterpreterResolvedObjectType createResolvedObjectType(ResolvedJav superclass = (InterpreterResolvedObjectType) universe.getOrCreateType(originalSuperclass); } - ResolvedJavaType[] originalInterfaces = resolvedJavaType.getInterfaces(); - InterpreterResolvedObjectType[] interfaces = new InterpreterResolvedObjectType[originalInterfaces.length]; + List originalInterfaces = resolvedJavaType.getInterfaces(); + InterpreterResolvedObjectType[] interfaces = new InterpreterResolvedObjectType[originalInterfaces.size()]; for (int i = 0; i < interfaces.length; i++) { - interfaces[i] = (InterpreterResolvedObjectType) universe.getOrCreateType(originalInterfaces[i]); + interfaces[i] = (InterpreterResolvedObjectType) universe.getOrCreateType(originalInterfaces.get(i)); } return InterpreterResolvedObjectType.createAtBuildTime(resolvedJavaType, name, modifiers, componentType, superclass, interfaces, null, clazz, sourceFileName); @@ -243,13 +243,13 @@ public static InterpreterUnresolvedSignature createUnresolvedSignature(Signature @Platforms(Platform.HOSTED_ONLY.class) public static LocalVariableTable processLocalVariableTable(LocalVariableTable hostLocalVariableTable) { - Local[] hostLocals = hostLocalVariableTable.getLocals(); - if (hostLocals.length == 0) { + List hostLocals = hostLocalVariableTable.getLocals(); + if (hostLocals.isEmpty()) { return InterpreterResolvedJavaMethod.EMPTY_LOCAL_VARIABLE_TABLE; } - Local[] locals = new Local[hostLocals.length]; + Local[] locals = new Local[hostLocals.size()]; for (int i = 0; i < locals.length; i++) { - Local host = hostLocals[i]; + Local host = hostLocals.get(i); JavaType hostType = host.getType(); JavaType interpreterType = null; if (hostType == null) { @@ -408,7 +408,7 @@ public int hashCode() { @Platforms(Platform.HOSTED_ONLY.class) private static final class LocalVariableTableWrapper { final LocalVariableTable localVariableTable; - final Local[] locals; + final List locals; final int hash; private LocalVariableTableWrapper(LocalVariableTable localVariableTable) { @@ -430,7 +430,7 @@ public boolean equals(Object other) { if (localVariableTable == thatWrapper.localVariableTable) { return true; } - return Arrays.equals(locals, thatWrapper.locals); + return locals.equals(thatWrapper.locals); } else { return false; } @@ -857,7 +857,7 @@ public InterpreterUniverseImpl snapshot() { } private static List dependencies(ResolvedJavaType type) { - List result = new ArrayList<>(Arrays.asList(type.getInterfaces())); + List result = new ArrayList<>(type.getInterfaces()); if (type.getSuperclass() != null) { result.add(type.getSuperclass()); } diff --git a/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/CremaSupportImpl.java b/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/CremaSupportImpl.java index de45bb97d089..4255ba0862bb 100644 --- a/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/CremaSupportImpl.java +++ b/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/CremaSupportImpl.java @@ -56,8 +56,8 @@ public ResolvedJavaType createInterpreterType(DynamicHub hub, ResolvedJavaType t /* query type from universe, maybe already exists (due to method creation) */ InterpreterResolvedJavaType interpreterType = btiUniverse.getOrCreateType(analysisType); - ResolvedJavaMethod[] declaredMethods = interpreterType.getDeclaredMethods(); - assert declaredMethods == null || declaredMethods == InterpreterResolvedJavaType.NO_METHODS : "should only be set once"; + List declaredMethods = interpreterType.getDeclaredMethods(); + assert declaredMethods == null : "should only be set once"; if (analysisType.isPrimitive()) { return interpreterType; diff --git a/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/Interpreter.java b/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/Interpreter.java index 76a8c45e746a..864bacd0214b 100644 --- a/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/Interpreter.java +++ b/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/Interpreter.java @@ -296,6 +296,8 @@ import jdk.vm.ci.meta.ResolvedJavaType; import jdk.vm.ci.meta.UnresolvedJavaType; +import java.util.List; + /** * Bytecode interpreter loop. */ @@ -1126,9 +1128,8 @@ private static int beforeJumpChecks(InterpreterFrame frame, int curBCI, int targ } private static ExceptionHandler resolveExceptionHandler(InterpreterResolvedJavaMethod method, int bci, Throwable ex) { - ExceptionHandler[] handlers = method.getExceptionHandlers(); ExceptionHandler resolved = null; - for (ExceptionHandler toCheck : handlers) { + for (ExceptionHandler toCheck : method.getExceptionHandlers()) { if (bci >= toCheck.getStartBCI() && bci < toCheck.getEndBCI()) { JavaType catchType = null; if (!toCheck.isCatchAll()) { diff --git a/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/InterpreterFeature.java b/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/InterpreterFeature.java index 88bce9e3515a..0e719f204c2a 100644 --- a/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/InterpreterFeature.java +++ b/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/InterpreterFeature.java @@ -183,7 +183,7 @@ public void duringSetup(DuringSetupAccess access) { } } - private static int findLocalSlotByName(String localName, Local[] locals) { + private static int findLocalSlotByName(String localName, List locals) { for (Local local : locals) { if (localName.equals(local.getName())) { return local.getSlot(); @@ -197,7 +197,7 @@ public void beforeAnalysis(BeforeAnalysisAccess access) { FeatureImpl.BeforeAnalysisAccessImpl accessImpl = (FeatureImpl.BeforeAnalysisAccessImpl) access; BuildTimeInterpreterUniverse.freshSingletonInstance(); - AnalysisMethod interpreterRoot = accessImpl.getMetaAccess().lookupJavaType(Interpreter.Root.class).getDeclaredMethods(false)[0]; + AnalysisMethod interpreterRoot = accessImpl.getMetaAccess().lookupJavaType(Interpreter.Root.class).getDeclaredMethods(false).getFirst(); accessImpl.registerAsRoot(interpreterRoot, true, "interpreter main loop"); LocalVariableTable interpreterVariableTable = interpreterRoot.getLocalVariableTable(); diff --git a/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/classfile/ClassFile.java b/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/classfile/ClassFile.java index cde5a5534f84..9d7068ac4596 100644 --- a/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/classfile/ClassFile.java +++ b/substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/classfile/ClassFile.java @@ -53,6 +53,7 @@ import java.util.Map; import java.util.Set; import java.util.function.Function; +import java.util.stream.Collectors; import com.oracle.svm.interpreter.metadata.ReferenceConstant; import org.graalvm.collections.Pair; @@ -451,14 +452,14 @@ private ResolvedJavaType getSuperclass(ResolvedJavaType type) { } } - private ResolvedJavaType[] getInterfaces(ResolvedJavaType type) { + private List getInterfaces(ResolvedJavaType type) { if (type instanceof InterpreterResolvedJavaType interpreterResolvedJavaType) { Class[] interfaces = interpreterResolvedJavaType.getJavaClass().getInterfaces(); ResolvedJavaType[] result = new InterpreterResolvedObjectType[interfaces.length]; for (int i = 0; i < interfaces.length; i++) { result[i] = universe.lookupType(interfaces[i]); } - return result; + return List.of(result); } else { return type.getInterfaces(); } @@ -476,29 +477,29 @@ private ResolvedJavaMethod getClassInitializer(ResolvedJavaType type) { } } - private ResolvedJavaMethod[] getDeclaredConstructors(ResolvedJavaType type) { + private List getDeclaredConstructors(ResolvedJavaType type) { if (type instanceof InterpreterResolvedJavaType) { return universe.getAllDeclaredMethods(type) .stream() .filter(ResolvedJavaMethod::isConstructor) - .toArray(InterpreterResolvedJavaMethod[]::new); + .collect(Collectors.toList()); } else { return type.getDeclaredConstructors(); } } - private ResolvedJavaMethod[] getDeclaredMethods(ResolvedJavaType type) { + private List getDeclaredMethods(ResolvedJavaType type) { if (type instanceof InterpreterResolvedJavaType) { return universe.getAllDeclaredMethods(type) .stream() .filter(method -> !method.isConstructor() && !method.isClassInitializer()) - .toArray(ResolvedJavaMethod[]::new); + .collect(Collectors.toList()); } else { return type.getDeclaredMethods(); } } - private ResolvedJavaField[] getInstanceFields(ResolvedJavaType type, boolean includeSuperclasses) { + private List getInstanceFields(ResolvedJavaType type, boolean includeSuperclasses) { if (type instanceof InterpreterResolvedJavaType) { if (includeSuperclasses) { throw VMError.unimplemented("getInstanceFields with includeSuperclasses=true"); @@ -506,18 +507,18 @@ private ResolvedJavaField[] getInstanceFields(ResolvedJavaType type, boolean inc return universe.getAllDeclaredFields(type) .stream() .filter(f -> !f.isStatic()) - .toArray(ResolvedJavaField[]::new); + .collect(Collectors.toList()); } else { return type.getInstanceFields(includeSuperclasses); } } - private ResolvedJavaField[] getStaticFields(ResolvedJavaType type) { + private List getStaticFields(ResolvedJavaType type) { if (type instanceof InterpreterResolvedJavaType) { return universe.getAllDeclaredFields(type) .stream() .filter(ModifiersProvider::isStatic) - .toArray(ResolvedJavaField[]::new); + .collect(Collectors.toList()); } else { return type.getStaticFields(); } @@ -592,8 +593,8 @@ void dumpClassFileImpl(ResolvedJavaType type) { if (getClassInitializer(type) != null) { allDeclaredMethods.add(getClassInitializer(type)); } - allDeclaredMethods.addAll(Arrays.asList(getDeclaredConstructors(type))); - allDeclaredMethods.addAll(Arrays.asList(getDeclaredMethods(type))); + allDeclaredMethods.addAll(getDeclaredConstructors(type)); + allDeclaredMethods.addAll(getDeclaredMethods(type)); // Write all 1-byte CPIs first in the constant pool. processLDC(allDeclaredMethods); @@ -613,7 +614,7 @@ void dumpClassFileImpl(ResolvedJavaType type) { } // u2 interfaces_count; - classFile.writeU2(getInterfaces(type).length); + classFile.writeU2(getInterfaces(type).size()); // u2 interfaces[interfaces_count]; for (JavaType i : getInterfaces(type)) { @@ -621,8 +622,8 @@ void dumpClassFileImpl(ResolvedJavaType type) { } List fields = new ArrayList<>(); - fields.addAll(Arrays.asList(getStaticFields(type))); - fields.addAll(Arrays.asList(getInstanceFields(type, false))); + fields.addAll(getStaticFields(type)); + fields.addAll(getInstanceFields(type, false)); // u2 fields_count; classFile.writeU2(fields.size()); @@ -835,7 +836,7 @@ private void dumpMethodInfo(ResolvedJavaMethod method) { ++attributeCount; } - ResolvedJavaMethod.Parameter[] methodParameters = method.getParameters(); + List methodParameters = method.getParameters(); if (methodParameters != null) { ++attributeCount; } @@ -862,7 +863,7 @@ private void dumpMethodInfo(ResolvedJavaMethod method) { // RuntimeVisibleTypeAnnotations, RuntimeInvisibleTypeAnnotations } - private void dumpMethodParameters(ResolvedJavaMethod.Parameter[] methodParameters) { + private void dumpMethodParameters(List methodParameters) { if (methodParameters == null) { return; } @@ -877,7 +878,7 @@ private void dumpMethodParameters(ResolvedJavaMethod.Parameter[] methodParameter // } classFile.writeU2(utf8("MethodParameters")); - int attributeLength = 1 + methodParameters.length * 4; + int attributeLength = 1 + methodParameters.size() * 4; classFile.writeInt(attributeLength); classFile.writeU1(attributeLength); @@ -938,12 +939,12 @@ private void dumpLocalVariableTable(LocalVariableTable localVariableTable) { // } classFile.writeU2(utf8("LocalVariableTable")); - Local[] locals = localVariableTable.getLocals(); + List locals = localVariableTable.getLocals(); - int attributeLength = 2 + locals.length * 10; + int attributeLength = 2 + locals.size() * 10; classFile.writeInt(attributeLength); - classFile.writeU2(locals.length); + classFile.writeU2(locals.size()); for (Local local : locals) { classFile.writeU2(local.getStartBCI()); classFile.writeU2(local.getEndBCI() - local.getStartBCI()); @@ -992,12 +993,12 @@ private void dumpCodeAttribute(ResolvedJavaMethod method) { classFile.writeBytes(recomputeConstantPoolIndices(method)); } - ExceptionHandler[] handlers = method.getExceptionHandlers(); - if (handlers == null || handlers.length == 0) { + List handlers = method.getExceptionHandlers(); + if (handlers == null || handlers.size() == 0) { classFile.writeU2(0); // empty } else { - classFile.writeU2(handlers.length); + classFile.writeU2(handlers.size()); for (ExceptionHandler eh : handlers) { classFile.writeU2(eh.getStartBCI()); classFile.writeU2(eh.getEndBCI()); diff --git a/substratevm/src/com.oracle.svm.jdwp.server/src/com/oracle/svm/jdwp/server/impl/ServerJDWP.java b/substratevm/src/com.oracle.svm.jdwp.server/src/com/oracle/svm/jdwp/server/impl/ServerJDWP.java index 4464d6a9e667..f486fa9ef6e4 100644 --- a/substratevm/src/com.oracle.svm.jdwp.server/src/com/oracle/svm/jdwp/server/impl/ServerJDWP.java +++ b/substratevm/src/com.oracle.svm.jdwp.server/src/com/oracle/svm/jdwp/server/impl/ServerJDWP.java @@ -26,6 +26,7 @@ import java.io.File; import java.util.Collection; +import java.util.List; import com.oracle.svm.interpreter.metadata.MetadataUtil; import com.oracle.svm.jdwp.bridge.CheckedReader; @@ -402,8 +403,8 @@ private static Packet variableTableHelper(Packet packet, boolean includeGenericS // all others use one. writer.writeInt(slotsForArguments); - Local[] locals = table.getLocals(); - writer.writeInt(locals.length); + List locals = table.getLocals(); + writer.writeInt(locals.size()); for (Local local : locals) { long codeIndex = local.getStartBCI(); // First code index at which the variable is visible (unsigned). Used in conjunction @@ -808,11 +809,11 @@ public Packet ReferenceType_Interfaces(Packet packet) throws JDWPException { Packet.Reader reader = packet.newDataReader(); ResolvedJavaType type = CHECKED_READER.readTypeRef(reader); - ResolvedJavaType[] interfaces = type.getInterfaces(); + List interfaces = type.getInterfaces(); WritablePacket reply = WritablePacket.newReplyTo(packet); Packet.Writer writer = reply.dataWriter(); - writer.writeInt(interfaces.length); + writer.writeInt(interfaces.size()); for (ResolvedJavaType interfaceType : interfaces) { long typeId = SYMBOLIC_REFS.toTypeRef(interfaceType); writer.writeLong(typeId); 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 982f2b176258..952adac04190 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 @@ -325,10 +325,10 @@ private void initializeDeniedMethods(FeatureImpl.BeforeAnalysisAccessImpl access // We deny SynchronousQueue as it creates ForkJoinWorkerThread. deniedMethods.addAll(findConstructors(bb, SynchronousQueue.class, (m) -> "".equals(m.getName()))); // Reflective calls - deniedMethods.addAll(findMethods(bb, Method.class, (m) -> m.getName().equals("invoke") && m.isPublic() && m.getParameters().length == 2)); - deniedMethods.addAll(findMethods(bb, Constructor.class, (m) -> m.getName().equals("newInstance") && m.isPublic() && m.getParameters().length == 1)); + deniedMethods.addAll(findMethods(bb, Method.class, (m) -> m.getName().equals("invoke") && m.isPublic() && m.getParameters().size() == 2)); + deniedMethods.addAll(findMethods(bb, Constructor.class, (m) -> m.getName().equals("newInstance") && m.isPublic() && m.getParameters().size() == 1)); deniedMethods.addAll(findMethods(bb, MethodHandle.class, (m) -> m.getName().startsWith("invoke") && m.isPublic())); - deniedMethods.addAll(findMethods(bb, Class.class, (m) -> m.getName().equals("newInstance") && m.isPublic() && m.getParameters().length == 0)); + deniedMethods.addAll(findMethods(bb, Class.class, (m) -> m.getName().equals("newInstance") && m.isPublic() && m.getParameters().size() == 0)); // ProcessIsolate entry method deniedMethods.addAll(findMethods(bb, ProcessIsolate.class, (m) -> m.getName().equals("spawnProcessIsolate"))); if (inlinedUnsafeCall != null) { @@ -742,7 +742,7 @@ static Set findConstructors(BigBang bb, AnalysisType owner, return findImpl(bb, owner.getWrapped().getDeclaredConstructors(false), filter); } - private static Set findImpl(BigBang bb, ResolvedJavaMethod[] methods, Predicate filter) { + private static Set findImpl(BigBang bb, List methods, Predicate filter) { Set result = new HashSet<>(); for (ResolvedJavaMethod m : methods) { if (filter.test(m)) { @@ -924,21 +924,21 @@ private static final class SafeReflectionRecognizer implements CallGraphFilter { SafeReflectionRecognizer(BigBang bb) { inspectedMethods = new HashSet<>(); AnalysisType method = bb.getMetaAccess().lookupJavaType(Method.class); - Set methods = findMethods(bb, method, (m) -> m.getName().equals("invoke") && m.isPublic() && m.getParameters().length == 2); + Set methods = findMethods(bb, method, (m) -> m.getName().equals("invoke") && m.isPublic() && m.getParameters().size() == 2); if (methods.size() != 1) { throw new IllegalStateException("Failed to lookup Method.invoke(Object,Object...)."); } inspectedMethods.addAll(methods); AnalysisType constructor = bb.getMetaAccess().lookupJavaType(Constructor.class); - methods = findMethods(bb, constructor, (m) -> m.getName().equals("newInstance") && m.isPublic() && m.getParameters().length == 1); + methods = findMethods(bb, constructor, (m) -> m.getName().equals("newInstance") && m.isPublic() && m.getParameters().size() == 1); if (methods.size() != 1) { throw new IllegalStateException("Failed to lookup Constructor.newInstance(Object...)."); } inspectedMethods.addAll(methods); AnalysisType clazz = bb.getMetaAccess().lookupJavaType(Class.class); - methods = findMethods(bb, clazz, (m) -> m.getName().equals("newInstance") && m.isPublic() && m.getParameters().length == 0); + methods = findMethods(bb, clazz, (m) -> m.getName().equals("newInstance") && m.isPublic() && m.getParameters().size() == 0); if (methods.size() != 1) { throw new IllegalStateException("Failed to lookup Class.newInstance()."); } @@ -1034,7 +1034,7 @@ private static final class SafeLocaleServiceProvider implements CallGraphFilter private final AnalysisMethodNode localeServiceProviderInit; SafeLocaleServiceProvider(BigBang bb) { - Set constructors = findConstructors(bb, LocaleServiceProvider.class, (m) -> m.getParameters().length == 0); + Set constructors = findConstructors(bb, LocaleServiceProvider.class, (m) -> m.getParameters().size() == 0); if (constructors.size() != 1) { throw new IllegalStateException("Failed to lookup LocaleServiceProvider.()."); } @@ -1099,14 +1099,14 @@ private static final class SafeURLOf implements CallGraphFilter { if (!"of".equals(m.getName())) { return false; } - ResolvedJavaMethod.Parameter[] parameters = m.getParameters(); - if (parameters.length != 2) { + List parameters = m.getParameters(); + if (parameters.size() != 2) { return false; } - if (!bigBang.getMetaAccess().lookupJavaType(URI.class).getWrapped().equals(parameters[0].getType())) { + if (!bigBang.getMetaAccess().lookupJavaType(URI.class).getWrapped().equals(parameters.getFirst().getType())) { return false; } - return bigBang.getMetaAccess().lookupJavaType(URLStreamHandler.class).getWrapped().equals(parameters[1].getType()); + return bigBang.getMetaAccess().lookupJavaType(URLStreamHandler.class).getWrapped().equals(parameters.get(1).getType()); }); if (methods.size() != 1) { throw new IllegalStateException("Failed to lookup URL.of(URI, URLStreamHandler)."); 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 97ed4fbc7971..27deccbd14b4 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 @@ -923,8 +923,8 @@ public void afterAnalysis(AfterAnalysisAccess access) { truffleRuntime.initializeHostedKnownMethods(config.getMetaAccess()); runtimeCompiledMethods = new LinkedHashSet<>(); - runtimeCompiledMethods.addAll(Arrays.asList(config.getMetaAccess().lookupJavaType(CompilerDirectives.class).getDeclaredMethods(false))); - runtimeCompiledMethods.addAll(Arrays.asList(config.getMetaAccess().lookupJavaType(CompilerAsserts.class).getDeclaredMethods(false))); + runtimeCompiledMethods.addAll(config.getMetaAccess().lookupJavaType(CompilerDirectives.class).getDeclaredMethods(false)); + runtimeCompiledMethods.addAll(config.getMetaAccess().lookupJavaType(CompilerAsserts.class).getDeclaredMethods(false)); for (RuntimeCompiledMethod runtimeCompiledMethod : treeInfo.runtimeCompilations()) { diff --git a/truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/hotspot/HotSpotTruffleRuntime.java b/truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/hotspot/HotSpotTruffleRuntime.java index 0e50c0ca9a31..5a8a69085de9 100644 --- a/truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/hotspot/HotSpotTruffleRuntime.java +++ b/truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/hotspot/HotSpotTruffleRuntime.java @@ -618,11 +618,10 @@ protected int[] getFieldOffsets(Class type, boolean includePrimitive, boolean } HotSpotMetaAccessProvider meta = (HotSpotMetaAccessProvider) getMetaAccess(); ResolvedJavaType javaType = meta.lookupJavaType(type); - ResolvedJavaField[] fields = javaType.getInstanceFields(includeSuperclasses); - int[] fieldOffsets = new int[fields.length]; + List fields = javaType.getInstanceFields(includeSuperclasses); + int[] fieldOffsets = new int[fields.size()]; int fieldsCount = 0; - for (int i = 0; i < fields.length; i++) { - final ResolvedJavaField f = fields[i]; + for (final ResolvedJavaField f : fields) { if ((includePrimitive || !f.getJavaKind().isPrimitive()) && !fieldIsNotEligible(type, f)) { fieldOffsets[fieldsCount++] = f.getOffset(); } diff --git a/truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/hotspot/libgraal/TruffleFromLibGraalEntryPoints.java b/truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/hotspot/libgraal/TruffleFromLibGraalEntryPoints.java index 52ed32b67b36..4cafd4173b8a 100644 --- a/truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/hotspot/libgraal/TruffleFromLibGraalEntryPoints.java +++ b/truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/hotspot/libgraal/TruffleFromLibGraalEntryPoints.java @@ -155,8 +155,8 @@ static boolean isValueType(Object truffleRuntime, long typeHandle) { @TruffleFromLibGraal(GetConstantFieldInfo) static int getConstantFieldInfo(Object truffleRuntime, long typeHandle, boolean isStatic, int fieldIndex) { ResolvedJavaType enclosing = LibGraal.unhand(ResolvedJavaType.class, typeHandle); - ResolvedJavaField[] declaredFields = isStatic ? enclosing.getStaticFields() : enclosing.getInstanceFields(false); - ResolvedJavaField field = declaredFields[fieldIndex]; + List declaredFields = isStatic ? enclosing.getStaticFields() : enclosing.getInstanceFields(false); + ResolvedJavaField field = declaredFields.get(fieldIndex); ConstantFieldInfo constantFieldInfo = ((TruffleCompilerRuntime) truffleRuntime).getConstantFieldInfo(field); if (constantFieldInfo == null) {