Skip to content

Commit 5b039c4

Browse files
committed
[GR-40450] Reset LambdaForm transform cache
PullRequest: graal/12477
2 parents ab8c949 + e6d57ae commit 5b039c4

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,24 @@
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;
3133
import com.oracle.svm.core.invoke.Target_java_lang_invoke_MemberName;
34+
import com.oracle.svm.util.ReflectionUtil;
3235

3336
@TargetClass(className = "java.lang.invoke.LambdaForm")
3437
public final class Target_java_lang_invoke_LambdaForm {
3538

3639
@Alias @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Reset)//
3740
Target_java_lang_invoke_MemberName vmentry;
3841

42+
@Alias @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Custom, declClass = LambdaFormCacheTransformer.class)//
43+
volatile Object transformCache;
44+
3945
@Alias
4046
native String lambdaName();
4147

@@ -64,6 +70,19 @@ private boolean forceInterpretation() {
6470
native Object interpretWithArguments(Object... argumentValues) throws Throwable;
6571
}
6672

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

0 commit comments

Comments
 (0)