Skip to content

Commit fc4d873

Browse files
committed
Distinguish between declared and non-declared fields.
1 parent 5704b56 commit fc4d873

File tree

5 files changed

+130
-137
lines changed

5 files changed

+130
-137
lines changed

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotObjectConstantImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public JavaConstant readFieldValue(HotSpotResolvedJavaField field) {
206206
if (field.isStatic()) {
207207
return null;
208208
}
209-
HotSpotResolvedObjectTypeImpl declaringClass = (HotSpotResolvedObjectTypeImpl) field.getContainerClass();
209+
HotSpotResolvedObjectTypeImpl declaringClass = (HotSpotResolvedObjectTypeImpl) field.getOriginalHolder();
210210
char typeChar = field.getType().getJavaKind().getTypeChar();
211211
return runtime().compilerToVm.readFieldValue(this, declaringClass, field.getOffset(), typeChar, declaringClass != field.getDeclaringClass());
212212
}

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotResolvedJavaFieldImpl.java

Lines changed: 32 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import static jdk.vm.ci.hotspot.UnsafeAccess.UNSAFE;
3333

3434
import java.lang.annotation.Annotation;
35-
import java.util.Collections;
3635
import java.util.List;
3736

3837
import 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

Comments
 (0)