Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions sdk/src/org.graalvm.collections/snapshot.sigtest
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> or
meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> org.graalvm.collections.MapCursor<{%%0},{%%1}> emptyCursor()
meth public void putAll(org.graalvm.collections.EconomicMap<{org.graalvm.collections.EconomicMap%0},{org.graalvm.collections.EconomicMap%1}>)
meth public void putAll(org.graalvm.collections.UnmodifiableEconomicMap<? extends {org.graalvm.collections.EconomicMap%0},? extends {org.graalvm.collections.EconomicMap%1}>)
meth public {org.graalvm.collections.EconomicMap%1} computeIfAbsent({org.graalvm.collections.EconomicMap%0},java.util.function.Function<? super {org.graalvm.collections.EconomicMap%0},? extends {org.graalvm.collections.EconomicMap%1}>)
meth public {org.graalvm.collections.EconomicMap%1} putIfAbsent({org.graalvm.collections.EconomicMap%0},{org.graalvm.collections.EconomicMap%1})

CLSS public final org.graalvm.collections.EconomicMapUtil
Expand Down Expand Up @@ -163,6 +164,7 @@ meth public abstract void clear()
meth public abstract void remove({org.graalvm.collections.EconomicSet%0})
meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create()
meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(int)
meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(java.lang.Iterable<{%%0}>)
meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(org.graalvm.collections.Equivalence)
meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(org.graalvm.collections.Equivalence,int)
meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(org.graalvm.collections.Equivalence,org.graalvm.collections.UnmodifiableEconomicSet<{%%0}>)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
Expand Down Expand Up @@ -42,6 +42,7 @@

import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Function;

