Skip to content

Commit fdf916b

Browse files
committed
Update SubstitutionProcessor documentation.
1 parent 37217f1 commit fdf916b

File tree

2 files changed

+53
-3
lines changed

2 files changed

+53
-3
lines changed

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/infrastructure/SubstitutionProcessor.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,22 @@
2424
*/
2525
package com.oracle.graal.pointsto.infrastructure;
2626

27+
import com.oracle.graal.pointsto.meta.AnalysisUniverse;
28+
2729
import jdk.vm.ci.meta.ResolvedJavaField;
2830
import jdk.vm.ci.meta.ResolvedJavaMethod;
2931
import jdk.vm.ci.meta.ResolvedJavaType;
3032

33+
/**
34+
* A substitution processor is a facility that allows modifying code elements coming from class
35+
* files without modifying the class files. It is queried by the {@link AnalysisUniverse} when
36+
* creating the analysis model of a hosted element (type, method, field) to check if a substitution
37+
* is available. How a substitution processor is implemented, i.e., when a processor decides to
38+
* replace an element and how that element is constructed, is not specified. The substitution
39+
* processors form a chain, created via {@link #chainUpInOrder(SubstitutionProcessor...)} and
40+
* {@link #extendsTheChain(SubstitutionProcessor, SubstitutionProcessor[])} utility methods, and are
41+
* queried in the order in which they were installed.
42+
*/
3143
public abstract class SubstitutionProcessor {
3244

3345
/**
@@ -40,10 +52,24 @@ public ResolvedJavaType lookup(ResolvedJavaType type) {
4052
return type;
4153
}
4254

55+
/**
56+
* Get the substitution of an original field.
57+
*
58+
* @param field the original field
59+
* @return the substitution field, or the original field if it isn't covered by this
60+
* substitution
61+
*/
4362
public ResolvedJavaField lookup(ResolvedJavaField field) {
4463
return field;
4564
}
4665

66+
/**
67+
* Get the substitution of an original method.
68+
*
69+
* @param method the original method
70+
* @return the substitution method, or the original method if it isn't covered by this
71+
* substitution
72+
*/
4773
public ResolvedJavaMethod lookup(ResolvedJavaMethod method) {
4874
return method;
4975
}
@@ -80,7 +106,7 @@ public static SubstitutionProcessor chainUpInOrder(SubstitutionProcessor... proc
80106
return current;
81107
}
82108

83-
public static SubstitutionProcessor chain(SubstitutionProcessor first, SubstitutionProcessor second) {
109+
private static SubstitutionProcessor chain(SubstitutionProcessor first, SubstitutionProcessor second) {
84110
if (first == IDENTITY) {
85111
return second;
86112
} else if (second == IDENTITY) {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import java.util.function.Predicate;
4949
import java.util.function.Supplier;
5050

51-
import com.oracle.svm.hosted.SVMHost;
5251
import org.graalvm.nativeimage.AnnotationAccess;
5352
import org.graalvm.nativeimage.ImageSingletons;
5453
import org.graalvm.nativeimage.Platform;
@@ -58,6 +57,7 @@
5857
import com.oracle.graal.pointsto.BigBang;
5958
import com.oracle.graal.pointsto.infrastructure.SubstitutionProcessor;
6059
import com.oracle.graal.pointsto.meta.AnalysisField;
60+
import com.oracle.graal.pointsto.meta.AnalysisUniverse;
6161
import com.oracle.svm.core.SubstrateOptions;
6262
import com.oracle.svm.core.SubstrateUtil;
6363
import com.oracle.svm.core.Uninterruptible;
@@ -84,8 +84,10 @@
8484
import com.oracle.svm.hosted.ImageClassLoader;
8585
import com.oracle.svm.hosted.NativeImageGenerator;
8686
import com.oracle.svm.hosted.NativeImageOptions;
87+
import com.oracle.svm.hosted.SVMHost;
8788
import com.oracle.svm.hosted.ameta.FieldValueInterceptionSupport;
8889
import com.oracle.svm.hosted.classinitialization.ClassInitializationSupport;
90+
import com.oracle.svm.hosted.meta.HostedUniverse;
8991
import com.oracle.svm.util.ReflectionUtil;
9092
import com.oracle.svm.util.ReflectionUtil.ReflectionUtilError;
9193

@@ -94,6 +96,28 @@
9496
import jdk.vm.ci.meta.ResolvedJavaMethod;
9597
import jdk.vm.ci.meta.ResolvedJavaType;
9698

99+
/**
100+
* The main substitution processor for Native Image. The annotations supported by this processor
101+
* are:
102+
* <ul>
103+
* <li>{@link TargetClass}</li>
104+
* <li>{@link Substitute}</li>
105+
* <li>{@link TargetElement}</li>
106+
* <li>{@link Alias}</li>
107+
* <li>{@link AnnotateOriginal}</li>
108+
* <li>{@link Delete}</li>
109+
* <li>{@link Inject}</li>
110+
* <li>{@link InjectAccessors}</li>
111+
* <li>{@link KeepOriginal}</li>
112+
* <li>{@link RecomputeFieldValue}</li>
113+
* </ul>
114+
* Code tagged with these annotations is preprocessed during Native Image setup when the processor
115+
* is {@link AnnotationSubstitutionProcessor#init(FieldValueInterceptionSupport) initialized}. Then,
116+
* hosted code corresponding to the substitution code is intercepted and replaced without modifying
117+
* the class files during {@link AnalysisUniverse} lookups. See each annotation's JavaDoc for more
118+
* details, starting with {@link TargetClass}. See also {@link HostedUniverse} for a comprehensive
119+
* description of the substitution layer.
120+
*/
97121
public class AnnotationSubstitutionProcessor extends SubstitutionProcessor {
98122

99123
/**
@@ -306,7 +330,7 @@ public void registerUnsafeAccessedFields(BigBang bb) {
306330
}
307331

308332
public void init(FieldValueInterceptionSupport newFieldValueInterceptionSupport) {
309-
/**
333+
/*
310334
* Cannot set this field in the constructor due to cyclic dependencies between the two
311335
* classes.
312336
*/

0 commit comments

Comments
 (0)