@@ -1170,64 +1170,93 @@ public ResolvedJavaField findInstanceFieldWithOffset(long offset, JavaKind expec
1170
1170
*/
1171
1171
private volatile ResolvedJavaField [] instanceFieldsWithSuper ;
1172
1172
private volatile ResolvedJavaField [] instanceFieldsWithoutSuper ;
1173
+ private volatile ResolvedJavaField [] staticFields ;
1173
1174
1174
1175
/**
1175
- * Note that although this returns a ResolvedJavaField[], all instance fields are of type
1176
- * AnalysisField and can be cast to AnalysisField without problem.
1176
+ * Note that although this returns a {@code ResolvedJavaField[]} , all instance fields are of
1177
+ * type {@link AnalysisField} and can be cast to AnalysisField without problem.
1177
1178
*/
1178
1179
@ Override
1179
1180
public ResolvedJavaField [] getInstanceFields (boolean includeSuperclasses ) {
1180
- ResolvedJavaField [] result = includeSuperclasses ? instanceFieldsWithSuper : instanceFieldsWithoutSuper ;
1181
- if (result != null ) {
1182
- return result ;
1183
- } else {
1184
- return initializeInstanceFields (includeSuperclasses );
1181
+ return includeSuperclasses ? getInstanceFieldsWithSuper () : getInstanceFieldsWithoutSuper ();
1182
+ }
1183
+
1184
+ private ResolvedJavaField [] getInstanceFieldsWithoutSuper () {
1185
+ if (instanceFieldsWithoutSuper == null ) {
1186
+ if (isArray () || isInterface () || isPrimitive ()) {
1187
+ instanceFieldsWithoutSuper = AnalysisField .EMPTY_ARRAY ;
1188
+ } else {
1189
+ instanceFieldsWithoutSuper = convertFields (wrapped .getInstanceFields (false ), false );
1190
+ }
1185
1191
}
1192
+ return instanceFieldsWithoutSuper ;
1186
1193
}
1187
1194
1188
- private ResolvedJavaField [] initializeInstanceFields (boolean includeSuperclasses ) {
1189
- List <ResolvedJavaField > list = new ArrayList <>();
1190
- if (includeSuperclasses && getSuperclass () != null ) {
1191
- list .addAll (Arrays .asList (getSuperclass ().getInstanceFields (true )));
1195
+ private ResolvedJavaField [] getInstanceFieldsWithSuper () {
1196
+ if (instanceFieldsWithSuper == null ) {
1197
+ if (isArray () || isInterface () || isPrimitive ()) {
1198
+ instanceFieldsWithSuper = AnalysisField .EMPTY_ARRAY ;
1199
+ } else {
1200
+ ResolvedJavaField [] instanceFields = getInstanceFieldsWithoutSuper ();
1201
+ if (getSuperclass () == null ) {
1202
+ instanceFieldsWithSuper = instanceFields ;
1203
+ } else {
1204
+ ResolvedJavaField [] superInstanceFields = getSuperclass ().getInstanceFields (true );
1205
+ ResolvedJavaField [] result = Arrays .copyOf (superInstanceFields , superInstanceFields .length + instanceFields .length );
1206
+ System .arraycopy (instanceFields , 0 , result , superInstanceFields .length , instanceFields .length );
1207
+ for (int index = 0 ; index < instanceFields .length ; ++index ) {
1208
+ ((AnalysisField ) instanceFields [index ]).setPosition (superInstanceFields .length + index );
1209
+ }
1210
+ instanceFieldsWithSuper = result ;
1211
+ }
1212
+ }
1192
1213
}
1193
- ResolvedJavaField [] result = convertFields (wrapped .getInstanceFields (false ), list , includeSuperclasses );
1194
- if (includeSuperclasses ) {
1195
- instanceFieldsWithSuper = result ;
1196
- } else {
1197
- instanceFieldsWithoutSuper = result ;
1214
+ return instanceFieldsWithSuper ;
1215
+ }
1216
+
1217
+ /**
1218
+ * Note that although this returns a ResolvedJavaField[], all instance fields are of type
1219
+ * AnalysisField and can be cast to AnalysisField without problem.
1220
+ */
1221
+ @ Override
1222
+ public ResolvedJavaField [] getStaticFields () {
1223
+ if (staticFields == null ) {
1224
+ if (isArray () || isPrimitive ()) {
1225
+ staticFields = AnalysisField .EMPTY_ARRAY ;
1226
+ } else {
1227
+ staticFields = convertFields (wrapped .getStaticFields (), true );
1228
+ }
1198
1229
}
1199
- return result ;
1230
+ return staticFields ;
1200
1231
}
1201
1232
1202
- private ResolvedJavaField [] convertFields (ResolvedJavaField [] originals , List <ResolvedJavaField > list , boolean listIncludesSuperClassesFields ) {
1233
+ /**
1234
+ * Converts the given array of hosted {@link ResolvedJavaField}s into an array of
1235
+ * {@link AnalysisField}s. The resulting array is compact and contains only convertible fields,
1236
+ * i.e., if looking up the field in the {@link AnalysisUniverse} is not supported then the field
1237
+ * is skipped.
1238
+ */
1239
+ private ResolvedJavaField [] convertFields (ResolvedJavaField [] originals , boolean setPosition ) {
1240
+ ResolvedJavaField [] result = new ResolvedJavaField [originals .length ];
1241
+ int index = 0 ;
1203
1242
for (ResolvedJavaField original : originals ) {
1204
1243
if (!original .isInternal () && universe .hostVM .platformSupported (original )) {
1205
1244
try {
1206
- AnalysisField aField = universe .lookup (original );
1207
- if (aField != null ) {
1208
- if (listIncludesSuperClassesFields || aField .isStatic ()) {
1209
- /*
1210
- * If the list includes the super classes fields, register the position.
1211
- */
1212
- aField .setPosition (list .size ());
1245
+ AnalysisField field = universe .lookup (original );
1246
+ if (field != null ) {
1247
+ if (setPosition ) {
1248
+ field .setPosition (index );
1213
1249
}
1214
- list . add ( aField ) ;
1250
+ result [ index ++] = field ;
1215
1251
}
1216
1252
} catch (UnsupportedFeatureException ex ) {
1217
1253
// Ignore deleted fields and fields of deleted types.
1218
1254
}
1219
1255
}
1220
1256
}
1221
- return list .toArray (new ResolvedJavaField [list .size ()]);
1222
- }
1223
1257
1224
- /**
1225
- * Note that although this returns a ResolvedJavaField[], all instance fields are of type
1226
- * AnalysisField and can be casted to AnalysisField without problem.
1227
- */
1228
- @ Override
1229
- public ResolvedJavaField [] getStaticFields () {
1230
- return convertFields (wrapped .getStaticFields (), new ArrayList <>(), false );
1258
+ // Trim array if some fields could not be converted.
1259
+ return index == result .length ? result : Arrays .copyOf (result , index );
1231
1260
}
1232
1261
1233
1262
@ Override
0 commit comments