Skip to content

Commit

Permalink
Avoid modifying surface cache while updating it
Browse files Browse the repository at this point in the history
  • Loading branch information
som-snytt committed Jun 20, 2022
1 parent 1329010 commit f1d52f1
Showing 1 changed file with 17 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,11 @@ object ReflectSurfaceFactory extends LogSupport {
}

def apply(tpe: ru.Type): Surface = {
surfaceCache.getOrElseUpdate(fullTypeNameOf(tpe), new SurfaceFinder().surfaceOf(tpe))
val fullName = fullTypeNameOf(tpe)
surfaceCache.getOrElseUpdate(fullName, new SurfaceFinder().unseenSurfaceOfUncached(tpe, fullName)) match {
case null => LazySurface(resolveClass(tpe), fullName) // Recursive type
case surface => surface
}
}

def methodsOf(s: Surface): Seq[MethodSurface] = {
Expand Down Expand Up @@ -312,13 +316,19 @@ object ReflectSurfaceFactory extends LogSupport {
}

def surfaceOf(tpe: ru.Type): Surface = {
val fullName = fullTypeNameOf(tpe)
surfaceCache.getOrElseUpdate(fullName, unseenSurfaceOfUncached(tpe, fullName)) match {
case null => LazySurface(resolveClass(tpe), fullName) // Recursive type
case surface => surface
}
//surfaceCache.putIfAbsent(fullName, surface) // Cache if not yet cached
}

// caller must update surfaceCache
def unseenSurfaceOfUncached(tpe: ru.Type, fullName: TypeName): Surface = {
try {
val fullName = fullTypeNameOf(tpe)
if (surfaceCache.contains(fullName)) {
surfaceCache(fullName)
} else if (seen.contains(tpe)) {
// Recursive type
LazySurface(resolveClass(tpe), fullName)
if (seen.contains(tpe)) {
null // Recursive type
} else {
seen += tpe
val m = surfaceFactories.orElse[ru.Type, Surface] { case _ =>
Expand All @@ -333,8 +343,6 @@ object ReflectSurfaceFactory extends LogSupport {
// Failed to create surface (Not found in cache)
AnyRefSurface
}
// Cache if not yet cached
surfaceCache.getOrElseUpdate(fullName, surface)
typeMap.getOrElseUpdate(surface, tpe)
trace(s"surfaceOf(${tpe}) Surface: ${surface}, Surface class:${surface.getClass}, tpe: ${showRaw(tpe)}")
surface
Expand Down

0 comments on commit f1d52f1

Please sign in to comment.