Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c4f1114

Browse files
authored
Merge pull request #4890 from gzm0/object-less-special
Use standard loading mechanism for jl.Object in Analyzer
2 parents 6df2d93 + 42cd08d commit c4f1114

File tree

3 files changed

+51
-35
lines changed

3 files changed

+51
-35
lines changed

linker/shared/src/main/scala/org/scalajs/linker/analyzer/Analysis.scala

-3
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,6 @@ object Analysis {
165165
def from: From
166166
}
167167

168-
final case class MissingJavaLangObjectClass(from: From) extends Error
169168
final case class CycleInInheritanceChain(encodedClassNames: List[ClassName], from: From) extends Error
170169
final case class MissingClass(info: ClassInfo, from: From) extends Error
171170

@@ -216,8 +215,6 @@ object Analysis {
216215

217216
def logError(error: Error, logger: Logger, level: Level): Unit = {
218217
val headMsg = error match {
219-
case MissingJavaLangObjectClass(_) =>
220-
"Fatal error: java.lang.Object is missing"
221218
case CycleInInheritanceChain(encodedClassNames, _) =>
222219
("Fatal error: cycle in inheritance chain involving " +
223220
encodedClassNames.map(_.nameString).mkString(", "))

linker/shared/src/main/scala/org/scalajs/linker/analyzer/Analyzer.scala

+34-31
Original file line numberDiff line numberDiff line change
@@ -99,19 +99,11 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
9999
/* Load the java.lang.Object class, and validate it
100100
* If it is missing or invalid, we're in deep trouble, and cannot continue.
101101
*/
102-
infoLoader.loadInfo(ObjectClass)(workQueue.ec) match {
103-
case None =>
104-
_errors += MissingJavaLangObjectClass(fromAnalyzer)
105-
106-
case Some(future) =>
107-
workQueue.enqueue(future) { data =>
108-
objectClassInfo = new ClassInfo(data,
109-
unvalidatedSuperClass = None,
110-
unvalidatedInterfaces = Nil, nonExistent = false)
111-
112-
objectClassInfo.link()
113-
onSuccess()
114-
}
102+
lookupClass(ObjectClass) { clazz =>
103+
if (!clazz.nonExistent) {
104+
objectClassInfo = clazz
105+
onSuccess()
106+
}
115107
}
116108
}
117109

@@ -352,7 +344,13 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
352344
_classInfos.get(className) match {
353345
case None =>
354346
val loading = new LoadingClass(className)
347+
348+
_classInfos(className) = loading
349+
350+
// Request linking before scheduling the loading to avoid the task queue
351+
// dropping to zero intermittently.
355352
loading.requestLink(knownDescendants)(onSuccess)
353+
loading.startLoad()
356354

357355
case Some(loading: LoadingClass) =>
358356
loading.requestLink(knownDescendants)(onSuccess)
@@ -377,17 +375,6 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
377375
private val promise = Promise[LoadingResult]()
378376
private var knownDescendants = Set[LoadingClass](this)
379377

380-
_classInfos(className) = this
381-
382-
infoLoader.loadInfo(className)(workQueue.ec) match {
383-
case Some(future) =>
384-
workQueue.enqueue(future)(link(_, nonExistent = false))
385-
386-
case None =>
387-
val data = createMissingClassInfo(className)
388-
link(data, nonExistent = true)
389-
}
390-
391378
def requestLink(knownDescendants: Set[LoadingClass])(onSuccess: LoadingResult => Unit): Unit = {
392379
if (knownDescendants.contains(this)) {
393380
onSuccess(CycleInfo(Nil, this))
@@ -397,6 +384,17 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
397384
}
398385
}
399386

387+
def startLoad(): Unit = {
388+
infoLoader.loadInfo(className)(workQueue.ec) match {
389+
case Some(future) =>
390+
workQueue.enqueue(future)(link(_, nonExistent = false))
391+
392+
case None =>
393+
val data = createMissingClassInfo(className)
394+
link(data, nonExistent = true)
395+
}
396+
}
397+
400398
private def link(data: Infos.ClassInfo, nonExistent: Boolean): Unit = {
401399
lookupAncestors(data.superClass.toList ++ data.interfaces) { classes =>
402400
val (superClass, interfaces) =
@@ -461,15 +459,11 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
461459
val isNativeJSClass =
462460
kind == ClassKind.NativeJSClass || kind == ClassKind.NativeJSModuleClass
463461

464-
// Note: j.l.Object is special and is validated upfront
465-
466462
val superClass: Option[ClassInfo] =
467-
if (className == ObjectClass) unvalidatedSuperClass
468-
else validateSuperClass(unvalidatedSuperClass)
463+
validateSuperClass(unvalidatedSuperClass)
469464

470465
val interfaces: List[ClassInfo] =
471-
if (className == ObjectClass) unvalidatedInterfaces
472-
else validateInterfaces(unvalidatedInterfaces)
466+
validateInterfaces(unvalidatedInterfaces)
473467

474468
/** Ancestors of this class or interface.
475469
*
@@ -497,6 +491,11 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
497491
def from = FromClass(this)
498492

499493
kind match {
494+
case _ if className == ObjectClass =>
495+
assert(superClass.isEmpty)
496+
497+
None
498+
500499
case ClassKind.Class | ClassKind.ModuleClass | ClassKind.HijackedClass =>
501500
val superCl = superClass.get // checked by ClassDef checker.
502501
if (superCl.kind != ClassKind.Class) {
@@ -1479,8 +1478,12 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
14791478
}
14801479

14811480
private def createMissingClassInfo(className: ClassName): Infos.ClassInfo = {
1481+
val superClass =
1482+
if (className == ObjectClass) None
1483+
else Some(ObjectClass)
1484+
14821485
new Infos.ClassInfoBuilder(className, ClassKind.Class,
1483-
superClass = Some(ObjectClass), interfaces = Nil, jsNativeLoadSpec = None)
1486+
superClass = superClass, interfaces = Nil, jsNativeLoadSpec = None)
14841487
.addMethod(makeSyntheticMethodInfo(NoArgConstructorName, MemberNamespace.Constructor))
14851488
.result()
14861489
}

linker/shared/src/test/scala/org/scalajs/linker/AnalyzerTest.scala

+17-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,23 @@ class AnalyzerTest {
5151
@Test
5252
def missingJavaLangObject(): AsyncResult = await {
5353
val analysis = computeAnalysis(Nil, stdlib = TestIRRepo.empty)
54-
assertExactErrors(analysis, MissingJavaLangObjectClass(fromAnalyzer))
54+
assertContainsError("MissingClass(jlObject)", analysis) {
55+
case MissingClass(ClsInfo(name), fromAnalyzer) =>
56+
name == ObjectClass.nameString
57+
}
58+
}
59+
60+
@Test
61+
def missingJavaLangObjectButOthers(): AsyncResult = await {
62+
val classDefs = Seq(classDef("A", superClass = Some(ObjectClass)))
63+
64+
val analysis = computeAnalysis(classDefs,
65+
reqsFactory.classData("A"), stdlib = TestIRRepo.empty)
66+
67+
assertContainsError("MissingClass(jlObject)", analysis) {
68+
case MissingClass(ClsInfo(name), fromAnalyzer) =>
69+
name == ObjectClass.nameString
70+
}
5571
}
5672

5773
@Test

0 commit comments

Comments
 (0)