Skip to content

Commit 476fd38

Browse files
author
Aleksandar Gradinac
committed
Cleanup
1 parent 0089306 commit 476fd38

File tree

12 files changed

+54
-90
lines changed

12 files changed

+54
-90
lines changed

substratevm/mx.substratevm/mx_substratevm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ def conditional_config_task(native_image):
450450
config_dir = join(svmbuild_dir(), 'cond-config-test-config')
451451
if exists(config_dir):
452452
mx.rmtree(config_dir)
453-
agent_opts = ['config-output-dir=' + config_dir, 'experimental-conditional-configuration=com.oracle.svm.configure.test.conditionalconfig']
453+
agent_opts = ['config-output-dir=' + config_dir, 'experimental-conditional-configuration-for-packages=com.oracle.svm.configure.test.conditionalconfig']
454454
jvm_unittest(['-agentpath:' + agent_path + '=' + ','.join(agent_opts)]
455455
+ ['com.oracle.svm.configure.test.conditionalconfig.ConfigurationGenerator'])
456456

substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/NativeImageAgent.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,8 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c
124124
boolean experimentalOmitClasspathConfig = false;
125125
boolean build = false;
126126
boolean configurationWithOrigins = false;
127-
Set<String> predefinedConfigurationPackages = new HashSet<>();
128-
Set<Pattern> classNamePatterns = new HashSet<>();
127+
Set<String> conditionalConfigurationUserCodePackagePrefixes = new HashSet<>();
128+
Set<Pattern> conditionalConfigurationClassNameExcludePatterns = new HashSet<>();
129129
int configWritePeriod = -1; // in seconds
130130
int configWritePeriodInitialDelay = 1; // in seconds
131131
boolean trackReflectionMetadata = true;
@@ -197,12 +197,12 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c
197197
build = Boolean.parseBoolean(getTokenValue(token));
198198
} else if (token.equals("experimental-configuration-with-origins")) {
199199
configurationWithOrigins = true;
200-
} else if (token.startsWith("experimental-conditional-configuration=")) {
201-
String applicationPackages = getTokenValue(token);
202-
Collections.addAll(predefinedConfigurationPackages, applicationPackages.split(","));
203-
} else if (token.startsWith("class-name-filter=")) {
200+
} else if (token.startsWith("experimental-conditional-configuration-for-packages=")) {
201+
String userPackagePrefixes = getTokenValue(token);
202+
Collections.addAll(conditionalConfigurationUserCodePackagePrefixes, userPackagePrefixes.split(","));
203+
} else if (token.startsWith("conditional-configuration-class-name-exclude-patterns=")) {
204204
String classNamePattern = getTokenValue(token);
205-
Arrays.stream(classNamePattern.split(",")).map(Pattern::compile).forEach(classNamePatterns::add);
205+
Arrays.stream(classNamePattern.split(",")).map(Pattern::compile).forEach(conditionalConfigurationClassNameExcludePatterns::add);
206206
} else if (token.equals("track-reflection-metadata")) {
207207
trackReflectionMetadata = true;
208208
} else if (token.startsWith("track-reflection-metadata=")) {
@@ -217,7 +217,7 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c
217217
inform("no output/build options provided, tracking dynamic accesses and writing configuration to directory: " + configOutputDir);
218218
}
219219

220-
if (configurationWithOrigins && !predefinedConfigurationPackages.isEmpty()) {
220+
if (configurationWithOrigins && !conditionalConfigurationUserCodePackagePrefixes.isEmpty()) {
221221
return error(5, "The agent can only be used in either the configuration with origins mode or the predefined classes mode.");
222222
}
223223

@@ -252,7 +252,7 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c
252252
}
253253
}
254254

