@@ -410,50 +410,58 @@ public void registerConstructorLookup(ConfigurationCondition condition, Class<?>
410410 @ Override
411411 public void register (ConfigurationCondition condition , boolean finalIsWritable , Field ... fields ) {
412412 checkNotSealed ();
413- registerInternal (condition , fields );
413+ registerInternal (condition , false , fields );
414414 }
415415
416- private void registerInternal (ConfigurationCondition condition , Field ... fields ) {
416+ private void registerInternal (ConfigurationCondition condition , boolean queriedOnly , Field ... fields ) {
417417 register (analysisUniverse -> registerConditionalConfiguration (condition , () -> {
418418 for (Field field : fields ) {
419- analysisUniverse .getBigbang ().postTask (debug -> registerField (field ));
419+ analysisUniverse .getBigbang ().postTask (debug -> registerField (queriedOnly , field ));
420420 }
421421 }));
422422 }
423423
424424 @ Override
425425 public void registerAllFieldsQuery (ConfigurationCondition condition , Class <?> clazz ) {
426+ registerAllFieldsQuery (condition , false , clazz );
427+ }
428+
429+ public void registerAllFieldsQuery (ConfigurationCondition condition , boolean queriedOnly , Class <?> clazz ) {
426430 checkNotSealed ();
427431 for (Class <?> current = clazz ; current != null ; current = current .getSuperclass ()) {
428432 final Class <?> currentLambda = current ;
429433 registerConditionalConfiguration (condition , () -> setQueryFlag (currentLambda , ALL_FIELDS_FLAG ));
430434 }
431435 try {
432- registerInternal (condition , clazz .getFields ());
436+ registerInternal (condition , queriedOnly , clazz .getFields ());
433437 } catch (LinkageError e ) {
434438 /* Ignore the error */
435439 }
436440 }
437441
438442 @ Override
439443 public void registerAllDeclaredFieldsQuery (ConfigurationCondition condition , Class <?> clazz ) {
444+ registerAllDeclaredFieldsQuery (condition , false , clazz );
445+ }
446+
447+ public void registerAllDeclaredFieldsQuery (ConfigurationCondition condition , boolean queriedOnly , Class <?> clazz ) {
440448 checkNotSealed ();
441449 registerConditionalConfiguration (condition , () -> setQueryFlag (clazz , ALL_DECLARED_FIELDS_FLAG ));
442450 try {
443- registerInternal (condition , clazz .getDeclaredFields ());
451+ registerInternal (condition , queriedOnly , clazz .getDeclaredFields ());
444452 } catch (LinkageError e ) {
445453 /* Ignore the error */
446454 }
447455 }
448456
449- private void registerField (Field reflectField ) {
457+ private void registerField (boolean queriedOnly , Field reflectField ) {
450458 if (SubstitutionReflectivityFilter .shouldExclude (reflectField , metaAccess , universe )) {
451459 return ;
452460 }
453461
454462 AnalysisField analysisField = metaAccess .lookupJavaField (reflectField );
455463 if (registeredFields .put (analysisField , reflectField ) == null ) {
456- registerTypesForField (analysisField , reflectField );
464+ registerTypesForField (analysisField , reflectField , true );
457465 AnalysisType declaringClass = analysisField .getDeclaringClass ();
458466
459467 /*
@@ -468,13 +476,21 @@ private void registerField(Field reflectField) {
468476 processAnnotationField (reflectField );
469477 }
470478 }
479+
480+ /*
481+ * We need to run this even if the method has already been registered, in case it was only
482+ * registered as queried.
483+ */
484+ if (!queriedOnly ) {
485+ registerTypesForField (analysisField , reflectField , false );
486+ }
471487 }
472488
473489 @ Override
474490 public void registerFieldLookup (ConfigurationCondition condition , Class <?> declaringClass , String fieldName ) {
475491 checkNotSealed ();
476492 try {
477- registerInternal (condition , declaringClass .getDeclaredField (fieldName ));
493+ registerInternal (condition , false , declaringClass .getDeclaredField (fieldName ));
478494 } catch (NoSuchFieldException e ) {
479495 registerConditionalConfiguration (condition , () -> negativeFieldLookups .computeIfAbsent (metaAccess .lookupJavaType (declaringClass ), (key ) -> ConcurrentHashMap .newKeySet ()).add (fieldName ));
480496 }
@@ -641,13 +657,15 @@ private Object[] getEnclosingMethodInfo(Class<?> clazz) {
641657 }
642658 }
643659
644- private void registerTypesForField (AnalysisField analysisField , Field reflectField ) {
645- /*
646- * Reflection accessors use Unsafe, so ensure that all reflectively accessible fields are
647- * registered as unsafe-accessible, whether they have been explicitly registered or their
648- * Field object is reachable in the image heap.
649- */
650- analysisField .registerAsUnsafeAccessed ("is registered for reflection." );
660+ private void registerTypesForField (AnalysisField analysisField , Field reflectField , boolean queriedOnly ) {
661+ if (!queriedOnly ) {
662+ /*
663+ * Reflection accessors use Unsafe, so ensure that all reflectively accessible fields
664+ * are registered as unsafe-accessible, whether they have been explicitly registered or
665+ * their Field object is reachable in the image heap.
666+ */
667+ analysisField .registerAsUnsafeAccessed ("is registered for reflection." );
668+ }
651669
652670 /*
653671 * The generic signature is parsed at run time, so we need to make all the types necessary
@@ -992,7 +1010,7 @@ public void registerHeapReflectionField(Field reflectField, ScanReason reason) {
9921010 assert !sealed ;
9931011 AnalysisField analysisField = metaAccess .lookupJavaField (reflectField );
9941012 if (heapFields .put (analysisField , reflectField ) == null && !SubstitutionReflectivityFilter .shouldExclude (reflectField , metaAccess , universe )) {
995- registerTypesForField (analysisField , reflectField );
1013+ registerTypesForField (analysisField , reflectField , false );
9961014 if (analysisField .getDeclaringClass ().isAnnotation ()) {
9971015 processAnnotationField (reflectField );
9981016 }
0 commit comments