Skip to content

Commit af405bd

Browse files
committed
[GR-71027] Remove ObjectToConstantFieldValueTransformer.
PullRequest: graal/22469
2 parents 24ac023 + dba3f5d commit af405bd

File tree

8 files changed

+90
-85
lines changed

8 files changed

+90
-85
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/StaticFieldsSupport.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
import static jdk.graal.compiler.nodeinfo.NodeSize.SIZE_0;
2929
import static jdk.graal.compiler.nodeinfo.NodeSize.SIZE_1;
3030

31+
import java.lang.reflect.Field;
3132
import java.util.Objects;
32-
import java.util.function.Function;
3333

3434
import org.graalvm.nativeimage.ImageSingletons;
3535
import org.graalvm.nativeimage.Platform;
@@ -97,19 +97,21 @@
9797
public final class StaticFieldsSupport {
9898

9999
@Platforms(Platform.HOSTED_ONLY.class)
100-
public interface HostedStaticFieldSupport {
100+
public abstract static class HostedStaticFieldSupport {
101101

102102
static HostedStaticFieldSupport singleton() {
103103
return ImageSingletons.lookup(HostedStaticFieldSupport.class);
104104
}
105105

106-
JavaConstant getStaticFieldsBaseConstant(int layerNum, boolean primitive, Function<Object, JavaConstant> toConstant);
106+
protected abstract Object getStaticFieldBaseTransformation(int layerNum, boolean primitive);
107107

108-
FloatingNode getStaticFieldsBaseReplacement(int layerNum, boolean primitive, LoweringTool tool, StructuredGraph graph);
108+
protected abstract FloatingNode getStaticFieldsBaseReplacement(int layerNum, boolean primitive, LoweringTool tool, StructuredGraph graph);
109109

110-
boolean isPrimitive(ResolvedJavaField field);
110+
protected abstract boolean isPrimitive(ResolvedJavaField field);
111111

112-
int getInstalledLayerNum(ResolvedJavaField field);
112+
protected abstract int getInstalledLayerNum(ResolvedJavaField field);
113+
114+
protected abstract ResolvedJavaField toResolvedField(Field field);
113115
}
114116

115117
@Platforms(Platform.HOSTED_ONLY.class)
@@ -137,11 +139,17 @@ public static Object getCurrentLayerStaticPrimitiveFields() {
137139
}
138140

139141
@Platforms(Platform.HOSTED_ONLY.class)
140-
public static JavaConstant getStaticFieldsConstant(ResolvedJavaField field, Function<Object, JavaConstant> toConstant) {
142+
public static Object getStaticFieldBaseTransformation(Field field) {
143+
var hostedSupport = HostedStaticFieldSupport.singleton();
144+
return getStaticFieldBaseTransformation(hostedSupport.toResolvedField(field));
145+
}
146+
147+
@Platforms(Platform.HOSTED_ONLY.class)
148+
public static Object getStaticFieldBaseTransformation(ResolvedJavaField field) {
141149
var hostedSupport = HostedStaticFieldSupport.singleton();
142150
boolean primitive = hostedSupport.isPrimitive(field);
143151
int layerNum = getInstalledLayerNum(field);
144-
return hostedSupport.getStaticFieldsBaseConstant(layerNum, primitive, toConstant);
152+
return hostedSupport.getStaticFieldBaseTransformation(layerNum, primitive);
145153
}
146154

147155
public static int getInstalledLayerNum(ResolvedJavaField field) {
Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,14 @@
2424
*/
2525
package com.oracle.svm.core.fieldvaluetransformer;
2626

27-
import java.util.function.Function;
28-
29-
import com.oracle.svm.core.util.VMError;
27+
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
3028

3129
import jdk.vm.ci.meta.JavaConstant;
32-
import jdk.vm.ci.meta.ResolvedJavaField;
3330

3431
/**
35-
* Special field value transformer which, instead of returning an object, returns an
36-
* {@link JavaConstant} of the transformed value.
32+
* Wrapper for allowing a {@link JavaConstant} to be returned by a {@link FieldValueTransformer}.
33+
* When {@link FieldValueTransformer#transform} returns a {@link JavaConstantWrapper}, then the
34+
* constant will be installed "as is" within the image heap.
3735
*/
38-
public interface ObjectToConstantFieldValueTransformer extends FieldValueTransformerWithAvailability {
39-
40-
JavaConstant transformToConstant(ResolvedJavaField field, Object receiver, Object originalValue, Function<Object, JavaConstant> toConstant);
41-
42-
@Override
43-
default Object transform(Object receiver, Object originalValue) {
44-
throw VMError.intentionallyUnimplemented();
45-
}
36+
public record JavaConstantWrapper(JavaConstant constant) {
4637
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/fieldvaluetransformer/StaticFieldBaseFieldValueTransformer.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
package com.oracle.svm.core.fieldvaluetransformer;
2626

2727
import java.lang.reflect.Field;
28-
import java.util.function.Function;
2928

3029
import com.oracle.svm.core.BuildPhaseProvider;
3130
import com.oracle.svm.core.StaticFieldsSupport;
@@ -34,21 +33,20 @@
3433
import jdk.graal.compiler.nodes.ValueNode;
3534
import jdk.graal.compiler.nodes.spi.CoreProviders;
3635
import jdk.vm.ci.meta.JavaConstant;
37-
import jdk.vm.ci.meta.ResolvedJavaField;
3836

3937
/**
4038
* Implements the field value transformation semantics of {@link Kind#StaticFieldBase}.
4139
*/
42-
public record StaticFieldBaseFieldValueTransformer(Field targetField) implements ObjectToConstantFieldValueTransformer {
40+
public record StaticFieldBaseFieldValueTransformer(Field targetField) implements FieldValueTransformerWithAvailability {
4341

4442
@Override
4543
public boolean isAvailable() {
4644
return BuildPhaseProvider.isHostedUniverseBuilt();
4745
}
4846

4947
@Override
50-
public JavaConstant transformToConstant(ResolvedJavaField field, Object receiver, Object originalValue, Function<Object, JavaConstant> toConstant) {
51-
return StaticFieldsSupport.getStaticFieldsConstant(field, toConstant);
48+
public Object transform(Object receiver, Object originalValue) {
49+
return StaticFieldsSupport.getStaticFieldBaseTransformation(targetField);
5250
}
5351

5452
@Override

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/VarHandleSupport.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
*/
2525
package com.oracle.svm.core.jdk;
2626

27-
import java.util.function.Function;
28-
2927
import org.graalvm.nativeimage.ImageSingletons;
3028

3129
import com.oracle.svm.core.BuildPhaseProvider;
@@ -37,7 +35,6 @@
3735
import com.oracle.svm.core.annotate.TargetClass;
3836
import com.oracle.svm.core.classinitialization.EnsureClassInitializedNode;
3937
import com.oracle.svm.core.fieldvaluetransformer.FieldValueTransformerWithAvailability;
40-
import com.oracle.svm.core.fieldvaluetransformer.ObjectToConstantFieldValueTransformer;
4138
import com.oracle.svm.core.graal.nodes.FieldOffsetNode;
4239
import com.oracle.svm.core.util.VMError;
4340

@@ -112,17 +109,18 @@ class VarHandleFieldOffsetAsLongComputer extends VarHandleFieldOffsetComputer {
112109
}
113110
}
114111

115-
class VarHandleStaticBaseComputer implements ObjectToConstantFieldValueTransformer {
112+
class VarHandleStaticBaseComputer implements FieldValueTransformerWithAvailability {
113+
116114
@Override
117115
public boolean isAvailable() {
118116
return BuildPhaseProvider.isHostedUniverseBuilt();
119117
}
120118

121119
@Override
122-
public JavaConstant transformToConstant(ResolvedJavaField field, Object receiver, Object originalValue, Function<Object, JavaConstant> toConstant) {
120+
public Object transform(Object receiver, Object originalValue) {
123121
ResolvedJavaField varHandleField = VarHandleSupport.singleton().findVarHandleField(receiver, false);
124122
StaticFieldsSupport.StaticFieldValidator.checkFieldOffsetAllowed(varHandleField);
125-
return StaticFieldsSupport.getStaticFieldsConstant(varHandleField, toConstant);
123+
return StaticFieldsSupport.getStaticFieldBaseTransformation(varHandleField);
126124
}
127125

128126
@Override

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassLoaderFeature.java

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
package com.oracle.svm.hosted;
2626

2727
import java.util.concurrent.ConcurrentHashMap;
28-
import java.util.function.Function;
28+
29+
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
2930

3031
import com.oracle.graal.pointsto.ObjectScanner.OtherReason;
3132
import com.oracle.graal.pointsto.ObjectScanner.ScanReason;
@@ -34,7 +35,7 @@
3435
import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
3536
import com.oracle.svm.core.feature.InternalFeature;
3637
import com.oracle.svm.core.fieldvaluetransformer.FieldValueTransformerWithAvailability;
37-
import com.oracle.svm.core.fieldvaluetransformer.ObjectToConstantFieldValueTransformer;
38+
import com.oracle.svm.core.fieldvaluetransformer.JavaConstantWrapper;
3839
import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport;
3940
import com.oracle.svm.core.util.VMError;
4041
import com.oracle.svm.hosted.imagelayer.CrossLayerConstantRegistry;
@@ -43,7 +44,6 @@
4344

4445
import jdk.internal.loader.ClassLoaders;
4546
import jdk.vm.ci.meta.JavaConstant;
46-
import jdk.vm.ci.meta.ResolvedJavaField;
4747

4848
@AutomaticallyRegisteredFeature
4949
public class ClassLoaderFeature implements InternalFeature {
@@ -201,38 +201,32 @@ Object doTransform(Object receiver, Object originalValue) {
201201
}
202202
}
203203

204-
static class TraditionalPackageMapTransformer extends PackageMapTransformer {
204+
static final class TraditionalPackageMapTransformer extends PackageMapTransformer {
205205

206206
@Override
207207
public Object transform(Object receiver, Object originalValue) {
208208
return doTransform(receiver, originalValue);
209209
}
210210
}
211211

212-
static class InitialLayerPackageMapTransformer extends PackageMapTransformer implements ObjectToConstantFieldValueTransformer {
212+
static final class InitialLayerPackageMapTransformer extends PackageMapTransformer {
213213
final CrossLayerConstantRegistry registry = CrossLayerConstantRegistry.singletonOrNull();
214214

215215
@Override
216-
public JavaConstant transformToConstant(ResolvedJavaField field, Object receiver, Object originalValue, Function<Object, JavaConstant> toConstant) {
216+
public Object transform(Object receiver, Object originalValue) {
217217
if (receiver == nativeImageSystemClassLoader.defaultSystemClassLoader) {
218218
/*
219219
* This map will be assigned within the application layer. Within this layer we
220220
* register a relocatable constant.
221221
*/
222-
return registry.getConstant(APP_PACKAGE_KEY_NAME);
223-
222+
return new JavaConstantWrapper(registry.getConstant(APP_PACKAGE_KEY_NAME));
224223
}
225224

226-
return toConstant.apply(doTransform(receiver, originalValue));
225+
return doTransform(receiver, originalValue);
227226
}
228227
}
229228

230-
static class ExtensionLayerPackageMapTransformer implements FieldValueTransformerWithAvailability {
231-
232-
@Override
233-
public boolean isAvailable() {
234-
return true;
235-
}
229+
static class ExtensionLayerPackageMapTransformer implements FieldValueTransformer {
236230

237231
@Override
238232
public Object transform(Object receiver, Object originalValue) {
Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,16 @@
2424
*/
2525
package com.oracle.svm.hosted;
2626

27-
import java.util.function.Function;
27+
import java.lang.reflect.Field;
28+
29+
import org.graalvm.nativeimage.ImageSingletons;
2830

2931
import com.oracle.graal.pointsto.meta.AnalysisField;
3032
import com.oracle.svm.core.StaticFieldsSupport;
31-
import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton;
33+
import com.oracle.svm.core.StaticFieldsSupport.HostedStaticFieldSupport;
34+
import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
35+
import com.oracle.svm.core.feature.InternalFeature;
36+
import com.oracle.svm.core.fieldvaluetransformer.JavaConstantWrapper;
3237
import com.oracle.svm.core.imagelayer.DynamicImageLayerInfo;
3338
import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport;
3439
import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton;
@@ -40,6 +45,7 @@
4045
import com.oracle.svm.hosted.imagelayer.HostedImageLayerBuildingSupport;
4146
import com.oracle.svm.hosted.imagelayer.LayeredStaticFieldSupport;
4247
import com.oracle.svm.hosted.meta.HostedField;
48+
import com.oracle.svm.hosted.meta.HostedMetaAccess;
4349

4450
import jdk.graal.compiler.nodes.ConstantNode;
4551
import jdk.graal.compiler.nodes.StructuredGraph;
@@ -48,9 +54,9 @@
4854
import jdk.vm.ci.meta.JavaConstant;
4955
import jdk.vm.ci.meta.ResolvedJavaField;
5056

51-
@AutomaticallyRegisteredImageSingleton(StaticFieldsSupport.HostedStaticFieldSupport.class)
57+
@AutomaticallyRegisteredFeature
5258
@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class)
53-
public class HostedStaticFieldSupportImpl implements StaticFieldsSupport.HostedStaticFieldSupport {
59+
final class HostedStaticFieldSupportFeature extends HostedStaticFieldSupport implements InternalFeature {
5460

5561
private enum State {
5662
UNUSED,
@@ -59,6 +65,18 @@ private enum State {
5965
FUTURE_APP_LAYER,
6066
}
6167

68+
private HostedMetaAccess hostedMetaAccess;
69+
70+
@Override
71+
public void afterRegistration(AfterRegistrationAccess access) {
72+
ImageSingletons.add(HostedStaticFieldSupport.class, this);
73+
}
74+
75+
@Override
76+
public void beforeCompilation(BeforeCompilationAccess access) {
77+
hostedMetaAccess = ((FeatureImpl.BeforeCompilationAccessImpl) access).getMetaAccess();
78+
}
79+
6280
private State determineState(int layerNum) {
6381
if (layerNum == MultiLayeredImageSingleton.UNUSED_LAYER_NUMBER) {
6482
return State.UNUSED;
@@ -77,22 +95,22 @@ private State determineState(int layerNum) {
7795
}
7896

7997
@Override
80-
public JavaConstant getStaticFieldsBaseConstant(int layerNum, boolean primitive, Function<Object, JavaConstant> toConstant) {
98+
protected Object getStaticFieldBaseTransformation(int layerNum, boolean primitive) {
8199
return switch (determineState(layerNum)) {
82-
case UNUSED, CURRENT_LAYER -> {
83-
Object hostedObject = primitive ? StaticFieldsSupport.getCurrentLayerStaticPrimitiveFields() : StaticFieldsSupport.getCurrentLayerStaticObjectFields();
84-
yield toConstant.apply(hostedObject);
85-
}
86-
case PRIOR_LAYER ->
87-
primitive ? HostedImageLayerBuildingSupport.singleton().getLoader().getBaseLayerStaticPrimitiveFields()
100+
case UNUSED, CURRENT_LAYER ->
101+
primitive ? StaticFieldsSupport.getCurrentLayerStaticPrimitiveFields() : StaticFieldsSupport.getCurrentLayerStaticObjectFields();
102+
case PRIOR_LAYER -> {
103+
var value = primitive ? HostedImageLayerBuildingSupport.singleton().getLoader().getBaseLayerStaticPrimitiveFields()
88104
: HostedImageLayerBuildingSupport.singleton().getLoader().getBaseLayerStaticObjectFields();
105+
yield new JavaConstantWrapper(value);
106+
}
89107
case FUTURE_APP_LAYER ->
90-
LayeredStaticFieldSupport.singleton().getAppLayerStaticFieldBaseConstant(primitive);
108+
new JavaConstantWrapper(LayeredStaticFieldSupport.singleton().getAppLayerStaticFieldBaseConstant(primitive));
91109
};
92110
}
93111

94112
@Override
95-
public FloatingNode getStaticFieldsBaseReplacement(int layerNum, boolean primitive, LoweringTool tool, StructuredGraph graph) {
113+
protected FloatingNode getStaticFieldsBaseReplacement(int layerNum, boolean primitive, LoweringTool tool, StructuredGraph graph) {
96114
return switch (determineState(layerNum)) {
97115
case UNUSED, CURRENT_LAYER -> {
98116
Object hostedObject = primitive ? StaticFieldsSupport.getCurrentLayerStaticPrimitiveFields() : StaticFieldsSupport.getCurrentLayerStaticObjectFields();
@@ -110,7 +128,7 @@ public FloatingNode getStaticFieldsBaseReplacement(int layerNum, boolean primiti
110128
}
111129

112130
@Override
113-
public boolean isPrimitive(ResolvedJavaField field) {
131+
protected boolean isPrimitive(ResolvedJavaField field) {
114132
if (field instanceof AnalysisField aField) {
115133
return aField.getStorageKind().isPrimitive();
116134
}
@@ -129,7 +147,7 @@ private int getCurrentLayerNumber() {
129147
}
130148

131149
@Override
132-
public int getInstalledLayerNum(ResolvedJavaField field) {
150+
protected int getInstalledLayerNum(ResolvedJavaField field) {
133151
assert ImageLayerBuildingSupport.buildingImageLayer();
134152
if (field instanceof SharedField sField) {
135153
return sField.getInstalledLayerNum();
@@ -142,4 +160,9 @@ public int getInstalledLayerNum(ResolvedJavaField field) {
142160
};
143161
}
144162
}
163+
164+
@Override
165+
protected ResolvedJavaField toResolvedField(Field field) {
166+
return hostedMetaAccess.lookupJavaField(field);
167+
}
145168
}

0 commit comments

Comments
 (0)