Skip to content

Commit 827906d

Browse files
[GR-60479] Improve linking process.
PullRequest: graal/19607
2 parents 9ae3aa8 + d8b4280 commit 827906d

File tree

2 files changed

+62
-48
lines changed
  • espresso/src

2 files changed

+62
-48
lines changed

espresso/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/ClassfileParser.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1821,6 +1821,18 @@ private ParserField parseField(boolean isInterface) throws ValidationException {
18211821
if (constantValue.getConstantValueIndex() == 0) {
18221822
throw classFormatError("Invalid ConstantValue index");
18231823
}
1824+
PoolConstant entry = pool.at(constantValue.getConstantValueIndex(), "constant value index");
1825+
boolean isValid = switch (entry.tag()) {
1826+
case INTEGER -> Types.getJavaKind(descriptor).isStackInt();
1827+
case FLOAT -> descriptor == Type._float;
1828+
case LONG -> descriptor == Type._long;
1829+
case DOUBLE -> descriptor == Type._double;
1830+
case STRING -> descriptor == Type.java_lang_String;
1831+
default -> false;
1832+
};
1833+
if (!isValid) {
1834+
throw classFormatError("Invalid ConstantValue index entry type");
1835+
}
18241836
} else if (attributeName.equals(Name.Synthetic)) {
18251837
fieldFlags |= ACC_SYNTHETIC;
18261838
fieldAttributes[i] = new Attribute(attributeName, null);

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

Lines changed: 50 additions & 48 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
@@ -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

Comments
 (0)