/**
* Memory efficient map data structure that dynamically changes its representation depending on the
Expand Down Expand Up @@ -281,4 +282,21 @@ static <K, V> EconomicMap<K, V> of(K key1, V value1, K key2, V value2) {
map.put(key2, value2);
return map;
}

/**
* If the specified key is not already associated with a value (or is mapped to {@code null}),
* attempts to compute its value using the given mapping function and enters it into this map
* unless {@code null}.
*
* @since 25.1
*/
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
V value = get(key);
if (value == null) {
value = mappingFunction.apply(key);
put(key, value);
}
return value;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,7 @@ static <E> EconomicSet<E> create(Equivalence strategy) {

/**
* Creates a new set guaranteeing insertion order when iterating over its elements with the
* default {@link Equivalence#DEFAULT} comparison strategy and inserts all elements of the
* specified collection.
* default {@link Equivalence#DEFAULT} comparison strategy.
*
* @since 19.0
*/
Expand Down Expand Up @@ -207,6 +206,19 @@ static <E> EconomicSet<E> create(Equivalence strategy, UnmodifiableEconomicSet<E
return EconomicMapImpl.create(strategy, c, true);
}

/**
* Creates a new set guaranteeing insertion order when iterating over its elements with the
* default {@link Equivalence#DEFAULT} comparison strategy and inserts all elements of the
* specified iterable.
*
* @since 25.1
*/
static <E> EconomicSet<E> create(Iterable<E> c) {
EconomicSet<E> set = create();
set.addAll(c);
return set;
}

/**
* Return an empty, unmodifiable {@link EconomicSet}.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ public final Iterable<TypeFlow<?>> flows() {
private Iterator<TypeFlow<?>> flowsIterator() {
return new Iterator<>() {
final Deque<TypeFlow<?>> worklist = new ArrayDeque<>();
final Set<TypeFlow<?>> seen = new HashSet<>();
final Set<TypeFlow<?>> seen = new HashSet<>(); // no EconomicSet, null key is used
TypeFlow<?> next;

{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,7 @@
*/
package com.oracle.graal.pointsto.flow.builder;

import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Supplier;

import com.oracle.graal.pointsto.PointsToAnalysis;
Expand All @@ -39,6 +36,7 @@
import com.oracle.graal.pointsto.typestate.PointsToStats;

import jdk.graal.compiler.phases.common.LazyValue;
import org.graalvm.collections.EconomicSet;

/**
* The type flow builder is a node in the type flow builder graph. The {@link #useDependencies} and
Expand Down Expand Up @@ -90,9 +88,9 @@ private static boolean checkPredicate(PointsToAnalysis bb, Class<?> clazz, Objec
private final Class<T> flowClass;
private final LazyValue<T> lazyTypeFlowCreator;
/** Input dependency, i.e., builders that have this builder as an use. */
private final Set<TypeFlowBuilder<?>> useDependencies;
private final EconomicSet<TypeFlowBuilder<?>> useDependencies;
/** Input dependency, i.e., builders that have this builder as an observer. */
private final Set<TypeFlowBuilder<?>> observerDependencies;
private final EconomicSet<TypeFlowBuilder<?>> observerDependencies;
private boolean buildingAnActualParameter;
private boolean isMaterialized;

Expand All @@ -107,8 +105,8 @@ private TypeFlowBuilder(Object source, Object predicate, Class<T> flowClass, Laz
this.flowClass = flowClass;
this.source = source;
this.lazyTypeFlowCreator = creator;
this.useDependencies = new HashSet<>();
this.observerDependencies = new HashSet<>();
this.useDependencies = EconomicSet.create();
this.observerDependencies = EconomicSet.create();
this.buildingAnActualParameter = false;
this.isMaterialized = false;
this.predicate = predicate;
Expand Down Expand Up @@ -138,15 +136,15 @@ public void addUseDependency(TypeFlowBuilder<?> dependency) {
this.useDependencies.add(dependency);
}

Collection<TypeFlowBuilder<?>> getUseDependencies() {
Iterable<TypeFlowBuilder<?>> getUseDependencies() {
return useDependencies;
}

public void addObserverDependency(TypeFlowBuilder<?> dependency) {
this.observerDependencies.add(dependency);
}

Collection<TypeFlowBuilder<?>> getObserverDependencies() {
Iterable<TypeFlowBuilder<?>> getObserverDependencies() {
return observerDependencies;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,15 @@
import java.util.Arrays;
import java.util.ConcurrentModificationException;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

import org.graalvm.collections.EconomicSet;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.ProcessProperties;
import org.graalvm.nativeimage.hosted.Feature;
Expand Down Expand Up @@ -109,7 +108,7 @@ public final class NativeImageAgent extends JvmtiAgentBase<NativeImageAgentJNIHa
private Path configOutputDirPath;
private Path configOutputLockFilePath;
private FileTime expectedConfigModifiedBefore;
Set<String> classPathEntries;
EconomicSet<String> classPathEntries;

private static String getTokenValue(String token) {
return token.substring(token.indexOf('=') + 1);
Expand Down Expand Up @@ -287,7 +286,7 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c
return error(USAGE_ERROR, "The agent can generate conditional configuration either for the current run or in the partial mode but not both at the same time.");
}

classPathEntries = new HashSet<>(Arrays.asList(getClasspathEntries(jvmti)));
classPathEntries = EconomicSet.create(Arrays.asList(getClasspathEntries(jvmti)));

boolean isConditionalConfigurationRun = !conditionalConfigUserPackageFilterFiles.isEmpty() || conditionalConfigPartialRun;
boolean shouldTraceOriginInformation = configurationWithOrigins || isConditionalConfigurationRun;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,7 @@
import java.util.Arrays;
import java.util.Comparator;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;

Expand Down Expand Up @@ -70,13 +68,13 @@ public class CommonOptionParser {
*/
public static final class OptionParseResult {
private final EnumSet<OptionType> printFlags;
private final Set<String> optionNameFilter;
private final EconomicSet<String> optionNameFilter;
private final String error;
private final OptionKey<?> optionKey;
private final boolean optionUnrecognized;
private static final String EXTRA_HELP_OPTIONS_WILDCARD = "*";

OptionParseResult(EnumSet<OptionType> printFlags, String error, Set<String> optionNameFilter, OptionKey<?> optionKey, boolean optionUnrecognized) {
OptionParseResult(EnumSet<OptionType> printFlags, String error, EconomicSet<String> optionNameFilter, OptionKey<?> optionKey, boolean optionUnrecognized) {
this.printFlags = printFlags;
this.error = error;
this.optionNameFilter = optionNameFilter;
Expand All @@ -85,15 +83,15 @@ public static final class OptionParseResult {
}

private OptionParseResult(EnumSet<OptionType> printFlags, String error, OptionKey<?> optionKey) {
this(printFlags, error, new HashSet<>(), optionKey, false);
this(printFlags, error, EconomicSet.create(), optionKey, false);
}

static OptionParseResult error(String message) {
return new OptionParseResult(EnumSet.noneOf(OptionType.class), message, null);
}

static OptionParseResult optionUnrecognizedError(String message) {
return new OptionParseResult(EnumSet.noneOf(OptionType.class), message, new HashSet<>(), null, true);
return new OptionParseResult(EnumSet.noneOf(OptionType.class), message, EconomicSet.create(), null, true);
}

static OptionParseResult correct(OptionKey<?> optionKey) {
Expand All @@ -104,10 +102,10 @@ static OptionParseResult printFlags(EnumSet<OptionType> selectedOptionTypes) {
return new OptionParseResult(selectedOptionTypes, null, null);
}

static OptionParseResult printFlagsWithExtraHelp(Set<String> optionNameFilter) {
Set<String> optionNames = optionNameFilter;
static OptionParseResult printFlagsWithExtraHelp(EconomicSet<String> optionNameFilter) {
EconomicSet<String> optionNames = optionNameFilter;
if (optionNames.contains(EXTRA_HELP_OPTIONS_WILDCARD)) {
optionNames = new HashSet<>();
optionNames = EconomicSet.create();
optionNames.add(EXTRA_HELP_OPTIONS_WILDCARD);
}
return new OptionParseResult(EnumSet.noneOf(OptionType.class), null, optionNames, null, false);
Expand Down Expand Up @@ -292,7 +290,8 @@ public static OptionParseResult parseOption(EconomicMap<String, OptionDescriptor
if (CommonOptions.PrintFlagsWithExtraHelp.getName().equals(optionName)) {
String optionValue = (String) value;
String[] optionNames = StringUtil.split(optionValue, ",");
HashSet<String> selectedOptionNames = new HashSet<>(Arrays.asList(optionNames));
EconomicSet<String> selectedOptionNames = EconomicSet.create();
selectedOptionNames.addAll(Arrays.asList(optionNames));
return OptionParseResult.printFlagsWithExtraHelp(selectedOptionNames);
}
return OptionParseResult.correct(optionKey);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,10 @@
*/
package com.oracle.svm.common.option;

import java.util.HashSet;
import java.util.Set;

import jdk.graal.compiler.core.common.util.CompilationAlarm;
import jdk.graal.compiler.hotspot.CompilerConfigurationFactory;
import jdk.graal.compiler.options.OptionKey;
import org.graalvm.collections.EconomicSet;

/**
* Native image uses its own mechanisms to handle certain options, resulting in some Graal options
Expand All @@ -39,7 +37,7 @@
*/
public final class IntentionallyUnsupportedOptions {

private static final Set<OptionKey<?>> unsupportedOptions = new HashSet<>();
private static final EconomicSet<OptionKey<?>> unsupportedOptions = EconomicSet.create();

static {
unsupportedOptions.add(CompilerConfigurationFactory.Options.CompilerConfiguration);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,12 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

import org.graalvm.collections.EconomicMap;
import org.graalvm.collections.EconomicSet;
import org.graalvm.nativeimage.ImageInfo;

import com.oracle.svm.util.LogUtils;
Expand Down Expand Up @@ -83,7 +81,7 @@ public static InputStream openStream(URI uri) throws IOException {
public static final String MODULE_KEY = "module";
public static final String GLOB_KEY = "glob";
public static final String BUNDLE_KEY = "bundle";
private final Map<String, Set<String>> seenUnknownAttributesByType = new HashMap<>();
private final EconomicMap<String, EconomicSet<String>> seenUnknownAttributesByType = EconomicMap.create();
private final EnumSet<ConfigurationParserOption> parserOptions;

protected ConfigurationParser(EnumSet<ConfigurationParserOption> parserOptions) {
Expand Down Expand Up @@ -149,14 +147,15 @@ public static EconomicMap<String, Object> asMap(Object data, String errorMessage
}

protected void checkAttributes(EconomicMap<String, Object> map, String type, Collection<String> requiredAttrs, Collection<String> optionalAttrs) {
Set<String> unseenRequired = new HashSet<>(requiredAttrs);
EconomicSet<String> unseenRequired = EconomicSet.create();
unseenRequired.addAll(requiredAttrs);
for (String key : map.getKeys()) {
unseenRequired.remove(key);
}
if (!unseenRequired.isEmpty()) {
throw new JsonParserException("Missing attribute(s) [" + String.join(", ", unseenRequired) + "] in " + type);
}
Set<String> unknownAttributes = new HashSet<>();
EconomicSet<String> unknownAttributes = EconomicSet.create();
for (String key : map.getKeys()) {
unknownAttributes.add(key);
}
Expand All @@ -170,7 +169,8 @@ protected void checkAttributes(EconomicMap<String, Object> map, String type, Col
if (unknownAttributes.size() > 0) {
String message = "Unknown attribute(s) [" + String.join(", ", unknownAttributes) + "] in " + type;
warnOrFailOnSchemaError(message);
Set<String> unknownAttributesForType = seenUnknownAttributesByType.computeIfAbsent(type, key -> new HashSet<>());

EconomicSet<String> unknownAttributesForType = seenUnknownAttributesByType.computeIfAbsent(type, key -> EconomicSet.create());
unknownAttributesForType.addAll(unknownAttributes);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,8 @@
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;

import com.oracle.svm.configure.ConfigurationUsageException;
Expand All @@ -50,6 +48,7 @@
import com.oracle.svm.util.LogUtils;

import jdk.graal.compiler.phases.common.LazyValue;
import org.graalvm.collections.EconomicSet;

public class ConfigurationGenerateCommand extends ConfigurationCommand {
@Override
Expand Down Expand Up @@ -310,11 +309,11 @@ private static void parseFilterFiles(ComplexFilter filter, List<URI> filterFiles

@SuppressWarnings("fallthrough")
private static void failIfAgentLockFilesPresent(ConfigurationFileCollection... collections) {
Set<String> paths = null;
EconomicSet<String> paths = null;
for (ConfigurationFileCollection coll : collections) {
for (URI path : coll.getDetectedAgentLockPaths()) {
if (paths == null) {
paths = new HashSet<>();
paths = EconomicSet.create();
}
paths.add(path.toString());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,7 @@
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import com.oracle.svm.configure.ConfigurationUsageException;
import com.oracle.svm.configure.config.ConfigurationSet;
Expand All @@ -44,6 +42,7 @@
import com.oracle.svm.configure.filters.FilterConfigurationParser;
import com.oracle.svm.configure.filters.HierarchyFilterNode;
import com.oracle.svm.configure.ConfigurationFile;
import org.graalvm.collections.EconomicSet;

public final class ConfigurationGenerateConditionalsCommand extends ConfigurationCommand {
@Override
Expand All @@ -53,10 +52,10 @@ public String getName() {

@Override
public void apply(Iterator<String> argumentsIterator) throws IOException {
Set<URI> configInputPaths = new HashSet<>();
Set<URI> configOutputPaths = new HashSet<>();
EconomicSet<URI> configInputPaths = EconomicSet.create();
EconomicSet<URI> configOutputPaths = EconomicSet.create();
URI userCodeFilterUri = null;
Set<URI> classNameFiltersUri = new HashSet<>();
EconomicSet<URI> classNameFiltersUri = EconomicSet.create();
while (argumentsIterator.hasNext()) {
String argument = argumentsIterator.next();
String[] optionValue = argument.split(OPTION_VALUE_SEP);
Expand Down
Loading