Skip to content

Commit 287885e

Browse files
Fix JVM_GetSystemPackage(s)
* Avoid NPE when the package entry is not found * Don't list package for which no class was loaded. This must be directly tied to which packages were seen in `BootClassRegistry.loadKlassImpl` and thus have a "boot classpath location".
1 parent ff759bc commit 287885e

File tree

3 files changed

+16
-16
lines changed

3 files changed

+16
-16
lines changed

espresso/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/tables/EntryTable.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@
2626
import java.util.Objects;
2727
import java.util.concurrent.locks.Lock;
2828
import java.util.concurrent.locks.ReadWriteLock;
29+
import java.util.function.BiConsumer;
2930
import java.util.function.Consumer;
3031

32+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
3133
import com.oracle.truffle.espresso.classfile.descriptors.Name;
3234
import com.oracle.truffle.espresso.classfile.descriptors.Symbol;
3335

@@ -49,10 +51,11 @@ public void collectValues(Consumer<T> consumer) {
4951
}
5052
}
5153

52-
@SuppressWarnings({"try", "unchecked", "rawtypes"})
53-
public Symbol<Name>[] getKeys() {
54+
@SuppressWarnings("try")
55+
@TruffleBoundary
56+
public void collectEntries(BiConsumer<Symbol<Name>, T> consumer) {
5457
try (BlockLock block = read()) {
55-
return entries.keySet().toArray(new Symbol[entries.size()]);
58+
entries.forEach(consumer::accept);
5659
}
5760
}
5861

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/BootClassRegistry.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@
2323

2424
package com.oracle.truffle.espresso.impl;
2525

26-
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
2726
import com.oracle.truffle.espresso.classfile.ClasspathFile;
28-
import com.oracle.truffle.espresso.classfile.descriptors.Name;
2927
import com.oracle.truffle.espresso.classfile.descriptors.Symbol;
3028
import com.oracle.truffle.espresso.classfile.descriptors.Type;
3129
import com.oracle.truffle.espresso.classfile.descriptors.TypeSymbols;
@@ -82,11 +80,6 @@ public Klass loadKlassImpl(EspressoContext context, Symbol<Type> type) throws Es
8280
return result;
8381
}
8482

85-
@TruffleBoundary
86-
public Symbol<Name>[] getPackages() {
87-
return packages().getKeys();
88-
}
89-
9083
@Override
9184
public @JavaType(ClassLoader.class) StaticObject getClassLoader() {
9285
return StaticObject.NULL;

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/vm/VM.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,9 @@ public static void JVM_GC() {
550550
}
551551
BootClassRegistry bootClassRegistry = getRegistries().getBootClassRegistry();
552552
PackageEntry packageEntry = bootClassRegistry.packages().lookup(pkgName);
553+
if (packageEntry == null) {
554+
return StaticObject.NULL;
555+
}
553556
ModuleEntry moduleEntry = packageEntry.module();
554557
if (moduleEntry != null) {
555558
String location = moduleEntry.location();
@@ -562,12 +565,13 @@ public static void JVM_GC() {
562565

563566
@VmImpl(isJni = true)
564567
public @JavaType(String[].class) StaticObject JVM_GetSystemPackages(@Inject Meta meta) {
565-
Symbol<Name>[] packageSymbols = getRegistries().getBootClassRegistry().getPackages();
566-
StaticObject[] array = new StaticObject[packageSymbols.length];
567-
for (int i = 0; i < packageSymbols.length; i++) {
568-
array[i] = meta.toGuestString(packageSymbols[i]);
569-
}
570-
return StaticObject.createArray(meta.java_lang_String.getArrayClass(), array, getContext());
568+
List<StaticObject> packageNames = new ArrayList<>();
569+
getRegistries().getBootClassRegistry().packages().collectEntries((s, p) -> {
570+
if (p.getBootClasspathLocation() != null) {
571+
packageNames.add(meta.toGuestString(s));
572+
}
573+
});
574+
return StaticObject.createArray(meta.java_lang_String.getArrayClass(), packageNames.toArray(new StaticObject[packageNames.size()]), getContext());
571575
}
572576

573577
@VmImpl

0 commit comments

Comments
 (0)