Skip to content

Commit 1f0ad4c

Browse files
committed
Replace streams with indexed for-loops.
1 parent 7c93f0d commit 1f0ad4c

File tree

7 files changed

+313
-119
lines changed

7 files changed

+313
-119
lines changed

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HostedLayeredModuleSingleton.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,14 @@
2929
import java.util.HashSet;
3030
import java.util.Map;
3131
import java.util.Set;
32-
import java.util.stream.Collectors;
3332

3433
import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton;
3534
import com.oracle.svm.core.imagelayer.BuildingInitialLayerPredicate;
3635
import com.oracle.svm.core.jdk.LayeredModuleSingleton;
3736
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader;
3837
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter;
3938
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
40-
import com.oracle.svm.hosted.imagelayer.SVMImageLayerLoader;
39+
import com.oracle.svm.hosted.imagelayer.CapnProtoAdapters;
4140
import com.oracle.svm.hosted.imagelayer.SVMImageLayerSingletonLoader;
4241
import com.oracle.svm.hosted.imagelayer.SVMImageLayerWriter;
4342
import com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.ModulePackages;
@@ -103,7 +102,7 @@ private static Map<String, Map<String, Set<String>>> getModulePackages(StructLis
103102
Map<String, Set<String>> packages = new HashMap<>();
104103
for (int j = 0; j < packagesReader.size(); ++j) {
105104
var packageEntryReader = packagesReader.get(j);
106-
HashSet<String> modules = SVMImageLayerLoader.streamStrings(packageEntryReader.getModules()).collect(Collectors.toCollection(HashSet::new));
105+
Set<String> modules = CapnProtoAdapters.toCollection(packageEntryReader.getModules(), HashSet::new);
107106
packages.put(packageEntryReader.getPackageKey().toString(), modules);
108107
}
109108
modulePackages.put(entryReader.getModuleKey().toString(), packages);

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SharedLayerBootLayerModulesSingleton.java

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

27+
import java.util.ArrayList;
2728
import java.util.Collection;
2829
import java.util.EnumSet;
2930
import java.util.List;
3031
import java.util.stream.Stream;
3132

33+
import com.oracle.svm.hosted.imagelayer.CapnProtoAdapters;
3234
import org.graalvm.nativeimage.ImageSingletons;
3335
import org.graalvm.nativeimage.Platform;
3436
import org.graalvm.nativeimage.Platforms;
@@ -39,7 +41,6 @@
3941
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter;
4042
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
4143
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
42-
import com.oracle.svm.hosted.imagelayer.SVMImageLayerLoader;
4344
import com.oracle.svm.hosted.imagelayer.SVMImageLayerSingletonLoader;
4445
import com.oracle.svm.hosted.imagelayer.SVMImageLayerWriter;
4546

@@ -91,7 +92,7 @@ public PersistFlags preparePersist(ImageSingletonWriter writer) {
9192
@SuppressWarnings("unused")
9293
public static Object createFromLoader(ImageSingletonLoader loader) {
9394
SVMImageLayerSingletonLoader.ImageSingletonLoaderImpl loaderImpl = (SVMImageLayerSingletonLoader.ImageSingletonLoaderImpl) loader;
94-
List<String> moduleNames = SVMImageLayerLoader.streamStrings(loaderImpl.getSnapshotReader().getSharedLayerBootLayerModules()).toList();
95+
List<String> moduleNames = CapnProtoAdapters.toCollection(loaderImpl.getSnapshotReader().getSharedLayerBootLayerModules(), ArrayList::new);
9596
return new SharedLayerBootLayerModulesSingleton(moduleNames);
9697
}
9798
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/RuntimeMetadataEncoderImpl.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@
6666
import java.util.TreeSet;
6767
import java.util.function.BiConsumer;
6868
import java.util.function.Consumer;
69-
import java.util.stream.Collectors;
7069

70+
import com.oracle.svm.hosted.imagelayer.CapnProtoAdapters;
7171
import org.graalvm.collections.Pair;
7272
import org.graalvm.nativeimage.AnnotationAccess;
7373
import org.graalvm.nativeimage.ImageSingletons;
@@ -104,7 +104,6 @@
104104
import com.oracle.svm.hosted.annotation.TypeAnnotationValue;
105105
import com.oracle.svm.hosted.image.NativeImageCodeCache.ReflectionMetadataEncoderFactory;
106106
import com.oracle.svm.hosted.image.NativeImageCodeCache.RuntimeMetadataEncoder;
107-
import com.oracle.svm.hosted.imagelayer.SVMImageLayerLoader;
108107
import com.oracle.svm.hosted.imagelayer.SVMImageLayerSingletonLoader;
109108
import com.oracle.svm.hosted.imagelayer.SVMImageLayerWriter;
110109
import com.oracle.svm.hosted.meta.HostedField;
@@ -1312,8 +1311,8 @@ public static Object createFromLoader(ImageSingletonLoader loader) {
13121311
SVMImageLayerSingletonLoader.ImageSingletonLoaderImpl loaderImpl = (SVMImageLayerSingletonLoader.ImageSingletonLoaderImpl) loader;
13131312
var reader = loaderImpl.getSnapshotReader().getLayeredRuntimeMetadataSingleton();
13141313

1315-
Set<Integer> registeredMethods = SVMImageLayerLoader.streamInts(reader.getMethods()).boxed().collect(Collectors.toCollection(HashSet::new));
1316-
Set<Integer> registeredFields = SVMImageLayerLoader.streamInts(reader.getFields()).boxed().collect(Collectors.toCollection(HashSet::new));
1314+
Set<Integer> registeredMethods = CapnProtoAdapters.toCollection(reader.getMethods(), Integer::valueOf, HashSet::new);
1315+
Set<Integer> registeredFields = CapnProtoAdapters.toCollection(reader.getFields(), Integer::valueOf, HashSet::new);
13171316
return new LayeredRuntimeMetadataSingleton(registeredMethods, registeredFields);
13181317
}
13191318
}
Lines changed: 277 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,277 @@
1+
/*
2+
* Copyright (c) 2025, 2025, 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.hosted.imagelayer;
26+
27+
import java.util.Collection;
28+
import java.util.function.Consumer;
29+
import java.util.function.Function;
30+
import java.util.function.IntConsumer;
31+
import java.util.function.IntFunction;
32+
import java.util.function.Supplier;
33+
import java.util.function.ToIntFunction;
34+
35+
import com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.PrimitiveArray;
36+
import com.oracle.svm.shaded.org.capnproto.PrimitiveList;
37+
import com.oracle.svm.shaded.org.capnproto.StructList;
38+
import com.oracle.svm.shaded.org.capnproto.StructReader;
39+
import com.oracle.svm.shaded.org.capnproto.TextList;
40+
41+
/**
42+
* Collection of adapters to interact with the Cap'n Proto internal value representation.
43+
*/
44+
public class CapnProtoAdapters {
45+
/**
46+
* Iterate values from a {@link PrimitiveList.Int} reader and pass them to the action.
47+
*/
48+
static void forEach(PrimitiveList.Int.Reader reader, IntConsumer action) {
49+
for (int i = 0; i < reader.size(); i++) {
50+
action.accept(reader.get(i));
51+
}
52+
}
53+
54+
/**
55+
* Iterate values from a {@link TextList} reader and pass them to the action.
56+
*/
57+
public static void forEach(TextList.Reader reader, Consumer<String> action) {
58+
for (int i = 0; i < reader.size(); i++) {
59+
action.accept(reader.get(i).toString());
60+
}
61+
}
62+
63+
/**
64+
* Iterate values from a {@link PrimitiveList.Int} reader, apply the mapping function, then
65+
* store them in the supplied array at the same index.
66+
*/
67+
static <T> T[] toArray(PrimitiveList.Int.Reader reader, IntFunction<? extends T> mapper, IntFunction<T[]> arrayGenerator) {
68+
T[] array = arrayGenerator.apply(reader.size());
69+
for (int i = 0; i < reader.size(); i++) {
70+
array[i] = mapper.apply(reader.get(i));
71+
}
72+
return array;
73+
}
74+
75+
/**
76+
* Iterate values from a {@link StructList} reader, apply the mapping function, then store them
77+
* in the supplied array at the same index.
78+
*/
79+
static <R, T> T[] toArray(StructList.Reader<R> reader, Function<? super R, ? extends T> mapper, IntFunction<T[]> arrayGenerator) {
80+
T[] array = arrayGenerator.apply(reader.size());
81+
for (int i = 0; i < reader.size(); i++) {
82+
array[i] = mapper.apply(reader.get(i));
83+
}
84+
return array;
85+
}
86+
87+
/**
88+
* Iterate values from a {@link TextList} reader, convert them to {@link String}, apply the
89+
* mapping function, then store them in the supplied array at the same index.
90+
*/
91+
static <T> T[] toArray(TextList.Reader reader, Function<String, ? extends T> mapper, IntFunction<T[]> arrayGenerator) {
92+
T[] array = arrayGenerator.apply(reader.size());
93+
for (int i = 0; i < reader.size(); i++) {
94+
array[i] = mapper.apply(reader.get(i).toString());
95+
}
96+
return array;
97+
}
98+
99+
/**
100+
* Iterate values from a {@link PrimitiveList.Int} reader, apply the mapping function, then
101+
* collect them in the supplied collection.
102+
*/
103+
public static <T, U extends Collection<T>> U toCollection(PrimitiveList.Int.Reader reader, IntFunction<? extends T> mapper, Supplier<U> collectionFactory) {
104+
U collection = collectionFactory.get();
105+
for (int i = 0; i < reader.size(); i++) {
106+
collection.add(mapper.apply(reader.get(i)));
107+
}
108+
return collection;
109+
}
110+
111+
/**
112+
* Iterate values from a {@link TextList} reader, convert them to {@link String}, then collect
113+
* them in the supplied collection.
114+
*/
115+
public static <U extends Collection<String>> U toCollection(TextList.Reader reader, Supplier<U> collectionFactory) {
116+
return toCollection(reader, (s) -> s, collectionFactory);
117+
}
118+
119+
/**
120+
* Iterate values from a {@link TextList} reader, convert them to {@link String}, apply the
121+
* mapping function, then collect them in the supplied collection.
122+
*/
123+
public static <T, U extends Collection<T>> U toCollection(TextList.Reader reader, Function<String, ? extends T> mapper, Supplier<U> collectionFactory) {
124+
U collection = collectionFactory.get();
125+
for (int i = 0; i < reader.size(); i++) {
126+
collection.add(mapper.apply(reader.get(i).toString()));
127+
}
128+
return collection;
129+
}
130+
131+
/**
132+
* Extract values from a {@link PrimitiveArray} reader to the corresponding Java primitive
133+
* array.
134+
*/
135+
static Object toArray(PrimitiveArray.Reader reader) {
136+
return switch (reader.which()) {
137+
case Z -> toBooleanArray(reader.getZ());
138+
case B -> toByteArray(reader.getB());
139+
case S -> toShortArray(reader.getS());
140+
case C -> toCharArray(reader.getC());
141+
case I -> toIntArray(reader.getI());
142+
case F -> toFloatArray(reader.getF());
143+
case J -> toLongArray(reader.getJ());
144+
case D -> toDoubleArray(reader.getD());
145+
case _NOT_IN_SCHEMA -> throw new IllegalArgumentException("Unsupported kind: " + reader.which());
146+
};
147+
}
148+
149+
/**
150+
* Extract values from a {@link PrimitiveList.Boolean} reader to a {@code boolean[]} array.
151+
*/
152+
protected static boolean[] toBooleanArray(PrimitiveList.Boolean.Reader booleanReader) {
153+
boolean[] booleanArray = new boolean[booleanReader.size()];
154+
for (int i = 0; i < booleanReader.size(); i++) {
155+
booleanArray[i] = booleanReader.get(i);
156+
}
157+
return booleanArray;
158+
}
159+
160+
/**
161+
* Extract values from a {@link PrimitiveList.Byte} reader to a {@code byte[]} array.
162+
*/
163+
static byte[] toByteArray(PrimitiveList.Byte.Reader byteReader) {
164+
byte[] byteArray = new byte[byteReader.size()];
165+
for (int i = 0; i < byteReader.size(); i++) {
166+
byteArray[i] = byteReader.get(i);
167+
}
168+
return byteArray;
169+
}
170+
171+
/**
172+
* Extract values from a {@link PrimitiveList.Short} reader to a {@code short[]} array.
173+
*/
174+
static short[] toShortArray(PrimitiveList.Short.Reader shortReader) {
175+
short[] shortArray = new short[shortReader.size()];
176+
for (int i = 0; i < shortReader.size(); i++) {
177+
shortArray[i] = shortReader.get(i);
178+
}
179+
return shortArray;
180+
}
181+
182+
/**
183+
* Extract values from a {@link PrimitiveList.Short} reader to a {@code char[]} array.
184+
*/
185+
static char[] toCharArray(PrimitiveList.Short.Reader charReader) {
186+
char[] charArray = new char[charReader.size()];
187+
for (int i = 0; i < charReader.size(); i++) {
188+
charArray[i] = (char) charReader.get(i);
189+
}
190+
return charArray;
191+
}
192+
193+
/**
194+
* Extract values from a {@link PrimitiveList.Int} reader to a {@code int[]} array.
195+
*/
196+
public static int[] toIntArray(PrimitiveList.Int.Reader intReader) {
197+
int[] intArray = new int[intReader.size()];
198+
for (int i = 0; i < intReader.size(); i++) {
199+
intArray[i] = intReader.get(i);
200+
}
201+
return intArray;
202+
}
203+
204+
/**
205+
* Extract values from a {@link PrimitiveList.Float} reader to a {@code float[]} array.
206+
*/
207+
static float[] toFloatArray(PrimitiveList.Float.Reader floatReader) {
208+
float[] floatArray = new float[floatReader.size()];
209+
for (int i = 0; i < floatReader.size(); i++) {
210+
floatArray[i] = floatReader.get(i);
211+
}
212+
return floatArray;
213+
}
214+
215+
/**
216+
* Extract values from a {@link PrimitiveList.Long} reader to a {@code long[]} array.
217+
*/
218+
static long[] toLongArray(PrimitiveList.Long.Reader longReader) {
219+
long[] longArray = new long[longReader.size()];
220+
for (int i = 0; i < longReader.size(); i++) {
221+
longArray[i] = longReader.get(i);
222+
}
223+
return longArray;
224+
}
225+
226+
/**
227+
* Extract values from a {@link PrimitiveList.Double} reader to a {@code double[]} array.
228+
*/
229+
static double[] toDoubleArray(PrimitiveList.Double.Reader doubleReader) {
230+
double[] doubleArray = new double[doubleReader.size()];
231+
for (int i = 0; i < doubleReader.size(); i++) {
232+
doubleArray[i] = doubleReader.get(i);
233+
}
234+
return doubleArray;
235+
}
236+
237+
/**
238+
* Extract values from a {@link TextList} reader to a {@code String[]} array.
239+
*/
240+
public static String[] toStringArray(TextList.Reader reader) {
241+
return toArray(reader, (s) -> s, String[]::new);
242+
}
243+
244+
/**
245+
* Find the value containing the given {@code key} in a {@link StructList} reader, applying the
246+
* {@code keyExtractor} to searched values. The input list should be sorted by the {@code key}
247+
* and contain no duplicates.
248+
*
249+
* @return the found value or {@code null}
250+
*/
251+
static <T extends StructReader> T binarySearchUnique(int key, StructList.Reader<T> sortedList, ToIntFunction<T> keyExtractor) {
252+
int low = 0;
253+
int high = sortedList.size() - 1;
254+
255+
int prevMid = -1;
256+
int prevKey = 0;
257+
while (low <= high) {
258+
int mid = (low + high) >>> 1;
259+
T midStruct = sortedList.get(mid);
260+
int midKey = keyExtractor.applyAsInt(midStruct);
261+
262+
assert prevMid == -1 || (mid < prevMid && midKey < prevKey) || (mid > prevMid && midKey > prevKey) : "unsorted or contains duplicates";
263+
264+
if (midKey < key) {
265+
low = mid + 1;
266+
} else if (midKey > key) {
267+
high = mid - 1;
268+
} else {
269+
return midStruct;
270+
}
271+
272+
prevMid = mid;
273+
prevKey = midKey;
274+
}
275+
return null;
276+
}
277+
}

0 commit comments

Comments
 (0)