Skip to content

Commit 254db91

Browse files
committed
tidy up handling of NodeClassMap for layered images
1 parent 5607520 commit 254db91

File tree

7 files changed

+74
-64
lines changed

7 files changed

+74
-64
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/GraphEncoder.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,8 @@ public class GraphEncoder {
161161
* graphs for Native Image runtime compilation must not use this map as it will contain
162162
* hosted-only types.
163163
*/
164-
@ObjectCopier.NotExternalValue(reason = "Needs to be persisted separately")
165-
private static final NodeClassMap GLOBAL_NODE_CLASS_MAP = new NodeClassMap();
164+
@ObjectCopier.NotExternalValue(reason = "Needs to be persisted separately") //
165+
public static final NodeClassMap GLOBAL_NODE_CLASS_MAP = new NodeClassMap();
166166

167167
private final InliningLogCodec inliningLogCodec;
168168

substratevm/src/com.oracle.svm.hosted/resources/SharedLayerSnapshotCapnProtoSchema.capnp

+1-1
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ struct SharedLayerSnapshot {
277277
layeredRuntimeMetadataSingleton @17 :LayeredRuntimeMetadataSingleton;
278278
dynamicHubInfos @18 :List(DynamicHubInfo);
279279
hostedMethods @19 :List(PersistedHostedMethod);
280-
globalNodeClassMapLocation @20 :Text;
280+
nodeClassMapLocation @20 :Text;
281281
}
282282

283283
struct StaticFinalFieldFoldingSingleton {

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1041,7 +1041,7 @@ protected void setupNativeImage(String imageName, OptionValues options, Map<Meth
10411041
bb = createBigBang(debug, options, aUniverse, aMetaAccess, aProviders, annotationSubstitutions);
10421042
aUniverse.setBigBang(bb);
10431043
if (imageLayerLoader != null) {
1044-
imageLayerLoader.setGlobalNodeClassMap();
1044+
imageLayerLoader.initNodeClassMap();
10451045
}
10461046

10471047
/* Create the HeapScanner and install it into the universe. */

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerLoader.java

+17-8
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import java.util.stream.Stream;
5555
import java.util.stream.StreamSupport;
5656

57+
import jdk.graal.compiler.api.replacements.SnippetReflectionProvider;
5758
import jdk.graal.compiler.nodes.NodeClassMap;
5859
import org.graalvm.nativeimage.AnnotationAccess;
5960
import org.graalvm.nativeimage.ImageSingletons;
@@ -135,6 +136,7 @@
135136
import jdk.graal.compiler.core.common.SuppressFBWarnings;
136137
import jdk.graal.compiler.debug.GraalError;
137138
import jdk.graal.compiler.graph.Node;
139+
import jdk.graal.compiler.graph.NodeClass;
138140
import jdk.graal.compiler.graph.iterators.NodeIterable;
139141
import jdk.graal.compiler.java.BytecodeParser;
140142
import jdk.graal.compiler.nodes.ConstantNode;
@@ -191,7 +193,11 @@ public class SVMImageLayerLoader extends ImageLayerLoader {
191193
protected AnalysisMetaAccess metaAccess;
192194
protected HostedValuesProvider hostedValuesProvider;
193195
private final LayeredStaticFieldSupport layeredStaticFieldSupport = LayeredStaticFieldSupport.singleton();
194-
private NodeClassMap globalNodeClassMap;
196+
197+
/**
198+
* Used to decode {@link NodeClass} ids in {@link #getEncodedGraph}.
199+
*/
200+
private NodeClassMap nodeClassMap;
195201

196202
public SVMImageLayerLoader(SVMImageLayerSnapshotUtil imageLayerSnapshotUtil, HostedImageLayerBuildingSupport imageLayerBuildingSupport, SharedLayerSnapshot.Reader snapshot,
197203
FileChannel graphChannel, boolean useSharedLayerGraphs) {
@@ -220,10 +226,11 @@ public void setMetaAccess(AnalysisMetaAccess metaAccess) {
220226
this.metaAccess = metaAccess;
221227
}
222228

223-
public void setGlobalNodeClassMap() {
224-
byte[] encodedGlobalNodeClassMap = readEncodedObject(snapshot.getGlobalNodeClassMapLocation().toString());
225-
globalNodeClassMap = (NodeClassMap) ObjectCopier.decode(imageLayerSnapshotUtil.getGraphDecoder(this, null, universe.getSnippetReflection(), false, globalNodeClassMap),
226-
encodedGlobalNodeClassMap);
229+
public void initNodeClassMap() {
230+
assert nodeClassMap == null : "cannot re-initialize the nodeClassMap";
231+
byte[] encodedGlobalNodeClassMap = readEncodedObject(snapshot.getNodeClassMapLocation().toString());
232+
SVMImageLayerSnapshotUtil.AbstractSVMGraphDecoder decoder = imageLayerSnapshotUtil.getGraphDecoder(this, null, universe.getSnippetReflection(), null);
233+
nodeClassMap = (NodeClassMap) ObjectCopier.decode(decoder, encodedGlobalNodeClassMap);
227234
}
228235

229236
public void setHostedValuesProvider(HostedValuesProvider hostedValuesProvider) {
@@ -998,8 +1005,8 @@ private boolean hasGraph(AnalysisMethod analysisMethod, Function<PersistedAnalys
9981005

9991006
private EncodedGraph getEncodedGraph(AnalysisMethod analysisMethod, Text.Reader location) {
10001007
byte[] encodedAnalyzedGraph = readEncodedObject(location.toString());
1001-
EncodedGraph encodedGraph = (EncodedGraph) ObjectCopier.decode(imageLayerSnapshotUtil.getGraphDecoder(this, analysisMethod, universe.getSnippetReflection(), true, globalNodeClassMap),
1002-
encodedAnalyzedGraph);
1008+
SVMImageLayerSnapshotUtil.AbstractSVMGraphDecoder decoder = imageLayerSnapshotUtil.getGraphDecoder(this, analysisMethod, universe.getSnippetReflection(), nodeClassMap);
1009+
EncodedGraph encodedGraph = (EncodedGraph) ObjectCopier.decode(decoder, encodedAnalyzedGraph);
10031010
for (int i = 0; i < encodedGraph.getNumObjects(); ++i) {
10041011
if (encodedGraph.getObject(i) instanceof CGlobalDataInfo cGlobalDataInfo) {
10051012
encodedGraph.setObject(i, CGlobalDataFeature.singleton().registerAsAccessedOrGet(cGlobalDataInfo.getData()));
@@ -1040,7 +1047,9 @@ public void loadPriorStrengthenedGraphAnalysisElements(AnalysisMethod analysisMe
10401047
if (hasStrengthenedGraph(analysisMethod)) {
10411048
PersistedAnalysisMethod.Reader methodData = getMethodData(analysisMethod);
10421049
byte[] encodedAnalyzedGraph = readEncodedObject(methodData.getStrengthenedGraphLocation().toString());
1043-
EncodedGraph graph = (EncodedGraph) ObjectCopier.decode(imageLayerSnapshotUtil.getGraphHostedToAnalysisElementsDecoder(this, analysisMethod, universe.getSnippetReflection()),
1050+
SnippetReflectionProvider snippetReflection = universe.getSnippetReflection();
1051+
SVMImageLayerSnapshotUtil.AbstractSVMGraphDecoder decoder = imageLayerSnapshotUtil.getGraphHostedToAnalysisElementsDecoder(this, analysisMethod, snippetReflection, nodeClassMap);
1052+
EncodedGraph graph = (EncodedGraph) ObjectCopier.decode(decoder,
10441053
encodedAnalyzedGraph);
10451054
for (Object o : graph.getObjects()) {
10461055
if (o instanceof AnalysisMethod m) {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerSnapshotUtil.java

+34-39
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.net.URISyntaxException;
3737
import java.util.List;
3838
import java.util.Map;
39+
import java.util.Objects;
3940
import java.util.Set;
4041
import java.util.concurrent.ConcurrentHashMap;
4142
import java.util.stream.Collectors;
@@ -231,16 +232,19 @@ private static Set<Integer> getRelinkedFields(AnalysisType type, Set<Field> type
231232
return typeRelinkedFieldsSet.stream().map(metaAccess::lookupJavaField).map(AnalysisField::getPosition).collect(Collectors.toSet());
232233
}
233234

234-
public SVMGraphEncoder getGraphEncoder(boolean graph) {
235-
return new SVMGraphEncoder(externalValues, graph);
235+
public SVMGraphEncoder getGraphEncoder(NodeClassMap nodeClassMap) {
236+
return new SVMGraphEncoder(externalValues, nodeClassMap);
236237
}
237238

238-
public AbstractSVMGraphDecoder getGraphHostedToAnalysisElementsDecoder(SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider) {
239-
return new SVMGraphHostedToAnalysisElementsDecoder(EncodedGraph.class.getClassLoader(), imageLayerLoader, analysisMethod, snippetReflectionProvider);
239+
public AbstractSVMGraphDecoder getGraphHostedToAnalysisElementsDecoder(SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider,
240+
NodeClassMap nodeClassMap) {
241+
242+
return new SVMGraphHostedToAnalysisElementsDecoder(EncodedGraph.class.getClassLoader(), imageLayerLoader, analysisMethod, snippetReflectionProvider, nodeClassMap);
240243
}
241244

242-
public AbstractSVMGraphDecoder getGraphDecoder(SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider, boolean graph, NodeClassMap globalNodeClassMap) {
243-
return new SVMGraphDecoder(EncodedGraph.class.getClassLoader(), imageLayerLoader, analysisMethod, snippetReflectionProvider, graph, globalNodeClassMap);
245+
public AbstractSVMGraphDecoder getGraphDecoder(SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod,
246+
SnippetReflectionProvider snippetReflectionProvider, NodeClassMap nodeClassMap) {
247+
return new SVMGraphDecoder(EncodedGraph.class.getClassLoader(), imageLayerLoader, analysisMethod, snippetReflectionProvider, nodeClassMap);
244248
}
245249

246250
/**
@@ -345,10 +349,8 @@ public static void forcePersistConstant(ImageHeapConstant imageHeapConstant) {
345349
}
346350

347351
public static class SVMGraphEncoder extends ObjectCopier.Encoder {
348-
public static final GlobalNodeClassMapBuiltin globalNodeClassMapBuiltin = new GlobalNodeClassMapBuiltin(null);
349-
350352
@SuppressWarnings("this-escape")
351-
public SVMGraphEncoder(Map<Object, Field> externalValues, boolean graph) {
353+
public SVMGraphEncoder(Map<Object, Field> externalValues, NodeClassMap nodeClassMap) {
352354
super(externalValues);
353355
addBuiltin(new ImageHeapConstantBuiltIn(null));
354356
addBuiltin(new AnalysisTypeBuiltIn(null));
@@ -362,8 +364,8 @@ public SVMGraphEncoder(Map<Object, Field> externalValues, boolean graph) {
362364
addBuiltin(new CInterfaceLocationIdentityBuiltIn());
363365
addBuiltin(new FastThreadLocalLocationIdentityBuiltIn());
364366
addBuiltin(new VMThreadLocalInfoBuiltIn());
365-
if (graph) {
366-
addBuiltin(globalNodeClassMapBuiltin);
367+
if (nodeClassMap != null) {
368+
addBuiltin(new NodeClassMapBuiltin(nodeClassMap));
367369
}
368370
}
369371

@@ -383,7 +385,8 @@ public abstract static class AbstractSVMGraphDecoder extends ObjectCopier.Decode
383385
private final HostedImageLayerBuildingSupport imageLayerBuildingSupport;
384386

385387
@SuppressWarnings("this-escape")
386-
public AbstractSVMGraphDecoder(ClassLoader classLoader, SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider, boolean graph, NodeClassMap globalMap) {
388+
public AbstractSVMGraphDecoder(ClassLoader classLoader, SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider,
389+
NodeClassMap nodeClassMap) {
387390
super(classLoader);
388391
this.imageLayerBuildingSupport = imageLayerLoader.getImageLayerBuildingSupport();
389392
addBuiltin(new ImageHeapConstantBuiltIn(imageLayerLoader));
@@ -396,9 +399,8 @@ public AbstractSVMGraphDecoder(ClassLoader classLoader, SVMImageLayerLoader imag
396399
addBuiltin(new CInterfaceLocationIdentityBuiltIn());
397400
addBuiltin(new FastThreadLocalLocationIdentityBuiltIn());
398401
addBuiltin(new VMThreadLocalInfoBuiltIn());
399-
// TODO: Read serialized NodeClassMap somehow and pass to constructor below
400-
if (graph) {
401-
addBuiltin(new GlobalNodeClassMapBuiltin(globalMap));
402+
if (nodeClassMap != null) {
403+
addBuiltin(new NodeClassMapBuiltin(nodeClassMap));
402404
}
403405
}
404406

@@ -411,53 +413,46 @@ public Class<?> loadClass(String className) {
411413
public static class SVMGraphHostedToAnalysisElementsDecoder extends AbstractSVMGraphDecoder {
412414
@SuppressWarnings("this-escape")
413415
public SVMGraphHostedToAnalysisElementsDecoder(ClassLoader classLoader, SVMImageLayerLoader svmImageLayerLoader, AnalysisMethod analysisMethod,
414-
SnippetReflectionProvider snippetReflectionProvider) {
415-
super(classLoader, svmImageLayerLoader, analysisMethod, snippetReflectionProvider, true, null);
416+
SnippetReflectionProvider snippetReflectionProvider, NodeClassMap nodeClassMap) {
417+
super(classLoader, svmImageLayerLoader, analysisMethod, snippetReflectionProvider, nodeClassMap);
416418
addBuiltin(new HostedToAnalysisTypeDecoderBuiltIn(svmImageLayerLoader));
417419
addBuiltin(new HostedToAnalysisMethodDecoderBuiltIn(svmImageLayerLoader));
418420
}
419421
}
420422

421423
public static class SVMGraphDecoder extends AbstractSVMGraphDecoder {
422424
@SuppressWarnings("this-escape")
423-
public SVMGraphDecoder(ClassLoader classLoader, SVMImageLayerLoader svmImageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider, boolean graph, NodeClassMap globalMap) {
424-
super(classLoader, svmImageLayerLoader, analysisMethod, snippetReflectionProvider, graph, globalMap);
425+
public SVMGraphDecoder(ClassLoader classLoader, SVMImageLayerLoader svmImageLayerLoader, AnalysisMethod analysisMethod,
426+
SnippetReflectionProvider snippetReflectionProvider, NodeClassMap nodeClassMap) {
427+
super(classLoader, svmImageLayerLoader, analysisMethod, snippetReflectionProvider, nodeClassMap);
425428
addBuiltin(new HostedTypeBuiltIn(svmImageLayerLoader));
426429
addBuiltin(new HostedMethodBuiltIn(svmImageLayerLoader));
427430
}
428431
}
429432

430-
public static class GlobalNodeClassMapBuiltin extends ObjectCopier.Builtin {
431-
private NodeClassMap globalMap;
433+
/**
434+
* Builtin to replace a {@link NodeClassMap} during encoding with a placeholder so that a single
435+
* map will be shared by all {@link EncodedGraph}s processed by a
436+
* {@link jdk.graal.compiler.util.ObjectCopier.Encoder}.
437+
*/
438+
public static class NodeClassMapBuiltin extends ObjectCopier.Builtin {
439+
private final NodeClassMap nodeClassMap;
432440

433-
protected GlobalNodeClassMapBuiltin(NodeClassMap map) {
441+
protected NodeClassMapBuiltin(NodeClassMap nodeClassMap) {
434442
super(NodeClassMap.class);
435-
this.globalMap = map;
443+
this.nodeClassMap = Objects.requireNonNull(nodeClassMap);
436444
}
437445

438446
@Override
439447
public void encode(ObjectCopier.Encoder encoder, ObjectCopierOutputStream stream, Object obj) throws IOException {
440-
if (globalMap == null) {
441-
globalMap = (NodeClassMap) obj;
442-
} else if (globalMap != obj) {
443-
throw AnalysisError.shouldNotReachHere("More than one NodeClassMap instance encountered");
448+
if (nodeClassMap != obj) {
449+
throw AnalysisError.shouldNotReachHere("Unexpected NodeClassMap instance encountered");
444450
}
445451
}
446452

447453
@Override
448454
protected Object decode(ObjectCopier.Decoder decoder, Class<?> concreteType, ObjectCopierInputStream stream) throws IOException {
449-
if (globalMap == null) {
450-
throw AnalysisError.shouldNotReachHere("Global NodeClassMap not set");
451-
}
452-
return globalMap;
453-
}
454-
455-
public NodeClassMap getGlobalMap() {
456-
return globalMap;
457-
}
458-
459-
public void setGlobalMap(NodeClassMap globalMap) {
460-
this.globalMap = globalMap;
455+
return nodeClassMap;
461456
}
462457
}
463458

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerWriter.java

+12-6
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@
6767
import java.util.stream.IntStream;
6868
import java.util.stream.Stream;
6969

70+
import jdk.graal.compiler.graph.NodeClass;
71+
import jdk.graal.compiler.nodes.GraphEncoder;
7072
import org.graalvm.collections.EconomicMap;
7173
import org.graalvm.collections.MapCursor;
7274
import org.graalvm.nativeimage.AnnotationAccess;
@@ -202,6 +204,11 @@ public class SVMImageLayerWriter extends ImageLayerWriter {
202204

203205
private boolean polymorphicSignatureSealed = false;
204206

207+
/**
208+
* Used to encode {@link NodeClass} ids in {@link #persistGraph}.
209+
*/
210+
private NodeClassMap nodeClassMap = GraphEncoder.GLOBAL_NODE_CLASS_MAP;
211+
205212
private record ConstantParent(int constantId, int index) {
206213
static ConstantParent NONE = new ConstantParent(UNDEFINED_CONSTANT_ID, UNDEFINED_FIELD_INDEX);
207214
}
@@ -298,11 +305,10 @@ public void openGraphsOutput(Path layerGraphsPath, String fileName, String suffi
298305
}
299306

300307
public void dumpFiles() {
301-
SVMImageLayerSnapshotUtil.SVMGraphEncoder graphEncoder = imageLayerSnapshotUtil.getGraphEncoder(false);
302-
NodeClassMap globalMap = SVMImageLayerSnapshotUtil.SVMGraphEncoder.globalNodeClassMapBuiltin.getGlobalMap();
303-
byte[] encodedGlobalMap = ObjectCopier.encode(graphEncoder, globalMap);
304-
String location = graphsOutput.add(encodedGlobalMap);
305-
snapshotBuilder.setGlobalNodeClassMapLocation(location);
308+
SVMImageLayerSnapshotUtil.SVMGraphEncoder graphEncoder = imageLayerSnapshotUtil.getGraphEncoder(null);
309+
byte[] encodedNodeClassMap = ObjectCopier.encode(graphEncoder, nodeClassMap);
310+
String location = graphsOutput.add(encodedNodeClassMap);
311+
snapshotBuilder.setNodeClassMapLocation(location);
306312

307313
graphsOutput.finish();
308314

@@ -1069,7 +1075,7 @@ private String persistGraph(AnalysisMethod method, EncodedGraph analyzedGraph) {
10691075
*/
10701076
return null;
10711077
}
1072-
byte[] encodedGraph = ObjectCopier.encode(imageLayerSnapshotUtil.getGraphEncoder(true), analyzedGraph);
1078+
byte[] encodedGraph = ObjectCopier.encode(imageLayerSnapshotUtil.getGraphEncoder(nodeClassMap), analyzedGraph);
10731079
if (contains(encodedGraph, LambdaUtils.LAMBDA_CLASS_NAME_SUBSTRING.getBytes(StandardCharsets.UTF_8))) {
10741080
throw AnalysisError.shouldNotReachHere("The graph for the method %s contains a reference to a lambda type, which cannot be decoded: %s".formatted(method, encodedGraph));
10751081
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SharedLayerSnapshotCapnProtoSchemaHolder.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -4817,19 +4817,19 @@ public final void setHostedMethods(com.oracle.svm.shaded.org.capnproto.StructLis
48174817
public final com.oracle.svm.shaded.org.capnproto.StructList.Builder<com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.PersistedHostedMethod.Builder> initHostedMethods(int size) {
48184818
return _initPointerField(com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.PersistedHostedMethod.listFactory, 11, size);
48194819
}
4820-
public final boolean hasGlobalNodeClassMapLocation() {
4820+
public final boolean hasNodeClassMapLocation() {
48214821
return !_pointerFieldIsNull(12);
48224822
}
4823-
public final com.oracle.svm.shaded.org.capnproto.Text.Builder getGlobalNodeClassMapLocation() {
4823+
public final com.oracle.svm.shaded.org.capnproto.Text.Builder getNodeClassMapLocation() {
48244824
return _getPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 12, null, 0, 0);
48254825
}
4826-
public final void setGlobalNodeClassMapLocation(com.oracle.svm.shaded.org.capnproto.Text.Reader value) {
4826+
public final void setNodeClassMapLocation(com.oracle.svm.shaded.org.capnproto.Text.Reader value) {
48274827
_setPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 12, value);
48284828
}
4829-
public final void setGlobalNodeClassMapLocation(String value) {
4829+
public final void setNodeClassMapLocation(String value) {
48304830
_setPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 12, new com.oracle.svm.shaded.org.capnproto.Text.Reader(value));
48314831
}
4832-
public final com.oracle.svm.shaded.org.capnproto.Text.Builder initGlobalNodeClassMapLocation(int size) {
4832+
public final com.oracle.svm.shaded.org.capnproto.Text.Builder initNodeClassMapLocation(int size) {
48334833
return _initPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 12, size);
48344834
}
48354835
}
@@ -4955,10 +4955,10 @@ public final com.oracle.svm.shaded.org.capnproto.StructList.Reader<com.oracle.sv
49554955
return _getPointerField(com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.PersistedHostedMethod.listFactory, 11, null, 0);
49564956
}
49574957

4958-
public boolean hasGlobalNodeClassMapLocation() {
4958+
public boolean hasNodeClassMapLocation() {
49594959
return !_pointerFieldIsNull(12);
49604960
}
4961-
public com.oracle.svm.shaded.org.capnproto.Text.Reader getGlobalNodeClassMapLocation() {
4961+
public com.oracle.svm.shaded.org.capnproto.Text.Reader getNodeClassMapLocation() {
49624962
return _getPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 12, null, 0, 0);
49634963
}
49644964

0 commit comments

Comments
 (0)