Skip to content

Commit 12b01d0

Browse files
committed
svm: reset LambdaForm#transformCache
1 parent 12d08fd commit 12b01d0

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,27 @@
2424
*/
2525
package com.oracle.svm.core.methodhandles;
2626

27+
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
28+
2729
import com.oracle.svm.core.annotate.Alias;
2830
import com.oracle.svm.core.annotate.RecomputeFieldValue;
2931
import com.oracle.svm.core.annotate.Substitute;
3032
import com.oracle.svm.core.annotate.TargetClass;
33+
import com.oracle.svm.core.annotate.TargetElement;
3134
import com.oracle.svm.core.invoke.Target_java_lang_invoke_MemberName;
35+
import com.oracle.svm.core.jdk.JDK19OrLater;
36+
import com.oracle.svm.util.ReflectionUtil;
3237

3338
@TargetClass(className = "java.lang.invoke.LambdaForm")
3439
public final class Target_java_lang_invoke_LambdaForm {
3540

3641
@Alias @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Reset)//
3742
Target_java_lang_invoke_MemberName vmentry;
3843

44+
@TargetElement(onlyWith = JDK19OrLater.class)//
45+
@Alias @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Custom, declClass = LambdaFormCacheTransformer.class)//
46+
volatile Object transformCache;
47+
3948
@Alias
4049
native String lambdaName();
4150

@@ -64,6 +73,19 @@ private boolean forceInterpretation() {
6473
native Object interpretWithArguments(Object... argumentValues) throws Throwable;
6574
}
6675

76+
final class LambdaFormCacheTransformer implements FieldValueTransformer {
77+
78+
@Override
79+
public Object transform(Object receiver, Object originalValue) {
80+
Class<?> lambdaFormClass = ReflectionUtil.lookupClass(false, "java.lang.invoke.LambdaForm");
81+
if (lambdaFormClass.isInstance(originalValue)) {
82+
// Stores the original LambdaForm for a customized one.
83+
return originalValue;
84+
}
85+
return null;
86+
}
87+
}
88+
6789
@TargetClass(className = "java.lang.invoke.LambdaForm", innerClass = "NamedFunction")
6890
final class Target_java_lang_invoke_LambdaForm_NamedFunction {
6991
@Alias

0 commit comments

Comments
 (0)