@@ -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