Skip to content

Commit 6c0fe6e

Browse files
Crema: Resolve METHODTYPE constant pool entries
1 parent 3920473 commit 6c0fe6e

File tree

4 files changed

+60
-0
lines changed

4 files changed

+60
-0
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/methodhandles/Target_java_lang_invoke_MethodHandleNatives.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import java.lang.invoke.CallSite;
3131
import java.lang.invoke.MethodHandle;
32+
import java.lang.invoke.MethodType;
3233
import java.lang.reflect.AccessibleObject;
3334
import java.lang.reflect.Constructor;
3435
import java.lang.reflect.Field;
@@ -48,7 +49,9 @@
4849
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
4950
import com.oracle.svm.core.annotate.Substitute;
5051
import com.oracle.svm.core.annotate.TargetClass;
52+
import com.oracle.svm.core.annotate.TargetElement;
5153
import com.oracle.svm.core.hub.DynamicHub;
54+
import com.oracle.svm.core.hub.RuntimeClassLoading;
5255
import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport;
5356
import com.oracle.svm.core.invoke.Target_java_lang_invoke_MemberName;
5457
import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton;
@@ -215,6 +218,10 @@ public static Target_java_lang_invoke_MemberName resolve(Target_java_lang_invoke
215218
return resolved;
216219
}
217220

221+
@Alias
222+
@TargetElement(onlyWith = RuntimeClassLoading.WithRuntimeClassLoading.class)
223+
public static native MethodType findMethodHandleType(Class<?> rtype, Class<?>[] ptypes);
224+
218225
@Delete
219226
static native MethodHandle linkMethodHandleConstant(Class<?> callerClass, int refKind, Class<?> defc, String name, Object type);
220227
}

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterConstantPool.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import static com.oracle.svm.interpreter.metadata.Bytecodes.INVOKEDYNAMIC;
2828

29+
import java.lang.invoke.MethodType;
2930
import java.util.List;
3031

3132
import org.graalvm.nativeimage.Platform;
@@ -270,6 +271,12 @@ public String resolveStringAt(int cpi) {
270271
return (String) resolvedEntry;
271272
}
272273

