Skip to content

Commit d8b4280

Browse files
Improve throwing errors happening during linking one renewed linking attempts
1 parent 2ac3902 commit d8b4280

File tree

1 file changed

+32
-22
lines changed
  • espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl

1 file changed

+32
-22
lines changed

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

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ public final class ObjectKlass extends Klass {
133133
@CompilationFinal //
134134
private volatile int initState = LOADED;
135135

136+
@CompilationFinal //
137+
private EspressoException linkError;
138+
136139
@CompilationFinal volatile KlassVersion klassVersion;
137140

138141
// instance and hidden fields declared in this class and in its super classes
@@ -157,7 +160,7 @@ public final class ObjectKlass extends Klass {
157160
public static final int LOADED = 0;
158161
public static final int LINKING = 1;
159162
public static final int VERIFYING = 2;
160-
public static final int FAILED_VERIFICATION = 3;
163+
public static final int FAILED_LINK = 3;
161164
public static final int VERIFIED = 4;
162165
public static final int PREPARED = 5;
163166
public static final int LINKED = 6;
@@ -597,7 +600,7 @@ private void checkLoadingConstraints() {
597600
@Override
598601
public void ensureLinked() {
599602
if (!isLinked()) {
600-
checkErroneousVerification();
603+
checkErroneousLink();
601604
if (CompilerDirectives.isCompilationConstant(this)) {
602605
CompilerDirectives.transferToInterpreterAndInvalidate();
603606
}
@@ -611,20 +614,30 @@ private void doLink() {
611614
try {
612615
if (!isLinkingOrLinked()) {
613616
initState = LINKING;
614-
if (getSuperKlass() != null) {
615-
getSuperKlass().ensureLinked();
616-
}
617-
for (ObjectKlass interf : getSuperInterfaces()) {
618-
interf.ensureLinked();
617+
try {
618+
if (getSuperKlass() != null) {
619+
getSuperKlass().ensureLinked();
620+
}
621+
for (ObjectKlass interf : getSuperInterfaces()) {
622+
interf.ensureLinked();
623+
}
624+
} catch (EspressoException e) {
625+
setErroneousLink(e);
626+
throw e;
619627
}
620628
verify();
621-
prepare();
629+
try {
630+
prepare();
631+
} catch (EspressoException e) {
632+
setErroneousLink(e);
633+
throw e;
634+
}
622635
initState = LINKED;
623636
}
624637
} finally {
625638
getInitLock().unlock();
626639
}
627-
checkErroneousVerification();
640+
checkErroneousLink();
628641
}
629642

630643
void initializeImpl() {
@@ -636,7 +649,7 @@ void initializeImpl() {
636649

637650
@HostCompilerDirectives.InliningCutoff
638651
private void doInitialize() {
639-
checkErroneousVerification();
652+
checkErroneousLink();
640653
checkErroneousInitialization();
641654
if (CompilerDirectives.isCompilationConstant(this)) {
642655
CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -660,9 +673,6 @@ private void recursiveInitialize() {
660673

661674
// region Verification
662675

663-
@CompilationFinal //
664-
private EspressoException verificationError;
665-
666676
private boolean isVerifyingOrVerified() {
667677
return initState >= VERIFYING;
668678
}
@@ -671,20 +681,20 @@ boolean isVerified() {
671681
return initState >= VERIFIED;
672682
}
673683

674-
private void checkErroneousVerification() {
675-
if (initState == FAILED_VERIFICATION) {
676-
throw verificationError;
684+
private void checkErroneousLink() {
685+
if (initState == FAILED_LINK) {
686+
throw linkError;
677687
}
678688
}
679689

680-
private void setErroneousVerification(EspressoException e) {
681-
initState = FAILED_VERIFICATION;
682-
verificationError = e;
690+
private void setErroneousLink(EspressoException e) {
691+
initState = FAILED_LINK;
692+
linkError = e;
683693
}
684694

685695
private void verify() {
686696
if (!isVerified()) {
687-
checkErroneousVerification();
697+
checkErroneousLink();
688698
getInitLock().lock();
689699
try {
690700
if (!isVerifyingOrVerified()) {
@@ -693,15 +703,15 @@ private void verify() {
693703
try {
694704
verifyImpl();
695705
} catch (EspressoException e) {
696-
setErroneousVerification(e);
706+
setErroneousLink(e);
697707
throw e;
698708
}
699709
initState = VERIFIED;
700710
}
701711
} finally {
702712
getInitLock().unlock();
703713
}
704-
checkErroneousVerification();
714+
checkErroneousLink();
705715
}
706716
}
707717

0 commit comments

Comments
 (0)