@@ -99,19 +99,11 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
99
99
/* Load the java.lang.Object class, and validate it
100
100
* If it is missing or invalid, we're in deep trouble, and cannot continue.
101
101
*/
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
+ }
115
107
}
116
108
}
117
109
@@ -352,7 +344,13 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
352
344
_classInfos.get(className) match {
353
345
case None =>
354
346
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.
355
352
loading.requestLink(knownDescendants)(onSuccess)
353
+ loading.startLoad()
356
354
357
355
case Some (loading : LoadingClass ) =>
358
356
loading.requestLink(knownDescendants)(onSuccess)
@@ -377,17 +375,6 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
377
375
private val promise = Promise [LoadingResult ]()
378
376
private var knownDescendants = Set [LoadingClass ](this )
379
377
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
-
391
378
def requestLink (knownDescendants : Set [LoadingClass ])(onSuccess : LoadingResult => Unit ): Unit = {
392
379
if (knownDescendants.contains(this )) {
393
380
onSuccess(CycleInfo (Nil , this ))
@@ -397,6 +384,17 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
397
384
}
398
385
}
399
386
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
+
400
398
private def link (data : Infos .ClassInfo , nonExistent : Boolean ): Unit = {
401
399
lookupAncestors(data.superClass.toList ++ data.interfaces) { classes =>
402
400
val (superClass, interfaces) =
@@ -461,15 +459,11 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
461
459
val isNativeJSClass =
462
460
kind == ClassKind .NativeJSClass || kind == ClassKind .NativeJSModuleClass
463
461
464
- // Note: j.l.Object is special and is validated upfront
465
-
466
462
val superClass : Option [ClassInfo ] =
467
- if (className == ObjectClass ) unvalidatedSuperClass
468
- else validateSuperClass(unvalidatedSuperClass)
463
+ validateSuperClass(unvalidatedSuperClass)
469
464
470
465
val interfaces : List [ClassInfo ] =
471
- if (className == ObjectClass ) unvalidatedInterfaces
472
- else validateInterfaces(unvalidatedInterfaces)
466
+ validateInterfaces(unvalidatedInterfaces)
473
467
474
468
/** Ancestors of this class or interface.
475
469
*
@@ -497,6 +491,11 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
497
491
def from = FromClass (this )
498
492
499
493
kind match {
494
+ case _ if className == ObjectClass =>
495
+ assert(superClass.isEmpty)
496
+
497
+ None
498
+
500
499
case ClassKind .Class | ClassKind .ModuleClass | ClassKind .HijackedClass =>
501
500
val superCl = superClass.get // checked by ClassDef checker.
502
501
if (superCl.kind != ClassKind .Class ) {
@@ -1479,8 +1478,12 @@ final class Analyzer(config: CommonPhaseConfig, initial: Boolean,
1479
1478
}
1480
1479
1481
1480
private def createMissingClassInfo (className : ClassName ): Infos .ClassInfo = {
1481
+ val superClass =
1482
+ if (className == ObjectClass ) None
1483
+ else Some (ObjectClass )
1484
+
1482
1485
new Infos .ClassInfoBuilder (className, ClassKind .Class ,
1483
- superClass = Some ( ObjectClass ) , interfaces = Nil , jsNativeLoadSpec = None )
1486
+ superClass = superClass , interfaces = Nil , jsNativeLoadSpec = None )
1484
1487
.addMethod(makeSyntheticMethodInfo(NoArgConstructorName , MemberNamespace .Constructor ))
1485
1488
.result()
1486
1489
}
0 commit comments