@@ -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
@@ -156,12 +159,15 @@ public final class ObjectKlass extends Klass {
156159
157160 public static final int LOADED = 0 ;
158161 public static final int LINKING = 1 ;
159- public static final int PREPARED = 2 ;
160- public static final int LINKED = 3 ;
162+ public static final int VERIFYING = 2 ;
163+ public static final int FAILED_LINK = 3 ;
164+ public static final int VERIFIED = 4 ;
165+ public static final int PREPARED = 5 ;
166+ public static final int LINKED = 6 ;
167+ public static final int INITIALIZING = 7 ;
161168 // Can be erroneous only if initialization triggered !
162- public static final int ERRONEOUS = 4 ;
163- public static final int INITIALIZING = 5 ;
164- public static final int INITIALIZED = 6 ;
169+ public static final int ERRONEOUS = 8 ;
170+ public static final int INITIALIZED = 9 ;
165171
166172 private final StaticObject definingClassLoader ;
167173
@@ -378,7 +384,7 @@ boolean isInitializingOrInitializedImpl() {
378384 * case, if the state is INITIALIZING we cannot really check the lock because an object
379385 * might have been leaked to another thread by the clinit.
380386 */
381- return initState >= ERRONEOUS ;
387+ return initState >= INITIALIZING ;
382388 }
383389
384390 boolean isInitializedImpl () {
@@ -418,6 +424,12 @@ private void actualInit() {
418424 initState = INITIALIZING ;
419425 getContext ().getLogger ().log (Level .FINEST , "Initializing: {0}" , this .getNameAsString ());
420426
427+ for (Field f : getInitialStaticFields ()) {
428+ if (!f .isRemoved ()) {
429+ initField (f );
430+ }
431+ }
432+
421433 var tls = getContext ().getLanguage ().getThreadLocalState ();
422434 tls .blockContinuationSuspension ();
423435 try {
@@ -477,11 +489,6 @@ private void prepare() {
477489 try {
478490 if (!isPrepared ()) {
479491 checkLoadingConstraints ();
480- for (Field f : getInitialStaticFields ()) {
481- if (!f .isRemoved ()) {
482- initField (f );
483- }
484- }
485492 initState = PREPARED ;
486493 if (getContext ().isMainThreadCreated ()) {
487494 if (getContext ().shouldReportVMEvents ()) {
@@ -593,7 +600,7 @@ private void checkLoadingConstraints() {
593600 @ Override
594601 public void ensureLinked () {
595602 if (!isLinked ()) {
596- checkErroneousVerification ();
603+ checkErroneousLink ();
597604 if (CompilerDirectives .isCompilationConstant (this )) {
598605 CompilerDirectives .transferToInterpreterAndInvalidate ();
599606 }
@@ -607,20 +614,30 @@ private void doLink() {
607614 try {
608615 if (!isLinkingOrLinked ()) {
609616 initState = LINKING ;
610- if (getSuperKlass () != null ) {
611- getSuperKlass ().ensureLinked ();
612- }
613- for (ObjectKlass interf : getSuperInterfaces ()) {
614- 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 ;
615627 }
616- prepare ();
617628 verify ();
629+ try {
630+ prepare ();
631+ } catch (EspressoException e ) {
632+ setErroneousLink (e );
633+ throw e ;
634+ }
618635 initState = LINKED ;
619636 }
620637 } finally {
621638 getInitLock ().unlock ();
622639 }
623- checkErroneousVerification ();
640+ checkErroneousLink ();
624641 }
625642
626643 void initializeImpl () {
@@ -632,7 +649,7 @@ void initializeImpl() {
632649
633650 @ HostCompilerDirectives .InliningCutoff
634651 private void doInitialize () {
635- checkErroneousVerification ();
652+ checkErroneousLink ();
636653 checkErroneousInitialization ();
637654 if (CompilerDirectives .isCompilationConstant (this )) {
638655 CompilerDirectives .transferToInterpreterAndInvalidate ();
@@ -656,60 +673,45 @@ private void recursiveInitialize() {
656673
657674 // region Verification
658675
659- @ CompilationFinal //
660- private volatile int verificationStatus = UNVERIFIED ;
661-
662- @ CompilationFinal //
663- private EspressoException verificationError = null ;
664-
665- private static final int FAILED_VERIFICATION = -1 ;
666- private static final int UNVERIFIED = 0 ;
667- private static final int VERIFYING = 1 ;
668- private static final int VERIFIED = 2 ;
669-
670- private void setVerificationStatus (int status ) {
671- verificationStatus = status ;
672- }
673-
674676 private boolean isVerifyingOrVerified () {
675- return verificationStatus >= VERIFYING ;
677+ return initState >= VERIFYING ;
676678 }
677679
678680 boolean isVerified () {
679- return verificationStatus >= VERIFIED ;
681+ return initState >= VERIFIED ;
680682 }
681683
682- private void checkErroneousVerification () {
683- if (verificationStatus == FAILED_VERIFICATION ) {
684- throw verificationError ;
684+ private void checkErroneousLink () {
685+ if (initState == FAILED_LINK ) {
686+ throw linkError ;
685687 }
686688 }
687689
688- private void setErroneousVerification (EspressoException e ) {
689- verificationStatus = FAILED_VERIFICATION ;
690- verificationError = e ;
690+ private void setErroneousLink (EspressoException e ) {
691+ initState = FAILED_LINK ;
692+ linkError = e ;
691693 }
692694
693695 private void verify () {
694696 if (!isVerified ()) {
695- checkErroneousVerification ();
697+ checkErroneousLink ();
696698 getInitLock ().lock ();
697699 try {
698700 if (!isVerifyingOrVerified ()) {
699701 CompilerDirectives .transferToInterpreterAndInvalidate ();
700- setVerificationStatus ( VERIFYING ) ;
702+ initState = VERIFYING ;
701703 try {
702704 verifyImpl ();
703705 } catch (EspressoException e ) {
704- setErroneousVerification (e );
706+ setErroneousLink (e );
705707 throw e ;
706708 }
707- setVerificationStatus ( VERIFIED ) ;
709+ initState = VERIFIED ;
708710 }
709711 } finally {
710712 getInitLock ().unlock ();
711713 }
712- checkErroneousVerification ();
714+ checkErroneousLink ();
713715 }
714716 }
715717
0 commit comments