diff --git a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/ObjectKlass.java b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/ObjectKlass.java index 70ae1beaa40a..cc17b3eaa1d3 100644 --- a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/ObjectKlass.java +++ b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/ObjectKlass.java @@ -894,7 +894,7 @@ public Klass nest() { host = thisPool.resolvedKlassAt(this, nestHost.hostClassIndex); } catch (AbstractTruffleException e) { if (getJavaVersion().java15OrLater()) { - getContext().getLogger().log(Level.FINE, "Exception while loading nest host class for " + this.getExternalName(), e); + getContext().getLogger().log(Level.FINE, e, () -> "Exception while loading nest host class for " + this.getExternalName()); // JVMS sect. 5.4.4: Any exception thrown as a result of failure of class or // interface resolution is not rethrown. host = this; @@ -904,7 +904,7 @@ public Klass nest() { } if (host != this && !host.nestMembersCheck(this)) { if (getJavaVersion().java15OrLater()) { - getContext().getLogger().log(Level.FINE, "Failed nest host class checks for " + this.getExternalName()); + getContext().getLogger().log(Level.FINE, () -> "Failed nest host class checks for " + this.getExternalName()); host = this; } else { Meta meta = getMeta(); @@ -930,9 +930,7 @@ public boolean nestMembersCheck(Klass k) { RuntimeConstantPool pool = getConstantPool(); for (int index : nestMembers.getClasses()) { if (k.getName().equals(pool.classAt(index).getName(pool))) { - if (k == pool.resolvedKlassAt(this, index)) { - return true; - } + return true; } } return false; @@ -983,14 +981,22 @@ public Klass[] getNestMembers() { klasses.add(nest()); for (int i = 0; i < nestMembers.getClasses().length; i++) { int index = nestMembers.getClasses()[i]; + Klass k; try { - klasses.add(pool.resolvedKlassAt(this, index)); - } catch (EspressoException e) { + k = pool.resolvedKlassAt(this, index); + } catch (AbstractTruffleException e) { /* * Don't allow badly constructed nest members to break execution here, only report * well-constructed entries. */ + getContext().getLogger().log(Level.FINE, e, () -> "Exception while loading nest host class for " + this.getExternalName()); + continue; + } + if (k.nest() != this) { + getContext().getLogger().log(Level.FINE, () -> "Skipping nest member with a different nest host class for " + this.getExternalName() + " member " + k + " with host " + k.nest()); + continue; } + klasses.add(k); } return klasses.toArray(Klass.EMPTY_ARRAY); }