@@ -432,10 +432,11 @@ final class Emitter[E >: Null <: js.Tree](
432
432
x._1
433
433
}
434
434
435
- val classTreeCache =
436
- extractChanged(classCache.getCache(linkedClass.version))
437
-
438
435
val kind = linkedClass.kind
436
+ val assignClassData = kind.isClass && linkedClass.hasInstances
437
+
438
+ val classTreeCache =
439
+ extractChanged(classCache.getCache(linkedClass.version, assignClassData))
439
440
440
441
// Global ref management
441
442
@@ -723,16 +724,10 @@ final class Emitter[E >: Null <: js.Tree](
723
724
kind, // invalidated by class version
724
725
linkedClass.superClass, // invalidated by class version
725
726
linkedClass.ancestors, // invalidated by overall class cache (identity)
726
- linkedClass.jsNativeLoadSpec // invalidated by class version
727
+ linkedClass.jsNativeLoadSpec, // invalidated by class version
728
+ assignClassData // invalidated directly (it is an input of classCache.getCache)
727
729
)(moduleContext, classCache, linkedClass.pos).map(postTransform(_, 0 ))))
728
730
}
729
-
730
- if (linkedClass.hasInstances && kind.isClass && linkedClass.hasRuntimeTypeInfo) {
731
- main ++= classTreeCache.setTypeData.getOrElseUpdate({
732
- val tree = classEmitter.genSetTypeData(className)(moduleContext, classCache, linkedClass.pos)
733
- postTransform(tree, 0 )
734
- })
735
- }
736
731
}
737
732
738
733
if (linkedClass.kind.hasModuleAccessor && linkedClass.hasInstances) {
@@ -889,6 +884,7 @@ final class Emitter[E >: Null <: js.Tree](
889
884
private final class ClassCache extends knowledgeGuardian.KnowledgeAccessor {
890
885
private [this ] var _cache : DesugaredClassCache [List [E ]] = null
891
886
private [this ] var _lastVersion : Version = Version .Unversioned
887
+ private [this ] var _lastAssignClassData : Boolean = false
892
888
private [this ] var _cacheUsed = false
893
889
894
890
private [this ] val _methodCaches =
@@ -921,14 +917,20 @@ final class Emitter[E >: Null <: js.Tree](
921
917
_fullClassChangeTracker.foreach(_.startRun())
922
918
}
923
919
924
- def getCache (version : Version ): (DesugaredClassCache [List [E ]], Boolean ) = {
920
+ def getCache (version : Version , assignClassData : Boolean ): (DesugaredClassCache [List [E ]], Boolean ) = {
925
921
_cacheUsed = true
926
922
if (_cache == null || ! _lastVersion.sameVersion(version)) {
927
923
invalidate()
928
924
statsClassesInvalidated += 1
929
925
_lastVersion = version
926
+ _lastAssignClassData = assignClassData
930
927
_cache = new DesugaredClassCache [List [E ]]
931
928
(_cache, true )
929
+ } else if (_lastAssignClassData != assignClassData) {
930
+ // Keep most of the cache; only invalidate its `typeData` subcache
931
+ _cache.typeData.invalidate()
932
+ _lastAssignClassData = assignClassData
933
+ (_cache, true )
932
934
} else {
933
935
statsClassesReused += 1
934
936
(_cache, false )
@@ -1223,6 +1225,8 @@ object Emitter {
1223
1225
value = v
1224
1226
value
1225
1227
}
1228
+ def invalidate (): Unit =
1229
+ value = null
1226
1230
}
1227
1231
1228
1232
private case class ClassID (
0 commit comments