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