Skip to content

Commit 4ff3399

Browse files
committed
Merge JNICallSignature into SimpleSignature.
1 parent e4682d8 commit 4ff3399

File tree

5 files changed

+72
-127
lines changed

5 files changed

+72
-127
lines changed

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/SimpleSignature.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,35 @@
2424
*/
2525
package com.oracle.svm.hosted.code;
2626

27+
import java.util.Arrays;
2728
import java.util.List;
29+
import java.util.Objects;
2830

31+
import com.oracle.svm.core.SubstrateUtil;
32+
33+
import jdk.vm.ci.meta.JavaKind;
2934
import jdk.vm.ci.meta.JavaType;
35+
import jdk.vm.ci.meta.MetaAccessProvider;
3036
import jdk.vm.ci.meta.ResolvedJavaType;
3137
import jdk.vm.ci.meta.Signature;
3238

3339
/**
3440
* A straightforward implementation of {@link Signature}.
3541
*/
3642
public class SimpleSignature implements Signature {
43+
public static SimpleSignature fromKinds(JavaKind[] paramKinds, JavaKind returnKind, MetaAccessProvider metaAccess) {
44+
ResolvedJavaType[] paramTypes = new ResolvedJavaType[paramKinds.length];
45+
for (int i = 0; i < paramKinds.length; i++) {
46+
paramTypes[i] = SimpleSignature.resolveType(paramKinds[i], metaAccess);
47+
}
48+
JavaType returnType = SimpleSignature.resolveType(returnKind, metaAccess);
49+
return new SimpleSignature(paramTypes, returnType);
50+
}
51+
52+
private static ResolvedJavaType resolveType(JavaKind kind, MetaAccessProvider metaAccess) {
53+
return metaAccess.lookupJavaType(kind.isObject() ? Object.class : kind.toJavaClass());
54+
}
55+
3756
private final JavaType[] parameterTypes;
3857
private final JavaType returnType;
3958

@@ -60,4 +79,38 @@ public JavaType getParameterType(int index, ResolvedJavaType accessingClass) {
6079
public JavaType getReturnType(ResolvedJavaType accessingClass) {
6180
return returnType;
6281
}
82+
83+
public String getIdentifier() {
84+
StringBuilder sb = new StringBuilder(1 + parameterTypes.length);
85+
boolean digest = false;
86+
for (JavaType type : parameterTypes) {
87+
if (type.getJavaKind().isPrimitive() || (type instanceof ResolvedJavaType && ((ResolvedJavaType) type).isJavaLangObject())) {
88+
sb.append(type.getJavaKind().getTypeChar());
89+
} else {
90+
sb.append(type.toClassName());
91+
digest = true;
92+
}
93+
}
94+
sb.append('_').append(returnType.getJavaKind().getTypeChar());
95+
return digest ? SubstrateUtil.digest(sb.toString()) : sb.toString();
96+
}
97+
98+
@Override
99+
public boolean equals(Object obj) {
100+
if (this != obj && obj instanceof SimpleSignature) {
101+
var other = (SimpleSignature) obj;
102+
return Arrays.equals(parameterTypes, other.parameterTypes) && Objects.equals(returnType, other.returnType);
103+
}
104+
return (this == obj);
105+
}
106+
107+
@Override
108+
public int hashCode() {
109+
return Arrays.hashCode(parameterTypes) * 31 + Objects.hashCode(returnType);
110+
}
111+
112+
@Override
113+
public String toString() {
114+
return getIdentifier();
115+
}
63116
}

substratevm/src/com.oracle.svm.jni/src/com/oracle/svm/jni/access/JNIAccessFeature.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@
6565
import com.oracle.svm.hosted.ProgressReporter;
6666
import com.oracle.svm.hosted.code.CEntryPointData;
6767
import com.oracle.svm.hosted.code.FactoryMethodSupport;
68+
import com.oracle.svm.hosted.code.SimpleSignature;
6869
import com.oracle.svm.hosted.config.ConfigurationParserUtils;
6970
import com.oracle.svm.hosted.meta.KnownOffsetsFeature;
7071
import com.oracle.svm.hosted.meta.MaterializedConstantFields;
7172
import com.oracle.svm.hosted.substitute.SubstitutionReflectivityFilter;
7273
import com.oracle.svm.jni.JNIJavaCallTrampolines;
73-
import com.oracle.svm.jni.hosted.JNICallSignature;
7474
import com.oracle.svm.jni.hosted.JNICallTrampolineMethod;
7575
import com.oracle.svm.jni.hosted.JNIFieldAccessorMethod;
7676
import com.oracle.svm.jni.hosted.JNIJavaCallVariantWrapperMethod;
@@ -110,9 +110,9 @@ static final class JNIJavaCallVariantWrapperGroup {
110110

111111
private boolean sealed = false;
112112
private final Map<String, JNICallTrampolineMethod> trampolineMethods = new ConcurrentHashMap<>();
113-
private final Map<JNICallSignature, JNIJavaCallWrapperMethod> javaCallWrapperMethods = new ConcurrentHashMap<>();
114-
private final Map<JNICallSignature, JNIJavaCallVariantWrapperGroup> callVariantWrappers = new ConcurrentHashMap<>();
115-
private final Map<JNICallSignature, JNIJavaCallVariantWrapperGroup> nonvirtualCallVariantWrappers = new ConcurrentHashMap<>();
113+
private final Map<SimpleSignature, JNIJavaCallWrapperMethod> javaCallWrapperMethods = new ConcurrentHashMap<>();
114+
private final Map<SimpleSignature, JNIJavaCallVariantWrapperGroup> callVariantWrappers = new ConcurrentHashMap<>();
115+
private final Map<SimpleSignature, JNIJavaCallVariantWrapperGroup> nonvirtualCallVariantWrappers = new ConcurrentHashMap<>();
116116

117117
private int loadedConfigurations;
118118

@@ -327,7 +327,7 @@ private void addMethod(Executable method, DuringAnalysisAccessImpl access) {
327327
newObjectMethod = aFactoryMethod.getWrapped();
328328
}
329329

330-
JNICallSignature compatibleSignature = JNIJavaCallWrapperMethod.getGeneralizedSignatureForTarget(targetMethod, originalMetaAccess);
330+
SimpleSignature compatibleSignature = JNIJavaCallWrapperMethod.getGeneralizedSignatureForTarget(targetMethod, originalMetaAccess);
331331
JNIJavaCallWrapperMethod callWrapperMethod = javaCallWrapperMethods.computeIfAbsent(compatibleSignature,
332332
signature -> factory.create(signature, originalMetaAccess, access.getBigBang().getProviders().getWordTypes()));
333333
access.registerAsRoot(universe.lookup(callWrapperMethod), true);
@@ -343,7 +343,7 @@ private void addMethod(Executable method, DuringAnalysisAccessImpl access) {
343343
});
344344
}
345345

