|
28 | 28 | import io.quarkus.deployment.builditem.GeneratedResourceBuildItem; |
29 | 29 | import io.quarkus.deployment.builditem.nativeimage.ForceNonWeakReflectiveClassBuildItem; |
30 | 30 | import io.quarkus.deployment.builditem.nativeimage.JniRuntimeAccessBuildItem; |
| 31 | +import io.quarkus.deployment.builditem.nativeimage.LambdaCapturingTypeBuildItem; |
31 | 32 | import io.quarkus.deployment.builditem.nativeimage.NativeImageProxyDefinitionBuildItem; |
32 | 33 | import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem; |
33 | 34 | import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBundleBuildItem; |
@@ -72,6 +73,17 @@ public class NativeImageAutoFeatureStep { |
72 | 73 | private static final MethodDescriptor RERUN_INITIALIZATION = ofMethod( |
73 | 74 | "org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport", |
74 | 75 | "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 | + |
75 | 87 | private static final MethodDescriptor LOOKUP_METHOD = ofMethod( |
76 | 88 | "com.oracle.svm.util.ReflectionUtil", |
77 | 89 | "lookupMethod", Method.class, Class.class, String.class, Class[].class); |
@@ -120,7 +132,8 @@ void generateFeature(BuildProducer<GeneratedNativeImageClassBuildItem> nativeIma |
120 | 132 | List<ForceNonWeakReflectiveClassBuildItem> nonWeakReflectiveClassBuildItems, |
121 | 133 | List<ServiceProviderBuildItem> serviceProviderBuildItems, |
122 | 134 | List<UnsafeAccessedFieldBuildItem> unsafeAccessedFields, |
123 | | - List<JniRuntimeAccessBuildItem> jniRuntimeAccessibleClasses) { |
| 135 | + List<JniRuntimeAccessBuildItem> jniRuntimeAccessibleClasses, |
| 136 | + List<LambdaCapturingTypeBuildItem> lambdaCapturingTypeBuildItems) { |
124 | 137 | ClassCreator file = new ClassCreator(new ClassOutput() { |
125 | 138 | @Override |
126 | 139 | public void write(String s, byte[] bytes) { |
@@ -299,6 +312,18 @@ public void write(String s, byte[] bytes) { |
299 | 312 | overallCatch.load(i.serviceDescriptorFile())); |
300 | 313 | } |
301 | 314 |
|
| 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 | + |
302 | 327 | if (!resourceBundles.isEmpty()) { |
303 | 328 | AssignableResultHandle registerMethod = overallCatch.createVariable(Method.class); |
304 | 329 | AssignableResultHandle locClass = overallCatch.createVariable(Class.class); |
|
0 commit comments