255-
boolean shouldTraceOriginInformation = configurationWithOrigins || !predefinedConfigurationPackages.isEmpty();
255+
boolean shouldTraceOriginInformation = configurationWithOrigins || !conditionalConfigurationUserCodePackagePrefixes.isEmpty();
256256
final MethodInfoRecordKeeper recordKeeper = new MethodInfoRecordKeeper(shouldTraceOriginInformation);
257257
final Supplier<InterceptedState> interceptedStateSupplier = shouldTraceOriginInformation ? EagerlyLoadedJavaStackAccess.stackAccessSupplier()
258258
: OnDemandJavaStackAccess.stackAccessSupplier();
@@ -288,9 +288,9 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c
288288
ConfigurationWithOriginsResultWriter writer = new ConfigurationWithOriginsResultWriter(advisor, recordKeeper);
289289
tracer = writer;
290290
tracingResultWriter = writer;
291-
} else if (!predefinedConfigurationPackages.isEmpty()) {
292-
ConditionalConfigurationPredicate filter = new ConditionalConfigurationPredicate(classNamePatterns);
293-
ConditionalConfigurationWriter writer = new ConditionalConfigurationWriter(advisor, recordKeeper, predefinedConfigurationPackages, filter);
291+
} else if (!conditionalConfigurationUserCodePackagePrefixes.isEmpty()) {
292+
ConditionalConfigurationPredicate filter = new ConditionalConfigurationPredicate(conditionalConfigurationClassNameExcludePatterns);
293+
ConditionalConfigurationWriter writer = new ConditionalConfigurationWriter(advisor, recordKeeper, conditionalConfigurationUserCodePackagePrefixes, filter);
294294
tracer = writer;
295295
tracingResultWriter = writer;
296296
} else {

substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/NativeImageAgentJNIHandleSet.java

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

2727
import static com.oracle.svm.jni.JNIObjectHandles.nullHandle;
2828

29-
import com.oracle.svm.jvmtiagentbase.Support;
30-
import jdk.vm.ci.meta.MetaUtil;
3129
import org.graalvm.word.WordFactory;
3230

3331
import com.oracle.svm.jni.nativeapi.JNIEnvironment;
@@ -230,37 +228,4 @@ public JNIMethodId getJavaUtilResourceBundleGetLocale(JNIEnvironment env) {
230228
}
231229
return javaUtilResourceBundleGetLocale;
232230
}
233-
234-
private JNIMethodId javaLangClassGetProtectionDomain = WordFactory.nullPointer();
235-
private JNIMethodId javaSecurityProtectionDomainGetCodeSource = WordFactory.nullPointer();
236-
private JNIMethodId javaSecurityCodeSourceGetLocation = WordFactory.nullPointer();
237-
private JNIMethodId javaNetURLGetPath = WordFactory.nullPointer();
238-
239-
public String getClassLocationOrNull(JNIEnvironment env, String className) {
240-
String classNameInternal = MetaUtil.toInternalName(className);
241-
JNIObjectHandle clazz = findClass(env, classNameInternal);
242-
if (clazz == null) {
243-
return null;
244-
}
245-
246-
if (javaLangClassGetProtectionDomain.isNull()) {
247-
javaLangClassGetProtectionDomain = getMethodId(env, javaLangClass, "getProtectionDomain", "()Ljava/security/ProtectionDomain;", false);
248-
249-
JNIObjectHandle protDomainClass = findClass(env, "java/security/ProtectionDomain");
250-
javaSecurityProtectionDomainGetCodeSource = getMethodId(env, protDomainClass, "getCodeSource", "()Ljava/security/CodeSource;", false);
251-
252-
JNIObjectHandle codeSourceClass = findClass(env, "java/security/CodeSource");
253-
javaSecurityCodeSourceGetLocation = getMethodId(env, codeSourceClass, "getLocation", "()Ljava/net/URL;", false);
254-
255-
JNIObjectHandle urlClass = findClass(env, "java/net/URL");
256-
javaNetURLGetPath = getMethodId(env, urlClass, "getPath", "()Ljava/lang/String;", false);
257-
}
258-
259-
/* return clazz.getProtectionDomain().getCodeSource().getLocation().getPath() */
260-
JNIObjectHandle protectionDomain = Support.callObjectMethod(env, clazz, javaLangClassGetProtectionDomain);
261-
JNIObjectHandle codeSource = Support.callObjectMethod(env, protectionDomain, javaSecurityProtectionDomainGetCodeSource);
262-
JNIObjectHandle location = Support.callObjectMethod(env, codeSource, javaSecurityCodeSourceGetLocation);
263-
JNIObjectHandle path = Support.callObjectMethod(env, location, javaNetURLGetPath);
264-
return Support.fromJniString(env, path);
265-
}
266231
}

substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/predicatedconfig/ConditionalConfigurationWriter.java

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -187,22 +187,22 @@ private void deduceConditionalConfiguration(Map<MethodInfo, List<CallNodeWithCon
187187

188188
private void addConfigurationWithCondition(ConfigurationSet nodeConfig, ConfigurationCondition condition) {
189189
TypeConfiguration reflectionConfig = nodeConfig.getReflectionConfiguration();
190-
configurationContainer.getReflectionConfiguration().addWithCondition(condition, reflectionConfig);
190+
configurationContainer.getReflectionConfiguration().mergeConditional(condition, reflectionConfig);
191191

192192
TypeConfiguration jniConfig = nodeConfig.getJniConfiguration();
193-
configurationContainer.getJniConfiguration().addWithCondition(condition, jniConfig);
193+
configurationContainer.getJniConfiguration().mergeConditional(condition, jniConfig);
194194

195195
ResourceConfiguration resourceConfiguration = nodeConfig.getResourceConfiguration();
196-
configurationContainer.getResourceConfiguration().addWithCondition(condition, resourceConfiguration);
196+
configurationContainer.getResourceConfiguration().mergeConditional(condition, resourceConfiguration);
197197

198198
ProxyConfiguration proxyConfiguration = nodeConfig.getProxyConfiguration();
199-
configurationContainer.getProxyConfiguration().addWithCondition(condition, proxyConfiguration);
199+
configurationContainer.getProxyConfiguration().mergeConditional(condition, proxyConfiguration);
200200

201201
SerializationConfiguration serializationConfiguration = nodeConfig.getSerializationConfiguration();
202-
configurationContainer.getSerializationConfiguration().addWithCondition(condition, serializationConfiguration);
202+
configurationContainer.getSerializationConfiguration().mergeConditional(condition, serializationConfiguration);
203203

204204
PredefinedClassesConfiguration predefinedClassesConfiguration = nodeConfig.getPredefinedClassesConfiguration();
205-
configurationContainer.getPredefinedClassesConfiguration().addWithCondition(condition, predefinedClassesConfiguration);
205+
configurationContainer.getPredefinedClassesConfiguration().mergeConditional(condition, predefinedClassesConfiguration);
206206
}
207207

208208
private void filterConfiguration() {
@@ -234,29 +234,22 @@ protected String getConfigFileSuffix() {
234234
private boolean methodOriginatesFromApplicationPackage(MethodInfo methodInfo) {
235235
return applicationPackagePrefixes.stream().anyMatch(prefix -> methodInfo.getJavaDeclaringClassName().startsWith(prefix));
236236
}
237-
238-
private int findIndexOfMethodFromApplicationPackage(MethodInfo[] stackTrace, boolean fromBeginning) {
239-
int firstMethodOriginatingInPackage = fromBeginning ? 0 : stackTrace.length - 1;
240-
int step = fromBeginning ? 1 : -1;
241-
while (firstMethodOriginatingInPackage >= 0 && firstMethodOriginatingInPackage < stackTrace.length) {
242-
if (methodOriginatesFromApplicationPackage(stackTrace[firstMethodOriginatingInPackage])) {
243-
return firstMethodOriginatingInPackage;
244-
}
245-
firstMethodOriginatingInPackage = firstMethodOriginatingInPackage + step;
246-
}
247-
return -1;
248-
}
249-
250237
@Override
251238
protected MethodInfo[] filterStackTrace(MethodInfo[] stackTrace) {
252239
/* Keep only the classes from the selected package names on the stack trace. */
253-
int firstMethodIndex = findIndexOfMethodFromApplicationPackage(stackTrace, true);
254-
if (firstMethodIndex == -1) {
240+
int dest = 0;
241+
for (int i = 0; i < stackTrace.length; ++i) {
242+
if (methodOriginatesFromApplicationPackage(stackTrace[i])) {
243+
stackTrace[dest++] = stackTrace[i];
244+
}
245+
}
246+
247+
/* No classes on this trace originated from user code */
248+
if (dest == 0) {
255249
return null;
256250
}
257-
int lastMethodIndex = findIndexOfMethodFromApplicationPackage(stackTrace, false);
258251

259-
return Arrays.copyOfRange(stackTrace, firstMethodIndex, lastMethodIndex);
252+
return Arrays.copyOfRange(stackTrace, 0, dest);
260253
}
261254

262255
@Override

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.function.Consumer;
2828

2929
import com.oracle.svm.configure.json.JsonPrintable;
30+
import org.graalvm.nativeimage.impl.ConfigurationCondition;
3031

3132
public abstract class ConfigurationBase<T extends ConfigurationBase<T, P>, P> implements JsonPrintable {
3233

@@ -36,6 +37,8 @@ public abstract class ConfigurationBase<T extends ConfigurationBase<T, P>, P> im
3637

3738
protected abstract void merge(T other);
3839

40+
protected abstract void mergeConditional(ConfigurationCondition condition, T other);
41+
3942
protected abstract void subtract(T other);
4043

4144
protected abstract void intersect(T other);

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationType.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,7 @@ private void intersectFields(ConfigurationType other) {
210210
if (fields != null) {
211211
if (other.fields != null) {
212212
fields.keySet().retainAll(other.fields.keySet());
213-
for (Map.Entry<String, FieldInfo> fieldEntry : other.fields.entrySet()) {
214-
fields.computeIfPresent(fieldEntry.getKey(), (key, value) -> value.newIntersectedWith(fieldEntry.getValue()));
215-
}
213+
fields.replaceAll((key, value) -> value.newIntersectedWith(other.fields.get(key)));
216214
} else {
217215
fields = null;
218216
}

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,16 @@ protected void subtract(PredefinedClassesConfiguration other) {
7575

7676
@Override
7777
protected void intersect(PredefinedClassesConfiguration other) {
78-
classes.keySet().retainAll(classes.keySet());
78+
classes.keySet().retainAll(other.classes.keySet());
7979
}
8080

8181
@Override
8282
protected void removeIf(Predicate predicate) {
8383
classes.values().removeIf(predicate::testPredefinedClass);
8484
}
8585

86-
public void addWithCondition(ConfigurationCondition condition, PredefinedClassesConfiguration other) {
86+
@Override
87+
public void mergeConditional(ConfigurationCondition condition, PredefinedClassesConfiguration other) {
8788
/* Not implemented with conditions yet */
8889
classes.putAll(other.classes);
8990
}

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ public void subtract(ProxyConfiguration other) {
7676
interfaceLists.removeAll(other.interfaceLists);
7777
}
7878

79-
public void addWithCondition(ConfigurationCondition condition, ProxyConfiguration other) {
79+
@Override
80+
public void mergeConditional(ConfigurationCondition condition, ProxyConfiguration other) {
8081
for (ConditionalElement<List<String>> interfaceList : other.interfaceLists) {
8182
add(condition, new ArrayList<>(interfaceList.getElement()));
8283
}

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ protected void removeIf(Predicate predicate) {
146146
bundles.entrySet().removeIf(entry -> predicate.testIncludedBundle(entry.getKey(), entry.getValue()));
147147
}
148148

149-
public void addWithCondition(ConfigurationCondition condition, ResourceConfiguration other) {
149+
@Override
150+
public void mergeConditional(ConfigurationCondition condition, ResourceConfiguration other) {
150151
for (Map.Entry<ConditionalElement<String>, Pattern> entry : other.addedResources.entrySet()) {
151152
addedResources.put(new ConditionalElement<>(condition, entry.getKey().getElement()), entry.getValue());
152153
}

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ protected void removeIf(Predicate predicate) {
7575
serializations.removeIf(predicate::testSerializationType);
7676
}
7777

78-
public void addWithCondition(ConfigurationCondition condition, SerializationConfiguration other) {
78+
@Override
79+
public void mergeConditional(ConfigurationCondition condition, SerializationConfiguration other) {
7980
for (SerializationConfigurationType type : other.serializations) {
8081
serializations.add(new SerializationConfigurationType(condition, type.getQualifiedJavaName(), type.getQualifiedCustomTargetConstructorJavaName()));
8182
}

0 commit comments

Comments
 (0)