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
@@ -206,12 +207,14 @@ private final class RuntimeForeignAccessSupportImpl extends ConditionalConfigura
206207
207208 private final Lookup implLookup = ReflectionUtil .readStaticField (MethodHandles .Lookup .class , "IMPL_LOOKUP" );
208209
209- private final AnalysisMetaAccess analysisMetaAccess ;
210- private final AnalysisUniverse universe ;
210+ private AnalysisMetaAccess analysisMetaAccess ;
211211
212- RuntimeForeignAccessSupportImpl (AnalysisMetaAccess analysisMetaAccess , AnalysisUniverse analysisUniverse ) {
213- this .analysisMetaAccess = analysisMetaAccess ;
214- this .universe = analysisUniverse ;
212+ RuntimeForeignAccessSupportImpl () {
213+ }
214+
215+ void duringSetup (AnalysisMetaAccess metaAccess , AnalysisUniverse analysisUniverse ) {
216+ this .analysisMetaAccess = metaAccess ;
217+ setUniverse (analysisUniverse );
215218 }
216219
217220 @ Override
@@ -220,7 +223,7 @@ public void registerForDowncall(ConfigurationCondition condition, FunctionDescri
220223 try {
221224 LinkerOptions linkerOptions = LinkerOptions .forDowncall (desc , options );
222225 SharedDesc sharedDesc = new SharedDesc (desc , linkerOptions );
223- registerConditionalConfiguration (condition , _ -> universe . getBigbang (). postTask ( _ -> createStub (DowncallStubFactory .INSTANCE , sharedDesc ) ));
226+ runConditionalTask (condition , _ -> createStub (DowncallStubFactory .INSTANCE , sharedDesc ));
224227 } catch (IllegalArgumentException e ) {
225228 throw UserError .abort (e , "Could not register downcall" );
226229 }
@@ -232,7 +235,7 @@ public void registerForUpcall(ConfigurationCondition condition, FunctionDescript
232235 try {
233236 LinkerOptions linkerOptions = LinkerOptions .forUpcall (desc , options );
234237 SharedDesc sharedDesc = new SharedDesc (desc , linkerOptions );
235- registerConditionalConfiguration (condition , _ -> universe . getBigbang (). postTask ( _ -> createStub (UpcallStubFactory .INSTANCE , sharedDesc ) ));
238+ runConditionalTask (condition , _ -> createStub (UpcallStubFactory .INSTANCE , sharedDesc ));
236239 } catch (IllegalArgumentException e ) {
237240 throw UserError .abort (e , "Could not register upcall" );
238241 }
@@ -256,11 +259,11 @@ public void registerForDirectUpcall(ConfigurationCondition condition, MethodHand
256259 try {
257260 LinkerOptions linkerOptions = LinkerOptions .forUpcall (desc , options );
258261 DirectUpcallDesc directUpcallDesc = new DirectUpcallDesc (target , directMethodHandleDesc , desc , linkerOptions );
259- registerConditionalConfiguration (condition , _ -> universe . getBigbang (). postTask ( _ -> {
260- RuntimeReflection . register (method );
262+ runConditionalTask (condition , _ -> {
263+ ImageSingletons . lookup ( RuntimeReflectionSupport . class ). register (ConfigurationCondition . alwaysTrue (), false , method );
261264 createStub (UpcallStubFactory .INSTANCE , directUpcallDesc .toSharedDesc ());
262265 createStub (DirectUpcallStubFactory .INSTANCE , directUpcallDesc );
263- })) ;
266+ });
264267 } catch (IllegalArgumentException e ) {
265268 throw UserError .abort (e , "Could not register direct upcall" );
266269 }
@@ -383,7 +386,8 @@ public boolean isInConfiguration(IsInConfigurationAccess access) {
383386 public void afterRegistration (AfterRegistrationAccess access ) {
384387 abiUtils = AbiUtils .create ();
385388 foreignFunctionsRuntime = new ForeignFunctionsRuntime (abiUtils );
386-
389+ accessSupport = new RuntimeForeignAccessSupportImpl ();
390+ ImageSingletons .add (RuntimeForeignAccessSupport .class , accessSupport );
387391 ImageSingletons .add (AbiUtils .class , abiUtils );
388392 ImageSingletons .add (ForeignSupport .class , foreignFunctionsRuntime );
389393 ImageSingletons .add (ForeignFunctionsRuntime .class , foreignFunctionsRuntime );
@@ -392,8 +396,7 @@ public void afterRegistration(AfterRegistrationAccess access) {
392396 @ Override
393397 public void duringSetup (DuringSetupAccess a ) {
394398 var access = (FeatureImpl .DuringSetupAccessImpl ) a ;
395- accessSupport = new RuntimeForeignAccessSupportImpl (access .getMetaAccess (), access .getUniverse ());
396- ImageSingletons .add (RuntimeForeignAccessSupport .class , accessSupport );
399+ accessSupport .duringSetup (access .getMetaAccess (), access .getUniverse ());
397400 if (SubstrateOptions .isSharedArenaSupportEnabled ()) {
398401 ImageSingletons .add (SharedArenaSupport .class , new SharedArenaSupportImpl ());
399402 }
0 commit comments