Skip to content

Commit 16df728

Browse files
committed
Introduce LambdaCapturingTypeBuildItem
1 parent 15180ec commit 16df728

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.quarkus.deployment.builditem.nativeimage;
2+
3+
import io.quarkus.builder.item.MultiBuildItem;
4+
5+
/**
6+
* Used to register a lambda capturing type in native mode
7+
*/
8+
public final class LambdaCapturingTypeBuildItem extends MultiBuildItem {
9+
10+
private final String className;
11+
12+
public LambdaCapturingTypeBuildItem(Class<?> lambdaCapturingType) {
13+
this.className = lambdaCapturingType.getName();
14+
}
15+
16+
public LambdaCapturingTypeBuildItem(String className) {
17+
this.className = className;
18+
}
19+
20+
public String getClassName() {
21+
return className;
22+
}
23+
}

core/deployment/src/main/java/io/quarkus/deployment/steps/NativeImageAutoFeatureStep.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import io.quarkus.deployment.builditem.GeneratedResourceBuildItem;
2929
import io.quarkus.deployment.builditem.nativeimage.ForceNonWeakReflectiveClassBuildItem;
3030
import io.quarkus.deployment.builditem.nativeimage.JniRuntimeAccessBuildItem;
31+
import io.quarkus.deployment.builditem.nativeimage.LambdaCapturingTypeBuildItem;
3132
import io.quarkus.deployment.builditem.nativeimage.NativeImageProxyDefinitionBuildItem;
3233
import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
3334
import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBundleBuildItem;
@@ -72,6 +73,17 @@ public class NativeImageAutoFeatureStep {
7273
private static final MethodDescriptor RERUN_INITIALIZATION = ofMethod(
7374
"org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport",
7475
"rerunInitialization", void.class, Class.class, String.class);
76+
77+
private static final MethodDescriptor CONFIGURATION_ALWAYS_TRUE = ofMethod(
78+
"org.graalvm.nativeimage.impl.ConfigurationCondition",
79+
"alwaysTrue", "org.graalvm.nativeimage.impl.ConfigurationCondition");
80+
81+
private static final MethodDescriptor REGISTER_LAMBDA_CAPTURING_CLASS = ofMethod(
82+
"org.graalvm.nativeimage.impl.RuntimeSerializationSupport",
83+
"registerLambdaCapturingClass", void.class,
84+
"org.graalvm.nativeimage.impl.ConfigurationCondition",
85+
String.class);
86+
7587
private static final MethodDescriptor LOOKUP_METHOD = ofMethod(
7688
"com.oracle.svm.util.ReflectionUtil",
7789
"lookupMethod", Method.class, Class.class, String.class, Class[].class);
@@ -120,7 +132,8 @@ void generateFeature(BuildProducer<GeneratedNativeImageClassBuildItem> nativeIma
120132
List<ForceNonWeakReflectiveClassBuildItem> nonWeakReflectiveClassBuildItems,
121133
List<ServiceProviderBuildItem> serviceProviderBuildItems,
122134
List<UnsafeAccessedFieldBuildItem> unsafeAccessedFields,
123-
List<JniRuntimeAccessBuildItem> jniRuntimeAccessibleClasses) {
135+
List<JniRuntimeAccessBuildItem> jniRuntimeAccessibleClasses,
136+
List<LambdaCapturingTypeBuildItem> lambdaCapturingTypeBuildItems) {
124137
ClassCreator file = new ClassCreator(new ClassOutput() {
125138
@Override
126139
public void write(String s, byte[] bytes) {
@@ -299,6 +312,18 @@ public void write(String s, byte[] bytes) {
299312
overallCatch.load(i.serviceDescriptorFile()));
300313
}
301314

315+
// Register Lambda Capturing Types
316+
if (!lambdaCapturingTypeBuildItems.isEmpty()) {
317+
ResultHandle runtimeSerializationSupportSingleton = overallCatch.invokeStaticMethod(IMAGE_SINGLETONS_LOOKUP,
318+
overallCatch.loadClassFromTCCL("org.graalvm.nativeimage.impl.RuntimeSerializationSupport"));
319+
ResultHandle configAlwaysTrue = overallCatch.invokeStaticMethod(CONFIGURATION_ALWAYS_TRUE);
320+
for (LambdaCapturingTypeBuildItem i : lambdaCapturingTypeBuildItems) {
321+
overallCatch.invokeInterfaceMethod(REGISTER_LAMBDA_CAPTURING_CLASS, runtimeSerializationSupportSingleton,
322+
configAlwaysTrue,
323+
overallCatch.load(i.getClassName()));
324+
}
325+
}
326+
302327
if (!resourceBundles.isEmpty()) {
303328
AssignableResultHandle registerMethod = overallCatch.createVariable(Method.class);
304329
AssignableResultHandle locClass = overallCatch.createVariable(Class.class);

0 commit comments

Comments
 (0)