5959import org .graalvm .nativeimage .hosted .RuntimeReflection ;
6060import org .graalvm .nativeimage .impl .ConfigurationCondition ;
6161import org .graalvm .nativeimage .impl .RuntimeForeignAccessSupport ;
62+ import org .graalvm .nativeimage .impl .RuntimeReflectionSupport ;
6263import org .graalvm .word .Pointer ;
6364import org .graalvm .word .UnsignedWord ;
6465
@@ -208,12 +209,14 @@ private final class RuntimeForeignAccessSupportImpl extends ConditionalConfigura
208209
209210 private final Lookup implLookup = ReflectionUtil .readStaticField (MethodHandles .Lookup .class , "IMPL_LOOKUP" );
210211
211- private final AnalysisMetaAccess analysisMetaAccess ;
212- private final AnalysisUniverse universe ;
212+ private AnalysisMetaAccess analysisMetaAccess ;
213213
214- RuntimeForeignAccessSupportImpl (AnalysisMetaAccess analysisMetaAccess , AnalysisUniverse analysisUniverse ) {
215- this .analysisMetaAccess = analysisMetaAccess ;
216- this .universe = analysisUniverse ;
214+ RuntimeForeignAccessSupportImpl () {
215+ }
216+
217+ void duringSetup (AnalysisMetaAccess metaAccess , AnalysisUniverse analysisUniverse ) {
218+ this .analysisMetaAccess = metaAccess ;
219+ setUniverse (analysisUniverse );
217220 }
218221
219222 @ Override
@@ -222,7 +225,7 @@ public void registerForDowncall(ConfigurationCondition condition, FunctionDescri
222225 try {
223226 LinkerOptions linkerOptions = LinkerOptions .forDowncall (desc , options );
224227 SharedDesc sharedDesc = new SharedDesc (desc , linkerOptions );
225- registerConditionalConfiguration (condition , _ -> universe . getBigbang (). postTask ( _ -> createStub (DowncallStubFactory .INSTANCE , sharedDesc ) ));
228+ runConditionalTask (condition , _ -> createStub (DowncallStubFactory .INSTANCE , sharedDesc ));
226229 } catch (IllegalArgumentException e ) {
227230 throw UserError .abort (e , "Could not register downcall" );
228231 }
@@ -234,7 +237,7 @@ public void registerForUpcall(ConfigurationCondition condition, FunctionDescript
234237 try {
235238 LinkerOptions linkerOptions = LinkerOptions .forUpcall (desc , options );
236239 SharedDesc sharedDesc = new SharedDesc (desc , linkerOptions );
237- registerConditionalConfiguration (condition , _ -> universe . getBigbang (). postTask ( _ -> createStub (UpcallStubFactory .INSTANCE , sharedDesc ) ));
240+ runConditionalTask (condition , _ -> createStub (UpcallStubFactory .INSTANCE , sharedDesc ));
238241 } catch (IllegalArgumentException e ) {
239242 throw UserError .abort (e , "Could not register upcall" );
240243 }
@@ -258,11 +261,11 @@ public void registerForDirectUpcall(ConfigurationCondition condition, MethodHand
258261 try {
259262 LinkerOptions linkerOptions = LinkerOptions .forUpcall (desc , options );
260263 DirectUpcallDesc directUpcallDesc = new DirectUpcallDesc (target , directMethodHandleDesc , desc , linkerOptions );
261- registerConditionalConfiguration (condition , _ -> universe . getBigbang (). postTask ( _ -> {
262- RuntimeReflection . register (method );
264+ runConditionalTask (condition , _ -> {
265+ ImageSingletons . lookup ( RuntimeReflectionSupport . class ). register (ConfigurationCondition . alwaysTrue (), false , method );
263266 createStub (UpcallStubFactory .INSTANCE , directUpcallDesc .toSharedDesc ());
264267 createStub (DirectUpcallStubFactory .INSTANCE , directUpcallDesc );
265- })) ;
268+ });
266269 } catch (IllegalArgumentException e ) {
267270 throw UserError .abort (e , "Could not register direct upcall" );
268271 }
@@ -385,7 +388,8 @@ public boolean isInConfiguration(IsInConfigurationAccess access) {
385388 public void afterRegistration (AfterRegistrationAccess access ) {
386389 abiUtils = AbiUtils .create ();
387390 foreignFunctionsRuntime = new ForeignFunctionsRuntime (abiUtils );
388-
391+ accessSupport = new RuntimeForeignAccessSupportImpl ();
392+ ImageSingletons .add (RuntimeForeignAccessSupport .class , accessSupport );
389393 ImageSingletons .add (AbiUtils .class , abiUtils );
390394 ImageSingletons .add (ForeignSupport .class , foreignFunctionsRuntime );
391395 ImageSingletons .add (ForeignFunctionsRuntime .class , foreignFunctionsRuntime );
@@ -394,8 +398,7 @@ public void afterRegistration(AfterRegistrationAccess access) {
394398 @ Override
395399 public void duringSetup (DuringSetupAccess a ) {
396400 var access = (FeatureImpl .DuringSetupAccessImpl ) a ;
397- accessSupport = new RuntimeForeignAccessSupportImpl (access .getMetaAccess (), access .getUniverse ());
398- ImageSingletons .add (RuntimeForeignAccessSupport .class , accessSupport );
401+ accessSupport .duringSetup (access .getMetaAccess (), access .getUniverse ());
399402 if (SubstrateOptions .isSharedArenaSupportEnabled ()) {
400403 ImageSingletons .add (SharedArenaSupport .class , new SharedArenaSupportImpl ());
401404 }
0 commit comments