274+
public MethodType resolvedMethodTypeAt(char cpi, InterpreterResolvedObjectType accessingClass) {
275+
Object resolvedEntry = resolvedAt(cpi, accessingClass);
276+
assert resolvedEntry != null;
277+
return (MethodType) resolvedEntry;
278+
}
279+
273280
@Override
274281
public int intAt(int index) {
275282
checkTag(index, CONSTANT_Integer);

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/Interpreter.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@
264264
import static com.oracle.svm.interpreter.metadata.Bytecodes.TABLESWITCH;
265265
import static com.oracle.svm.interpreter.metadata.Bytecodes.WIDE;
266266

267+
import java.lang.invoke.MethodType;
268+
267269
import com.oracle.svm.core.jdk.InternalVMMethod;
268270
import com.oracle.svm.core.util.VMError;
269271
import com.oracle.svm.espresso.classfile.ConstantPool;
@@ -1207,6 +1209,9 @@ private static void loadConstant(InterpreterFrame frame, InterpreterResolvedJava
12071209
String string = pool.resolveStringAt(cpi);
12081210
putObject(frame, top, string);
12091211
}
1212+
case METHODTYPE -> {
1213+
putObject(frame, top, resolveMethodType(pool, method, opcode, cpi));
1214+
}
12101215
case INVOKEDYNAMIC -> {
12111216
// TODO(peterssen): GR-68576 Storing the pre-resolved appendix in the CP is a
12121217
// workaround for the JDWP debugger until proper INVOKEDYNAMIC resolution is
@@ -1281,6 +1286,15 @@ private static int invoke(InterpreterFrame callerFrame, InterpreterResolvedJavaM
12811286
return retStackEffect - Bytecodes.stackEffectOf(opcode);
12821287
}
12831288

1289+
private static MethodType resolveMethodType(InterpreterConstantPool pool, InterpreterResolvedJavaMethod method, int opcode, char cpi) {
1290+
assert opcode == LDC || opcode == LDC_W;
1291+
try {
1292+
return pool.resolvedMethodTypeAt(cpi, method.getDeclaringClass());
1293+
} catch (Throwable t) {
1294+
throw SemanticJavaException.raise(t);
1295+
}
1296+
}
1297+
12841298
// region Class/Method/Field resolution
12851299

12861300
private static InterpreterResolvedJavaType resolveType(InterpreterResolvedJavaMethod method, int opcode, char cpi) {

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/RuntimeInterpreterConstantPool.java

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

27+
import java.lang.invoke.MethodType;
28+
29+
import com.oracle.svm.core.hub.crema.CremaSupport;
2730
import com.oracle.svm.core.hub.registry.SymbolsSupport;
31+
import com.oracle.svm.core.methodhandles.Target_java_lang_invoke_MethodHandleNatives;
2832
import com.oracle.svm.core.util.VMError;
2933
import com.oracle.svm.espresso.classfile.ParserConstantPool;
3034
import com.oracle.svm.espresso.classfile.descriptors.Name;
3135
import com.oracle.svm.espresso.classfile.descriptors.Signature;
36+
import com.oracle.svm.espresso.classfile.descriptors.SignatureSymbols;
3237
import com.oracle.svm.espresso.classfile.descriptors.Symbol;
3338
import com.oracle.svm.espresso.classfile.descriptors.Type;
3439
import com.oracle.svm.espresso.classfile.descriptors.TypeSymbols;
@@ -62,10 +67,17 @@ protected Object resolve(int cpi, InterpreterResolvedObjectType accessingClass)
6267
case INTERFACE_METHOD_REF -> resolveInterfaceMethodRefConstant(cpi, accessingClass);
6368
case METHOD_REF -> resolveClassMethodRefConstant(cpi, accessingClass);
6469
case CLASS -> resolveClassConstant(cpi, accessingClass);
70+
case METHODTYPE -> resolveMethodType(cpi, accessingClass);
6571
default -> throw VMError.unimplemented("Unimplemented CP resolution for " + tag);
6672
};
6773
}
6874

75+
private Object resolveMethodType(int cpi, InterpreterResolvedObjectType accessingClass) {
76+
Symbol<Signature> sig = this.methodTypeSignature(cpi);
77+
Symbol<Type>[] parsed = SymbolsSupport.getSignatures().parsed(sig);
78+
return signatureToMethodType(parsed, accessingClass);
79+
}
80+
6981
private String resolveStringConstant(int stringIndex, @SuppressWarnings("unused") InterpreterResolvedObjectType accessingKlass) {
7082
int utf8Index = this.stringUtf8Index(stringIndex);
7183
String string = this.utf8At(utf8Index).toString().intern(); // intern?
@@ -223,4 +235,24 @@ private InterpreterResolvedJavaMethod resolveInterfaceMethodRefConstant(int inte
223235

224236
return interfaceMethod;
225237
}
238+
239+
public static MethodType signatureToMethodType(Symbol<Type>[] signature, InterpreterResolvedObjectType accessingClass) {
240+
Symbol<Type> rt = SignatureSymbols.returnType(signature);
241+
int pcount = SignatureSymbols.parameterCount(signature);
242+
Class<?>[] ptypes = new Class<?>[pcount];
243+
Class<?> rtype;
244+
for (int i = 0; i < pcount; i++) {
245+
Symbol<Type> paramType = SignatureSymbols.parameterType(signature, i);
246+
ptypes[i] = resolveSymbolAndAccessCheck(accessingClass, paramType);
247+
}
248+
rtype = resolveSymbolAndAccessCheck(accessingClass, rt);
249+
250+
return Target_java_lang_invoke_MethodHandleNatives.findMethodHandleType(rtype, ptypes);
251+
}
252+
253+
private static Class<?> resolveSymbolAndAccessCheck(InterpreterResolvedObjectType accessingClass, Symbol<Type> type) {
254+
Class<?> clazz = CremaSupport.singleton().resolveOrThrow(type, accessingClass);
255+
// GR-62339 check access
256+
return clazz;
257+
}
226258
}

0 commit comments

Comments
 (0)