346-
private JNIJavaCallVariantWrapperGroup createJavaCallVariantWrappers(DuringAnalysisAccessImpl access, JNICallSignature wrapperSignature, boolean nonVirtual) {
346+
private JNIJavaCallVariantWrapperGroup createJavaCallVariantWrappers(DuringAnalysisAccessImpl access, SimpleSignature wrapperSignature, boolean nonVirtual) {
347347
var map = nonVirtual ? nonvirtualCallVariantWrappers : callVariantWrappers;
348348
return map.computeIfAbsent(wrapperSignature, signature -> {
349349
MetaAccessProvider originalMetaAccess = access.getUniverse().getOriginalMetaAccess();

substratevm/src/com.oracle.svm.jni/src/com/oracle/svm/jni/hosted/JNICallSignature.java

Lines changed: 0 additions & 110 deletions
This file was deleted.

substratevm/src/com.oracle.svm.jni/src/com/oracle/svm/jni/hosted/JNIJavaCallVariantWrapperMethod.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import com.oracle.svm.core.graal.nodes.VaListNextArgNode;
6363
import com.oracle.svm.core.util.VMError;
6464
import com.oracle.svm.hosted.code.EntryPointCallStubMethod;
65+
import com.oracle.svm.hosted.code.SimpleSignature;
6566
import com.oracle.svm.hosted.meta.HostedMetaAccess;
6667
import com.oracle.svm.jni.JNIJavaCallVariantWrappers;
6768

@@ -87,7 +88,7 @@ public enum CallVariant {
8788
private final CallVariant callVariant;
8889
private final boolean nonVirtual;
8990

90-
public JNIJavaCallVariantWrapperMethod(JNICallSignature callWrapperSignature, CallVariant callVariant, boolean nonVirtual, MetaAccessProvider originalMetaAccess, WordTypes wordTypes) {
91+
public JNIJavaCallVariantWrapperMethod(SimpleSignature callWrapperSignature, CallVariant callVariant, boolean nonVirtual, MetaAccessProvider originalMetaAccess, WordTypes wordTypes) {
9192
super(createName(callWrapperSignature, callVariant, nonVirtual),
9293
originalMetaAccess.lookupJavaType(JNIJavaCallVariantWrappers.class),
9394
createSignature(callWrapperSignature, callVariant, nonVirtual, originalMetaAccess, wordTypes),
@@ -97,7 +98,7 @@ public JNIJavaCallVariantWrapperMethod(JNICallSignature callWrapperSignature, Ca
9798
this.nonVirtual = nonVirtual;
9899
}
99100

100-
private static String createName(JNICallSignature targetSignature, CallVariant callVariant, boolean nonVirtual) {
101+
private static String createName(SimpleSignature targetSignature, CallVariant callVariant, boolean nonVirtual) {
101102
return "invoke" + targetSignature.getIdentifier() + "_" + callVariant.name() + (nonVirtual ? "_Nonvirtual" : "");
102103
}
103104

@@ -134,7 +135,7 @@ private static Signature createSignature(Signature callWrapperSignature, CallVar
134135
if (returnType.isObject()) {
135136
returnType = wordKind; // handle
136137
}
137-
return new JNICallSignature(args.toArray(JavaKind[]::new), returnType, originalMetaAccess);
138+
return SimpleSignature.fromKinds(args.toArray(JavaKind[]::new), returnType, originalMetaAccess);
138139
}
139140

140141
@Override

substratevm/src/com.oracle.svm.jni/src/com/oracle/svm/jni/hosted/JNIJavaCallWrapperMethod.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import com.oracle.svm.core.graal.nodes.LoweredDeadEndNode;
6161
import com.oracle.svm.hosted.code.FactoryMethodSupport;
6262
import com.oracle.svm.hosted.code.NonBytecodeStaticMethod;
63+
import com.oracle.svm.hosted.code.SimpleSignature;
6364
import com.oracle.svm.hosted.meta.HostedMetaAccess;
6465
import com.oracle.svm.jni.JNIJavaCallWrappers;
6566
import com.oracle.svm.jni.access.JNIAccessibleMethod;
@@ -89,7 +90,7 @@ public class JNIJavaCallWrapperMethod extends NonBytecodeStaticMethod {
8990
private static final Constructor<InstantiationException> INSTANTIATION_EXCEPTION_CONSTRUCTOR = ReflectionUtil.lookupConstructor(InstantiationException.class);
9091

9192
public static class Factory {
92-
public JNIJavaCallWrapperMethod create(JNICallSignature targetSignature, MetaAccessProvider originalMetaAccess, WordTypes wordTypes) {
93+
public JNIJavaCallWrapperMethod create(SimpleSignature targetSignature, MetaAccessProvider originalMetaAccess, WordTypes wordTypes) {
9394
return new JNIJavaCallWrapperMethod(targetSignature, originalMetaAccess, wordTypes);
9495
}
9596

@@ -99,7 +100,7 @@ public boolean canInvokeConstructorOnObject(ResolvedJavaMethod constructor, Meta
99100
}
100101
}
101102

102-
public static JNICallSignature getGeneralizedSignatureForTarget(ResolvedJavaMethod targetMethod, MetaAccessProvider originalMetaAccess) {
103+
public static SimpleSignature getGeneralizedSignatureForTarget(ResolvedJavaMethod targetMethod, MetaAccessProvider originalMetaAccess) {
103104
JavaType[] paramTypes = targetMethod.getSignature().toParameterTypes(null);
104105
// Note: our parameters do not include the receiver, but we can do a type check based on the
105106
// JNIAccessibleMethod object we get from the method id.
@@ -114,18 +115,18 @@ public static JNICallSignature getGeneralizedSignatureForTarget(ResolvedJavaMeth
114115
// Note: no need to distinguish between object return types for us, the return value must
115116
// match in Java code and we return it as handle anyway.
116117
JavaType returnType = originalMetaAccess.lookupJavaType(returnKind.isObject() ? Object.class : returnKind.toJavaClass());
117-
return new JNICallSignature(paramTypes, returnType);
118+
return new SimpleSignature(paramTypes, returnType);
118119
}
119120

120121
private final Signature targetSignature;
121122

122-
protected JNIJavaCallWrapperMethod(JNICallSignature targetSignature, MetaAccessProvider metaAccess, WordTypes wordTypes) {
123+
protected JNIJavaCallWrapperMethod(SimpleSignature targetSignature, MetaAccessProvider metaAccess, WordTypes wordTypes) {
123124
super("invoke_" + targetSignature.getIdentifier(), metaAccess.lookupJavaType(JNIJavaCallWrappers.class),
124125
createSignature(targetSignature, metaAccess, wordTypes), JNIJavaCallWrappers.getConstantPool(metaAccess));
125126
this.targetSignature = targetSignature;
126127
}
127128

128-
private static JNICallSignature createSignature(Signature targetSignature, MetaAccessProvider originalMetaAccess, WordTypes wordTypes) {
129+
private static SimpleSignature createSignature(Signature targetSignature, MetaAccessProvider originalMetaAccess, WordTypes wordTypes) {
129130
JavaKind wordKind = wordTypes.getWordKind();
130131
int count = targetSignature.getParameterCount(false);
131132
JavaKind[] args = new JavaKind[3 + count];
@@ -151,12 +152,12 @@ private static JNICallSignature createSignature(Signature targetSignature, MetaA
151152
if (returnKind.isObject()) {
152153
returnKind = wordKind; // handle
153154
}
154-
return new JNICallSignature(args, returnKind, originalMetaAccess);
155+
return SimpleSignature.fromKinds(args, returnKind, originalMetaAccess);
155156
}
156157

157158
@Override
158-
public JNICallSignature getSignature() {
159-
return (JNICallSignature) super.getSignature();
159+
public SimpleSignature getSignature() {
160+
return (SimpleSignature) super.getSignature();
160161
}
161162

162163
@Override

0 commit comments

Comments
 (0)