Skip to content

Commit 5b68551

Browse files
authored
Merge pull request #61 from luneo7/GR-58292-backport
[Backport] [GR-58292] Add option to disable substitutions
2 parents a81e90f + 226913c commit 5b68551

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,11 @@ public static void updateMaxJavaStackTraceDepth(EconomicMap<OptionKey<?>, Object
411411
@Option(help = "Verify naming conventions during image construction.")//
412412
public static final HostedOptionKey<Boolean> VerifyNamingConventions = new HostedOptionKey<>(false);
413413

414+
@Option(help = "Disable the substitutions matched by the option value. " +
415+
"A value can be a fully qualified method name with parameter list, a fully qualified method name without parameter list, or a fully qualified type name. " +
416+
"When multiple methods match a value, then all matching substitutions are disabled.")//
417+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> DisableSubstitution = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.build());
418+
414419
@Option(help = "Enable support for threads and and thread-local variables (disable for single-threaded implementation)")//
415420
public static final HostedOptionKey<Boolean> MultiThreaded = new HostedOptionKey<>(true);
416421

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import java.util.List;
4141
import java.util.Map;
4242
import java.util.Optional;
43+
import java.util.Set;
4344
import java.util.concurrent.ConcurrentHashMap;
4445
import java.util.function.BooleanSupplier;
4546
import java.util.function.Predicate;
@@ -106,6 +107,7 @@ public class AnnotationSubstitutionProcessor extends SubstitutionProcessor {
106107
private final Map<ResolvedJavaMethod, ResolvedJavaMethod> polymorphicMethodSubstitutions;
107108
private final Map<ResolvedJavaField, ResolvedJavaField> fieldSubstitutions;
108109
private ClassInitializationSupport classInitializationSupport;
110+
private final Set<String> disabledSubstitutions;
109111

110112
public AnnotationSubstitutionProcessor(ImageClassLoader imageClassLoader, MetaAccessProvider metaAccess, ClassInitializationSupport classInitializationSupport) {
111113
this.imageClassLoader = imageClassLoader;
@@ -117,6 +119,7 @@ public AnnotationSubstitutionProcessor(ImageClassLoader imageClassLoader, MetaAc
117119
methodSubstitutions = new ConcurrentHashMap<>();
118120
polymorphicMethodSubstitutions = new HashMap<>();
119121
fieldSubstitutions = new ConcurrentHashMap<>();
122+
disabledSubstitutions = Set.copyOf(SubstrateOptions.DisableSubstitution.getValue().values());
120123
}
121124

122125
public void registerFieldValueTransformer(Field reflectionField, FieldValueTransformer transformer) {
@@ -461,6 +464,18 @@ private void handleMethodInAliasClass(Executable annotatedMethod, Class<?> origi
461464
return;
462465
}
463466

467+
if (!disabledSubstitutions.isEmpty()) {
468+
/*
469+
* Substitutions can be disabled on the command line. The three formats to match are
470+
* specified in the help text of the option DisableSubstitution.
471+
*/
472+
if (disabledSubstitutions.contains(annotated.format("%H")) ||
473+
disabledSubstitutions.contains(annotated.format("%H.%n")) ||
474+
disabledSubstitutions.contains(annotated.format("%H.%n(%P)"))) {
475+
return;
476+
}
477+
}
478+
464479
if (deleteAnnotation != null) {
465480
if (SubstrateOptions.VerifyNamingConventions.getValue()) {
466481
int modifiers = original.getModifiers();

0 commit comments

Comments
 (0)