3232import static jdk .vm .ci .hotspot .UnsafeAccess .UNSAFE ;
3333
3434import java .lang .annotation .Annotation ;
35- import java .util .Collections ;
3635import java .util .List ;
3736
3837import jdk .internal .vm .VMSupport ;
@@ -45,7 +44,7 @@ class HotSpotResolvedJavaFieldImpl implements HotSpotResolvedJavaField {
4544
4645 private final HotSpotResolvedObjectTypeImpl holder ;
4746
48- private HotSpotResolvedObjectTypeImpl containerClass ;
47+ private HotSpotResolvedObjectTypeImpl originalHolder ;
4948
5049 private JavaType type ;
5150
@@ -79,6 +78,28 @@ class HotSpotResolvedJavaFieldImpl implements HotSpotResolvedJavaField {
7978 this .index = index ;
8079 }
8180
81+ // Special copy constructor used to flatten inline type fields by
82+ // copying the fields of the inline type to a new holder klass.
83+ HotSpotResolvedJavaFieldImpl (HotSpotResolvedJavaFieldImpl declaredField , HotSpotResolvedJavaFieldImpl subField ) {
84+ this .holder = declaredField .holder ;
85+ this .originalHolder = subField .getOriginalHolder ();
86+ this .type = subField .type ;
87+ this .offset = declaredField .offset + (subField .offset - ((HotSpotResolvedObjectType ) declaredField .getType ()).payloadOffset ());
88+ this .classfileFlags = declaredField .classfileFlags ;
89+ this .internalFlags = declaredField .internalFlags ;
90+ this .index = declaredField .index ;
91+ }
92+
93+ // Constructor for a null marker
94+ HotSpotResolvedJavaFieldImpl (HotSpotResolvedJavaFieldImpl declaredField ) {
95+ this .holder = declaredField .holder ;
96+ this .type = HotSpotResolvedPrimitiveType .forKind (JavaKind .Boolean );
97+ this .offset = declaredField .getNullMarkerOffset ();
98+ this .classfileFlags = declaredField .classfileFlags ;
99+ this .internalFlags = declaredField .internalFlags ;
100+ this .index = declaredField .index ;
101+ }
102+
82103 @ Override
83104 public boolean equals (Object obj ) {
84105 if (this == obj ) {
@@ -88,7 +109,7 @@ public boolean equals(Object obj) {
88109 HotSpotResolvedJavaFieldImpl that = (HotSpotResolvedJavaFieldImpl ) obj ;
89110 if (that .offset != this .offset || that .isStatic () != this .isStatic ()) {
90111 return false ;
91- } else if (this .holder .equals (that .holder ) && this .getContainerClass ().equals (that .getContainerClass ())) {
112+ } else if (this .holder .equals (that .holder ) && this .getOriginalHolder ().equals (that .getOriginalHolder ())) {
92113 return true ;
93114 }
94115 }
@@ -134,28 +155,6 @@ public int getNullMarkerOffset() {
134155 return holder .getFieldInfo (index ).getNullMarkerOffset ();
135156 }
136157
137- @ Override
138- public HotSpotResolvedJavaField getNullMarkerField () {
139- HotSpotResolvedJavaType byteType = HotSpotResolvedPrimitiveType .forKind (JavaKind .Byte );
140- return new HotSpotResolvedJavaFieldImpl (holder , byteType , getNullMarkerOffset (), 0 , 0 , -1 ) {
141- @ Override
142- public String getName () {
143- return "nullMarkerOffset" ;
144- }
145-
146- @ Override
147- public int getNullMarkerOffset () {
148- return -1 ;
149- }
150-
151- @ Override
152- public JavaConstant getConstantValue () {
153- return null ;
154- }
155- };
156- //return new HotSpotResolvedJavaFieldImpl(holder, byteType, getNullMarkerOffset(), 0, 0, -1);
157- }
158-
159158 /**
160159 * Determines if a given object contains this field.
161160 *
@@ -177,23 +176,16 @@ public HotSpotResolvedObjectTypeImpl getDeclaringClass() {
177176 }
178177
179178 @ Override
180- public HotSpotResolvedObjectTypeImpl getContainerClass () {
181- if (containerClass == null ) {
179+ public HotSpotResolvedObjectTypeImpl getOriginalHolder () {
180+ if (originalHolder == null ) {
182181 return holder ;
183182 }
184- return containerClass ;
185- }
186-
187- @ Override
188- public ResolvedJavaField setContainerClass (ResolvedJavaType containerClass ) {
189- HotSpotResolvedJavaFieldImpl field = new HotSpotResolvedJavaFieldImpl (holder , type , offset , classfileFlags , internalFlags , index );
190- field .containerClass = (HotSpotResolvedObjectTypeImpl ) containerClass ;
191- return field ;
183+ return originalHolder ;
192184 }
193185
194186 @ Override
195187 public String getName () {
196- return holder .getFieldInfo (index ).getName (holder );
188+ return getOriginalHolder () .getFieldInfo (index ).getName (getOriginalHolder () );
197189 }
198190
199191 @ Override
@@ -204,7 +196,7 @@ public JavaType getType() {
204196 if (currentType instanceof UnresolvedJavaType ) {
205197 // Don't allow unresolved types to hang around forever
206198 UnresolvedJavaType unresolvedType = (UnresolvedJavaType ) currentType ;
207- JavaType resolved = HotSpotJVMCIRuntime .runtime ().lookupType (unresolvedType .getName (), holder , false );
199+ JavaType resolved = HotSpotJVMCIRuntime .runtime ().lookupType (unresolvedType .getName (), getOriginalHolder () , false );
208200 if (resolved instanceof ResolvedJavaType ) {
209201 type = resolved ;
210202 }
@@ -222,11 +214,6 @@ public int getOffset() {
222214 return offset ;
223215 }
224216
225- @ Override
226- public ResolvedJavaField changeOffset (int newOffset ) {
227- return new HotSpotResolvedJavaFieldImpl (holder , type , newOffset , classfileFlags , internalFlags , index );
228- }
229-
230217 /**
231218 * Gets the value of this field's index (i.e. {@code fieldDescriptor::index()} in the encoded
232219 * fields of the declaring class.
@@ -258,7 +245,7 @@ public boolean isStable() {
258245 private boolean hasAnnotations () {
259246 if (!isInternal ()) {
260247 HotSpotVMConfig config = config ();
261- final long metaspaceAnnotations = UNSAFE .getAddress (holder .getKlassPointer () + config .instanceKlassAnnotationsOffset );
248+ final long metaspaceAnnotations = UNSAFE .getAddress (getOriginalHolder () .getKlassPointer () + config .instanceKlassAnnotationsOffset );
262249 if (metaspaceAnnotations != 0 ) {
263250 long fieldsAnnotations = UNSAFE .getAddress (metaspaceAnnotations + config .annotationsFieldAnnotationsOffset );
264251 if (fieldsAnnotations != 0 ) {
@@ -296,7 +283,7 @@ public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
296283
297284 @ Override
298285 public JavaConstant getConstantValue () {
299- return holder .getFieldInfo (index ).getConstantValue (holder );
286+ return getOriginalHolder () .getFieldInfo (index ).getConstantValue (getOriginalHolder () );
300287 }
301288
302289 @ Override
@@ -320,7 +307,7 @@ public List<AnnotationData> getAnnotationData(ResolvedJavaType type1, ResolvedJa
320307 }
321308
322309 private List <AnnotationData > getAnnotationData0 (ResolvedJavaType ... filter ) {
323- byte [] encoded = compilerToVM ().getEncodedFieldAnnotationData (holder , index , filter );
310+ byte [] encoded = compilerToVM ().getEncodedFieldAnnotationData (getOriginalHolder () , index , filter );
324311 return VMSupport .decodeAnnotations (encoded , AnnotationDataDecoder .INSTANCE );
325312 }
326313}
0 commit comments