Skip to content

Commit 0a313a6

Browse files
author
Christian Wimmer
committed
Remove ComputedValueField and ReadableValueField
1 parent fbe8365 commit 0a313a6

File tree

43 files changed

+818
-981
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+818
-981
lines changed

substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/Target_jdk_internal_foreign_Utils_BaseAndScale.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@
2424
*/
2525
package com.oracle.svm.core.foreign;
2626

27+
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
28+
2729
import com.oracle.svm.core.annotate.Alias;
2830
import com.oracle.svm.core.annotate.RecomputeFieldValue;
2931
import com.oracle.svm.core.annotate.TargetClass;
3032
import com.oracle.svm.core.config.ConfigurationValues;
31-
import com.oracle.svm.core.fieldvaluetransformer.FieldValueTransformerWithAvailability;
3233
import com.oracle.svm.core.util.VMError;
3334

3435
import jdk.internal.foreign.Utils;
@@ -41,12 +42,7 @@ final class Target_jdk_internal_foreign_Utils_BaseAndScale {
4142
int base;
4243
}
4344

44-
final class BaseFieldRecomputer implements FieldValueTransformerWithAvailability {
45-
46-
@Override
47-
public ValueAvailability valueAvailability() {
48-
return ValueAvailability.BeforeAnalysis;
49-
}
45+
final class BaseFieldRecomputer implements FieldValueTransformer {
5046

5147
@Override
5248
public Object transform(Object receiver, Object originalValue) {

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,18 @@
2626

2727
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
2828

29+
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
2930
import com.oracle.svm.core.config.ConfigurationValues;
3031

3132
import jdk.vm.ci.meta.JavaKind;
3233

33-
public final class ArrayBaseOffsetFieldValueTransformer extends BoxingTransformer implements FieldValueTransformer {
34-
private final Class<?> targetClass;
35-
36-
public ArrayBaseOffsetFieldValueTransformer(Class<?> targetClass, JavaKind returnKind) {
37-
super(returnKind);
38-
this.targetClass = targetClass;
39-
}
34+
/**
35+
* Implements the field value transformation semantics of {@link Kind#ArrayBaseOffset}.
36+
*/
37+
public record ArrayBaseOffsetFieldValueTransformer(Class<?> targetClass, JavaKind returnKind) implements FieldValueTransformer {
4038

4139
@Override
4240
public Object transform(Object receiver, Object originalValue) {
43-
return box(ConfigurationValues.getObjectLayout().getArrayBaseOffset(JavaKind.fromJavaClass(targetClass.getComponentType())));
41+
return FieldOffsetFieldValueTransformer.box(returnKind, ConfigurationValues.getObjectLayout().getArrayBaseOffset(JavaKind.fromJavaClass(targetClass.getComponentType())));
4442
}
4543
}

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,18 @@
2626

2727
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
2828

29+
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
2930
import com.oracle.svm.core.config.ConfigurationValues;
3031

3132
import jdk.vm.ci.meta.JavaKind;
3233

33-
public final class ArrayIndexScaleFieldValueTransformer extends BoxingTransformer implements FieldValueTransformer {
34-
private final Class<?> targetClass;
35-
36-
public ArrayIndexScaleFieldValueTransformer(Class<?> targetClass, JavaKind returnKind) {
37-
super(returnKind);
38-
this.targetClass = targetClass;
39-
}
34+
/**
35+
* Implements the field value transformation semantics of {@link Kind#ArrayIndexScale}.
36+
*/
37+
public record ArrayIndexScaleFieldValueTransformer(Class<?> targetClass, JavaKind returnKind) implements FieldValueTransformer {
4038

4139
@Override
4240
public Object transform(Object receiver, Object originalValue) {
43-
return box(ConfigurationValues.getObjectLayout().getArrayIndexScale(JavaKind.fromJavaClass(targetClass.getComponentType())));
41+
return FieldOffsetFieldValueTransformer.box(returnKind, ConfigurationValues.getObjectLayout().getArrayIndexScale(JavaKind.fromJavaClass(targetClass.getComponentType())));
4442
}
4543
}

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,18 @@
2626

2727
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
2828

29+
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
2930
import com.oracle.svm.core.config.ConfigurationValues;
3031

3132
import jdk.vm.ci.meta.JavaKind;
3233

33-
public final class ArrayIndexShiftFieldValueTransformer extends BoxingTransformer implements FieldValueTransformer {
34-
private final Class<?> targetClass;
35-
36-
public ArrayIndexShiftFieldValueTransformer(Class<?> targetClass, JavaKind returnKind) {
37-
super(returnKind);
38-
this.targetClass = targetClass;
39-
}
34+
/**
35+
* Implements the field value transformation semantics of {@link Kind#ArrayIndexShift}.
36+
*/
37+
public record ArrayIndexShiftFieldValueTransformer(Class<?> targetClass, JavaKind returnKind) implements FieldValueTransformer {
4038

4139
@Override
4240
public Object transform(Object receiver, Object originalValue) {
43-
return box(ConfigurationValues.getObjectLayout().getArrayIndexShift(JavaKind.fromJavaClass(targetClass.getComponentType())));
41+
return FieldOffsetFieldValueTransformer.box(returnKind, ConfigurationValues.getObjectLayout().getArrayIndexShift(JavaKind.fromJavaClass(targetClass.getComponentType())));
4442
}
4543
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
package com.oracle.svm.core.fieldvaluetransformer;
26+
27+
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
28+
29+
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
30+
import com.oracle.svm.core.util.VMError;
31+
32+
import jdk.vm.ci.meta.ResolvedJavaField;
33+
34+
/**
35+
* Sets the field to the provided constant value.
36+
*
37+
* When that value is the {@link #defaultValueForField default value for the field}, this
38+
* transformer implements the field value transformation semantics of {@link Kind#Reset}.
39+
*/
40+
public record ConstantValueFieldValueTransformer(Object value) implements FieldValueTransformer {
41+
42+
public static FieldValueTransformer defaultValueForField(ResolvedJavaField field) {
43+
return new ConstantValueFieldValueTransformer(switch (field.getType().getJavaKind()) {
44+
case Byte -> Byte.valueOf((byte) 0);
45+
case Boolean -> Boolean.valueOf(false);
46+
case Short -> Short.valueOf((short) 0);
47+
case Char -> Character.valueOf((char) 0);
48+
case Int -> Integer.valueOf(0);
49+
case Long -> Long.valueOf(0);
50+
case Float -> Float.valueOf(0);
51+
case Double -> Double.valueOf(0);
52+
case Object -> null;
53+
default -> throw VMError.shouldNotReachHere(String.valueOf(field));
54+
});
55+
}
56+
57+
@Override
58+
public Object transform(Object receiver, Object originalValue) {
59+
return value;
60+
}
61+
}

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

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626

2727
import java.lang.reflect.Field;
2828

29+
import com.oracle.svm.core.BuildPhaseProvider;
30+
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
2931
import com.oracle.svm.core.graal.nodes.FieldOffsetNode;
3032
import com.oracle.svm.core.reflect.target.ReflectionSubstitutionSupport;
3133
import com.oracle.svm.core.util.VMError;
@@ -35,17 +37,14 @@
3537
import jdk.vm.ci.meta.JavaConstant;
3638
import jdk.vm.ci.meta.JavaKind;
3739

38-
public final class FieldOffsetFieldValueTransformer extends BoxingTransformer implements FieldValueTransformerWithAvailability {
39-
private final Field targetField;
40-
41-
public FieldOffsetFieldValueTransformer(Field targetField, JavaKind returnKind) {
42-
super(returnKind);
43-
this.targetField = targetField;
44-
}
40+
/**
41+
* Implements the field value transformation semantics of {@link Kind#FieldOffset}.
42+
*/
43+
public record FieldOffsetFieldValueTransformer(Field targetField, JavaKind returnKind) implements FieldValueTransformerWithAvailability {
4544

4645
@Override
47-
public ValueAvailability valueAvailability() {
48-
return ValueAvailability.AfterAnalysis;
46+
public boolean isAvailable() {
47+
return BuildPhaseProvider.isHostedUniverseBuilt();
4948
}
5049

5150
@Override
@@ -54,7 +53,18 @@ public Object transform(Object receiver, Object originalValue) {
5453
if (offset <= 0) {
5554
throw VMError.shouldNotReachHere("Field is not marked as unsafe accessed: " + targetField);
5655
}
57-
return box(offset);
56+
return box(returnKind, offset);
57+
}
58+
59+
static Object box(JavaKind returnKind, int value) {
60+
switch (returnKind) {
61+
case Int:
62+
return Integer.valueOf(value);
63+
case Long:
64+
return Long.valueOf(value);
65+
default:
66+
throw VMError.shouldNotReachHere("Unexpected kind: " + returnKind);
67+
}
5868
}
5969

6070
@Override

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

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,34 +36,9 @@
3636
public interface FieldValueTransformerWithAvailability extends FieldValueTransformer {
3737

3838
/**
39-
* Controls when the transformed value is available at image build time.
39+
* Returns true when the value for this custom computation is available.
4040
*/
41-
enum ValueAvailability {
42-
/**
43-
* The value is available without time constraints, i.e., it is independent of static
44-
* analysis or compilation.
45-
*/
46-
BeforeAnalysis,
47-
48-
/**
49-
* The value depends on data computed by the static analysis and is therefore not yet
50-
* available to the static analysis. The value still might be constant folded during
51-
* compilation.
52-
*/
53-
AfterAnalysis,
54-
55-
/**
56-
* Value depends on data computed during compilation and is therefore available only when
57-
* writing out the image heap into the native image. Such a value is never available for
58-
* constant folding.
59-
*/
60-
AfterCompilation
61-
}
62-
63-
/**
64-
* Returns information about when the value for this custom computation is available.
65-
*/
66-
ValueAvailability valueAvailability();
41+
boolean isAvailable();
6742

6843
/**
6944
* Optionally provide a Graal IR node to intrinsify the field access before the static analysis.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
package com.oracle.svm.core.fieldvaluetransformer;
26+
27+
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
28+
29+
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
30+
import com.oracle.svm.util.ReflectionUtil;
31+
32+
/**
33+
* Implements the field value transformation semantics of {@link Kind#NewInstance} and
34+
* {@link Kind#NewInstanceWhenNotNull}.
35+
*/
36+
public record NewInstanceOfFixedClassFieldValueTransformer(Class<?> clazz, boolean onlyIfOriginalNotNull) implements FieldValueTransformer {
37+
38+
@Override
39+
public Object transform(Object receiver, Object originalValue) {
40+
if (onlyIfOriginalNotNull && originalValue == null) {
41+
return null;
42+
}
43+
return ReflectionUtil.newInstance(clazz);
44+
}
45+
}

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,22 @@
2626

2727
import java.lang.reflect.Field;
2828

29+
import com.oracle.svm.core.BuildPhaseProvider;
2930
import com.oracle.svm.core.StaticFieldsSupport;
31+
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
3032

3133
import jdk.graal.compiler.nodes.ValueNode;
3234
import jdk.graal.compiler.nodes.spi.CoreProviders;
3335
import jdk.vm.ci.meta.JavaConstant;
3436

35-
public final class StaticFieldBaseFieldValueTransformer implements FieldValueTransformerWithAvailability {
36-
private final Field targetField;
37-
38-
public StaticFieldBaseFieldValueTransformer(Field targetField) {
39-
this.targetField = targetField;
40-
}
37+
/**
38+
* Implements the field value transformation semantics of {@link Kind#StaticFieldBase}.
39+
*/
40+
public record StaticFieldBaseFieldValueTransformer(Field targetField) implements FieldValueTransformerWithAvailability {
4141

4242
@Override
43-
public ValueAvailability valueAvailability() {
44-
return ValueAvailability.AfterAnalysis;
43+
public boolean isAvailable() {
44+
return BuildPhaseProvider.isHostedUniverseBuilt();
4545
}
4646

4747
@Override

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
5050
import org.graalvm.nativeimage.impl.InternalPlatform;
5151

52+
import com.oracle.svm.core.BuildPhaseProvider;
5253
import com.oracle.svm.core.NeverInline;
5354
import com.oracle.svm.core.SubstrateOptions;
5455
import com.oracle.svm.core.SubstrateUtil;
@@ -579,13 +580,13 @@ public Object transform(Object receiver, Object originalValue) {
579580
return map;
580581
}
581582

583+
/*
584+
* We want to wait to constant fold this value until all possible HotSpot initialization code
585+
* has run.
586+
*/
582587
@Override
583-
public ValueAvailability valueAvailability() {
584-
/*
585-
* We want to wait to constant fold this value until all possible HotSpot initialization
586-
* code has run.
587-
*/
588-
return ValueAvailability.AfterAnalysis;
588+
public boolean isAvailable() {
589+
return BuildPhaseProvider.isHostedUniverseBuilt();
589590
}
590591
}
591592

0 commit comments

Comments
 (0)