Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

thread safety of reflection API #6240

Closed
scabug opened this issue Aug 15, 2012 · 57 comments
Closed

thread safety of reflection API #6240

scabug opened this issue Aug 15, 2012 · 57 comments

Comments

@scabug
Copy link

scabug commented Aug 15, 2012

It's sort of implemented, but was never tested. Also trees aren't synchronized at all, because it was only recently when they've been converted to abstract types.

NOTE that this issue mostly affects runtime reflection, not reflection used in macros. Compiler itself has never been thread-safe, so noone uses it from multiple threads, therefore issues might only arise if a macro spawns multiple threads, which do certain operations simultaneously.

@scabug
Copy link
Author

scabug commented Aug 15, 2012

Imported From: https://issues.scala-lang.org/browse/SI-6240?orig=1
Reporter: @xeno-by
Affected Versions: 2.10.0

@scabug
Copy link
Author

scabug commented Sep 6, 2012

@xeno-by said:
Also synchronize WellKnownSymbols

@scabug
Copy link
Author

scabug commented Sep 26, 2012

@xeno-by said:
Most symbols aren't synchronized right now, because synchronization is implemented by decoration, and decorators aren't applied to almost anything: scala/scala#1380

@scabug
Copy link
Author

scabug commented Nov 15, 2012

Kartik Subramanian (selfification) said:
How thread safe is reflection as it stands right now? If it is not really thread-safe, is there a way to globally synchronize all calls into the API?

I ask this because I have code that tries to use reflection to fetch modules that are a subtype of some given type. During testing, if I run my tests in parallel (using sbt test), I get various failures like NPEs, "scala.reflect.internal.Symbols$CyclicReference: illegal cyclic reference involving value", unsupported operation exception for "tail of empty list", all of them coming from reflect.internal.SymbolTable or from reflect.internal.Symbols$Symbol.lock. It's highly non-reproducible and I don't know enough about reflection to reduce it to a minimal test case. If I run the tests linearly (using sbt test-only name-of-test), each of them individually pass. If you guys are already aware that Symbol is not thread-safe, I don't want to spend time trying to simplify my issue to a bug you are already aware of.

Just as an aside, even when running the tests serially, I get printouts like:
[] ?$2 setInst scala.List[scala.Int]
[] ?
$2 setInst scala.List[scala.Int]
and
[] !!! MyClass[String].transform(MyClass MyClass), but tparams.isEmpty and args=
[] !!! MyClass[T].transform(MyClass MyClass), but tparams.isEmpty and args=
I don't know if this is relevant to the thread-safety issue. I am trying to reflectively acquire objects with types that look like MyClass[_] - that may be triggering some code path that isn't thread-safe yet?

Let me know if you want more info or if you want to see the source.

@scabug
Copy link
Author

scabug commented Dec 6, 2012

@xeno-by said:
Another case study by hejfelix (https://github.com/scala/scala/issues/1723):

I am using scala in the eclipse plugin version 2.1.0.m2 and I am getting problems when using the reflection API in a concurrent setting.

I have a big framework using MPJ-Express as the backend and running applications in multi-core mode. When I use the reflection api, I get random occurences of the runtime eror displayed below:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at runtime.starter.MulticoreStarter$1.run(MulticoreStarter.java:289)
at java.lang.Thread.run(Thread.java:722)
Caused by: scala.reflect.runtime.ReflectError: value Predef is not a package
at scala.reflect.runtime.JavaMirrors$JavaMirror.scala$reflect$runtime$JavaMirrors$$makeScalaPackage(JavaMirrors.scala:893)
at scala.reflect.runtime.JavaMirrors$class.missingHook(JavaMirrors.scala:1256)
at scala.reflect.runtime.JavaUniverse.missingHook(JavaUniverse.scala:12)
at scala.reflect.internal.Mirrors$RootsBase.universeMissingHook(Mirrors.scala:77)
at scala.reflect.internal.Mirrors$RootsBase.missingHook(Mirrors.scala:79)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:61)
at scala.reflect.internal.Mirrors$RootsBase.staticModuleOrClass(Mirrors.scala:72)
at scala.reflect.internal.Mirrors$RootsBase.staticModule(Mirrors.scala:161)
at scala.reflect.internal.Mirrors$RootsBase.staticModule(Mirrors.scala:21)
at it.vigtig.thesis.test.NGridTest$$typecreator2$1.apply(NGridTest.scala:103)
at scala.reflect.api.TypeTags$TypeTag$.apply(TypeTags.scala:302)
at it.vigtig.thesis.test.NGridTest$.testGrid(NGridTest.scala:103)
at it.vigtig.thesis.test.NGridTest$$anonfun$main$1.apply$mcV$sp(NGridTest.scala:16)
at it.vigtig.thesis.env.package$$anonfun$parallelize$1.apply$mcV$sp(package.scala:68)
at it.vigtig.thesis.env.comm.mpj.MPJDistributorTrait$class.execute(MPJDistributorTrait.scala:17)
at it.vigtig.thesis.env.comm.mpj.MPJDistributor$.execute(MPJDistributor.scala:3)
at it.vigtig.thesis.env.package$.parallelize(package.scala:59)
at it.vigtig.thesis.test.NGridTest$.main(NGridTest.scala:14)
at it.vigtig.thesis.test.NGridTest.main(NGridTest.scala)
... 6 more

I am not sharing any reflection knowledge or objects between threads, so this behaviour must be a bug. The parts I am using from reflection are TypeTags and ClassTags as implicit arguments.

@scabug
Copy link
Author

scabug commented Dec 6, 2012

@paulp said:
"value Predef is not a package" suggests that it isn't even blocking for Definitions.init() to complete, is that true? If that's the case then people had better put their concurrent reflection aspirations on ice until at least 2.10.1.

@scabug
Copy link
Author

scabug commented Dec 6, 2012

@xeno-by said:
Looks like it's not blocking indeed.

@scabug
Copy link
Author

scabug commented Dec 25, 2012

@xeno-by said (edited on Dec 25, 2012 10:29:23 PM UTC):
To quote Paul Butcher,

Actually - I take that back. I have one test of this form for the old non-type-macro-based version of mocks and one for the typemacro-based version. And they're in different suites, so they might be running parallel with each other.

But if this is the problem, then I suspect we really need to reconsider the thread safety of reflection. If just adding a TypeTag context bound to a method is enough to make it non-threadsafe, then it's bound to catch people out.

Raising the priority.

upd. Discussion: http://groups.google.com/group/scala-internals/browse_thread/thread/58d62991c21ba2f8.

> [info] - cope with context bounds *** FAILED ***
> [info]   java.lang.NullPointerException:
> [info]   at scala.reflect.internal.Types$TypeRef.computeHashCode(Types.scala:2332)
> [info]   at scala.reflect.internal.Types$UniqueType.<init>(Types.scala:1274)
> [info]   at scala.reflect.internal.Types$TypeRef.<init>(Types.scala:2315)
> [info]   at scala.reflect.internal.Types$NoArgsTypeRef.<init>(Types.scala:2107)
> [info]   at scala.reflect.internal.Types$ModuleTypeRef.<init>(Types.scala:2078)
> [info]   at scala.reflect.internal.Types$PackageTypeRef.<init>(Types.scala:2095)
> [info]   at scala.reflect.internal.Types$TypeRef$.apply(Types.scala:2516)
> [info]   at scala.reflect.internal.Types$class.typeRef(Types.scala:3577)
> [info]   at scala.reflect.internal.SymbolTable.typeRef(SymbolTable.scala:13)
> [info]   at scala.reflect.internal.Symbols$TypeSymbol.newTypeRef(Symbols.scala:2754)

@scabug
Copy link
Author

scabug commented Jan 2, 2013

@OlegYch said:
isn't there any way to init that upfront before normal program run?

@scabug
Copy link
Author

scabug commented Jan 2, 2013

@xeno-by said:
There is. Just calling scala.reflect.runtime.universe should be enough.

@scabug
Copy link
Author

scabug commented Jan 2, 2013

Felix Palludan Hargreaves (hejfelix) said:
Doesn't work for me. I get the following:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at runtime.starter.MulticoreStarter$1.run(MulticoreStarter.java:289)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.UnsupportedOperationException: tail of empty list
at scala.collection.immutable.Nil$.tail(List.scala:330)
at scala.collection.immutable.Nil$.tail(List.scala:325)
at scala.reflect.internal.SymbolTable.popPhase(SymbolTable.scala:166)
at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.complete(UnPickler.scala:856)
at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1217)
at scala.reflect.internal.SymbolTable.openPackageModule(SymbolTable.scala:238)
at scala.reflect.internal.SymbolTable.openPackageModule(SymbolTable.scala:294)
at scala.reflect.runtime.SymbolLoaders$LazyPackageType.complete(SymbolLoaders.scala:88)
at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1217)
at scala.reflect.internal.Types$TypeRef.thisInfo(Types.scala:2364)
at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2369)
at scala.reflect.internal.Types$Type.findMember(Types.scala:1138)
at scala.reflect.internal.Types$Type.memberBasedOnName(Types.scala:687)
at scala.reflect.internal.Types$Type.member(Types.scala:645)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:43)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:40)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:61)
at scala.reflect.internal.Mirrors$RootsBase.staticModuleOrClass(Mirrors.scala:72)
at scala.reflect.internal.Mirrors$RootsBase.staticClass(Mirrors.scala:119)
at scala.reflect.internal.Mirrors$RootsBase.staticClass(Mirrors.scala:21)
at it.vigtig.thesis.test.MatrixBench$$typecreator2$1.apply(MatrixBench.scala:149)
at scala.reflect.api.TypeTags$TypeTag$.apply(TypeTags.scala:302)
at it.vigtig.thesis.test.MatrixBench$.mul(MatrixBench.scala:149)
at it.vigtig.thesis.test.MatrixBench$.bench(MatrixBench.scala:139)
at it.vigtig.thesis.test.MatrixBench$$anonfun$main$1$$anonfun$apply$mcV$sp$1$$anonfun$apply$1.apply$mcVI$sp(MatrixBench.scala:94)
at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:142)
at it.vigtig.thesis.test.MatrixBench$$anonfun$main$1$$anonfun$apply$mcV$sp$1.apply(MatrixBench.scala:93)
at it.vigtig.thesis.test.MatrixBench$$anonfun$main$1$$anonfun$apply$mcV$sp$1.apply(MatrixBench.scala:90)
at scala.collection.Iterator$class.foreach(Iterator.scala:727)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1156)
at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
at it.vigtig.thesis.test.MatrixBench$$anonfun$main$1.apply$mcV$sp(MatrixBench.scala:90)
at it.vigtig.thesis.env.package$$anonfun$parallelize$1.apply$mcV$sp(package.scala:72)
at it.vigtig.thesis.env.comm.mpj.MPJDistributorTrait$class.execute(MPJDistributorTrait.scala:17)
at it.vigtig.thesis.env.comm.mpj.MPJDistributor$.execute(MPJDistributor.scala:3)
at it.vigtig.thesis.env.package$.parallelize(package.scala:63)
at it.vigtig.thesis.test.MatrixBench$.main(MatrixBench.scala:35)
at it.vigtig.thesis.test.MatrixBench.main(MatrixBench.scala)
... 6 more

@scabug
Copy link
Author

scabug commented Jan 2, 2013

@xeno-by said:
Could you please tell more about your scenario? Probably the best way to communicate would be email - just google me, and there'll also be my email.

@scabug
Copy link
Author

scabug commented Jan 3, 2013

@eengbrec said:
If you checkout this branch of this relatively small project, comment out "parallelExecution in Test := false " in build.sbt, then run the tests you should see non-deterministic failures. Just run test repeatedly and watch.

https://github.com/eengbrec/optional/tree/scala210-apachecli

@scabug
Copy link
Author

scabug commented Jan 3, 2013

@xeno-by said:
Thanks! This will be one of the first things I'll get to after my vacation

@scabug
Copy link
Author

scabug commented Jan 8, 2013

@xeno-by said:
Put up the reproductions at dedicated repos at github:

@scabug
Copy link
Author

scabug commented Jan 15, 2013

@retronym said:
Marking for 2.10.1, but that might only be the lock around universe creation.

@scabug
Copy link
Author

scabug commented Jan 26, 2013

@xeno-by said (edited on Jan 26, 2013 4:20:32 PM UTC):
Looks like we're going to need a global reflection lock, because of atPhase used in unsafeTypeParams and typeParams. Oops, LazyTypeRef also uses atPhase... Same goes for TopClassCompleter.

upd. This is the exact list of atPhase users in reflection. Yes, we need a global phaseLock, but luckily it isn't going to be used very often.

upd2. Actually we don't need any phaseLock. In runtime reflection phase is locked to a dummy phase, so we can opt out of using atPhase completely, obviating the need for any locking.

@scabug
Copy link
Author

scabug commented Jan 26, 2013

@xeno-by said:
Toolbox methods should be synchronized as well.

@scabug
Copy link
Author

scabug commented Jan 26, 2013

@xeno-by said:
Here's the list of thread-unsafe scenarios I've found so far:

  1. Materialization of class and module symbols in PackageScope
  2. JavaMirrors.missingHook, which does on-demand import of syntheticCoreClasses from rootMirror
  3. JavaMirrors.makeScalaPackage, which speculatively creates package symbols for everyone in reflection (e.g. missingHook, staticPackage, all java -> scala conversions)

@scabug
Copy link
Author

scabug commented Jan 30, 2013

@xeno-by said:
Importers also need to be synchronized

@scabug
Copy link
Author

scabug commented Feb 7, 2013

@xeno-by said:

scala> typeOf[scala.reflect.internal.Types].declarations.sorted.collect{case ts: TermSymbol => ts}.filter(sym => sym.isVal || sym.isVar || sym.isLazy).filter(!_.name.toString.trim. endsWith("Tag")) foreach println

variable skolemizationLevel
lazy value undoLog
value intersectionWitness
variable volatileRecursions
value pendingVolatiles
variable uniques
lazy value commonOwnerMapObj
variable subsametypeRecursions
value pendingSubTypes
variable basetypeRecursions
value pendingBaseTypes
value lubResults
value glbResults
variable indent
variable tostringRecursions

@scabug
Copy link
Author

scabug commented Feb 7, 2013

@xeno-by said:
List of all ...$lzycompute methods in scala-reflect.jar:

11:22 ~/Projects/Kepler_6240/build/quick/classes/reflect/scala/reflect (ticket/6240)$ lzycompute 
tree$lzycompute in api/Exprs$ExprImpl.class
staticType$lzycompute in api/Exprs$ExprImpl.class
value$lzycompute in api/Exprs$ExprImpl.class
tpe$lzycompute in api/TypeTags$PredefTypeTag.class
tpe$lzycompute in api/TypeTags$WeakTypeTagImpl.class
BooleanFlag$lzycompute in api/Universe.class
WeakTypeTag$lzycompute in api/Universe.class
TypeTag$lzycompute in api/Universe.class
Expr$lzycompute in api/Universe.class
NoMods$lzycompute in api/Universe.class
isTrivial$lzycompute in internal/AnnotationInfos$AnnotationInfo.class
forcedInfo$lzycompute in internal/AnnotationInfos$LazyAnnotationInfo.class
encodedBytes$lzycompute in internal/AnnotationInfos$ScalaSigBytes.class
sevenBitsMayBeZero$lzycompute in internal/AnnotationInfos$ScalaSigBytes.class
maxDepth$lzycompute in internal/BaseTypeSeqs$BaseTypeSeq.class
JavaLangPackage$lzycompute in internal/Definitions$DefinitionsClass.class
JavaLangPackageClass$lzycompute in internal/Definitions$DefinitionsClass.class
ScalaPackage$lzycompute in internal/Definitions$DefinitionsClass.class
ScalaPackageClass$lzycompute in internal/Definitions$DefinitionsClass.class
RuntimePackage$lzycompute in internal/Definitions$DefinitionsClass.class
RuntimePackageClass$lzycompute in internal/Definitions$DefinitionsClass.class
JavaLangEnumClass$lzycompute in internal/Definitions$DefinitionsClass.class
anyparam$lzycompute in internal/Definitions$DefinitionsClass.class
anyvalparam$lzycompute in internal/Definitions$DefinitionsClass.class
anyrefparam$lzycompute in internal/Definitions$DefinitionsClass.class
AnyClass$lzycompute in internal/Definitions$DefinitionsClass.class
AnyRefClass$lzycompute in internal/Definitions$DefinitionsClass.class
ObjectClass$lzycompute in internal/Definitions$DefinitionsClass.class
AnyTpe$lzycompute in internal/Definitions$DefinitionsClass.class
AnyRefTpe$lzycompute in internal/Definitions$DefinitionsClass.class
ObjectTpe$lzycompute in internal/Definitions$DefinitionsClass.class
AnyRefModule$lzycompute in internal/Definitions$DefinitionsClass.class
AnyValClass$lzycompute in internal/Definitions$DefinitionsClass.class
AnyValTpe$lzycompute in internal/Definitions$DefinitionsClass.class
RuntimeNothingClass$lzycompute in internal/Definitions$DefinitionsClass.class
RuntimeNullClass$lzycompute in internal/Definitions$DefinitionsClass.class
NothingClass$lzycompute in internal/Definitions$DefinitionsClass.class
NullClass$lzycompute in internal/Definitions$DefinitionsClass.class
NothingTpe$lzycompute in internal/Definitions$DefinitionsClass.class
NullTpe$lzycompute in internal/Definitions$DefinitionsClass.class
ClassCastExceptionClass$lzycompute in internal/Definitions$DefinitionsClass.class
IndexOutOfBoundsExceptionClass$lzycompute in internal/Definitions$DefinitionsClass.class
InvocationTargetExceptionClass$lzycompute in internal/Definitions$DefinitionsClass.class
MatchErrorClass$lzycompute in internal/Definitions$DefinitionsClass.class
NonLocalReturnControlClass$lzycompute in internal/Definitions$DefinitionsClass.class
$NullPointerExceptionClass$lzycompute in internal/Definitions$DefinitionsClass.class
ThrowableClass$lzycompute in internal/Definitions$DefinitionsClass.class
UninitializedErrorClass$lzycompute in internal/Definitions$DefinitionsClass.class
PartialFunctionClass$lzycompute in internal/Definitions$DefinitionsClass.class
AbstractPartialFunctionClass$lzycompute in internal/Definitions$DefinitionsClass.class
SymbolClass$lzycompute in internal/Definitions$DefinitionsClass.class
StringClass$lzycompute in internal/Definitions$DefinitionsClass.class
StringModule$lzycompute in internal/Definitions$DefinitionsClass.class
ClassClass$lzycompute in internal/Definitions$DefinitionsClass.class
DynamicClass$lzycompute in internal/Definitions$DefinitionsClass.class
SysPackage$lzycompute in internal/Definitions$DefinitionsClass.class
UnqualifiedModules$lzycompute in internal/Definitions$DefinitionsClass.class
UnqualifiedOwners$lzycompute in internal/Definitions$DefinitionsClass.class
PredefModule$lzycompute in internal/Definitions$DefinitionsClass.class
PredefModuleClass$lzycompute in internal/Definitions$DefinitionsClass.class
SpecializableModule$lzycompute in internal/Definitions$DefinitionsClass.class
GroupOfSpecializable$lzycompute in internal/Definitions$DefinitionsClass.class
ConsoleModule$lzycompute in internal/Definitions$DefinitionsClass.class
ScalaRunTimeModule$lzycompute in internal/Definitions$DefinitionsClass.class
SymbolModule$lzycompute in internal/Definitions$DefinitionsClass.class
Symbol_apply$lzycompute in internal/Definitions$DefinitionsClass.class
StringAddClass$lzycompute in internal/Definitions$DefinitionsClass.class
ArrowAssocClass$lzycompute in internal/Definitions$DefinitionsClass.class
StringAdd_$plus$lzycompute in internal/Definitions$DefinitionsClass.class
NotNullClass$lzycompute in internal/Definitions$DefinitionsClass.class
ScalaNumberClass$lzycompute in internal/Definitions$DefinitionsClass.class
TraitSetterAnnotationClass$lzycompute in internal/Definitions$DefinitionsClass.class
DelayedInitClass$lzycompute in internal/Definitions$DefinitionsClass.class
TypeConstraintClass$lzycompute in internal/Definitions$DefinitionsClass.class
SingletonClass$lzycompute in internal/Definitions$DefinitionsClass.class
SerializableClass$lzycompute in internal/Definitions$DefinitionsClass.class
JavaSerializableClass$lzycompute in internal/Definitions$DefinitionsClass.class
ComparableClass$lzycompute in internal/Definitions$DefinitionsClass.class
CloneableClass$lzycompute in internal/Definitions$DefinitionsClass.class
JavaCloneableClass$lzycompute in internal/Definitions$DefinitionsClass.class
JavaNumberClass$lzycompute in internal/Definitions$DefinitionsClass.class
RemoteInterfaceClass$lzycompute in internal/Definitions$DefinitionsClass.class
RemoteExceptionClass$lzycompute in internal/Definitions$DefinitionsClass.class
ByNameParamClass$lzycompute in internal/Definitions$DefinitionsClass.class
EqualsPatternClass$lzycompute in internal/Definitions$DefinitionsClass.class
JavaRepeatedParamClass$lzycompute in internal/Definitions$DefinitionsClass.class
RepeatedParamClass$lzycompute in internal/Definitions$DefinitionsClass.class
MatchingStrategyClass$lzycompute in internal/Definitions$DefinitionsClass.class
ConsClass$lzycompute in internal/Definitions$DefinitionsClass.class
IterableClass$lzycompute in internal/Definitions$DefinitionsClass.class
IteratorClass$lzycompute in internal/Definitions$DefinitionsClass.class
ListClass$lzycompute in internal/Definitions$DefinitionsClass.class
SeqClass$lzycompute in internal/Definitions$DefinitionsClass.class
StringBuilderClass$lzycompute in internal/Definitions$DefinitionsClass.class
TraversableClass$lzycompute in internal/Definitions$DefinitionsClass.class
ListModule$lzycompute in internal/Definitions$DefinitionsClass.class
List_apply$lzycompute in internal/Definitions$DefinitionsClass.class
NilModule$lzycompute in internal/Definitions$DefinitionsClass.class
SeqModule$lzycompute in internal/Definitions$DefinitionsClass.class
IteratorModule$lzycompute in internal/Definitions$DefinitionsClass.class
Iterator_apply$lzycompute in internal/Definitions$DefinitionsClass.class
ArrayModule$lzycompute in internal/Definitions$DefinitionsClass.class
ArrayModule_overloadedApply$lzycompute in internal/Definitions$DefinitionsClass.class
ArrayClass$lzycompute in internal/Definitions$DefinitionsClass.class
Array_apply$lzycompute in internal/Definitions$DefinitionsClass.class
Array_update$lzycompute in internal/Definitions$DefinitionsClass.class
Array_length$lzycompute in internal/Definitions$DefinitionsClass.class
Array_clone$lzycompute in internal/Definitions$DefinitionsClass.class
SoftReferenceClass$lzycompute in internal/Definitions$DefinitionsClass.class
WeakReferenceClass$lzycompute in internal/Definitions$DefinitionsClass.class
MethodClass$lzycompute in internal/Definitions$DefinitionsClass.class
EmptyMethodCacheClass$lzycompute in internal/Definitions$DefinitionsClass.class
MethodCacheClass$lzycompute in internal/Definitions$DefinitionsClass.class
ReflectPackage$lzycompute in internal/Definitions$DefinitionsClass.class
ReflectApiPackage$lzycompute in internal/Definitions$DefinitionsClass.class
ReflectRuntimePackage$lzycompute in internal/Definitions$DefinitionsClass.class
PartialManifestClass$lzycompute in internal/Definitions$DefinitionsClass.class
PartialManifestModule$lzycompute in internal/Definitions$DefinitionsClass.class
FullManifestClass$lzycompute in internal/Definitions$DefinitionsClass.class
FullManifestModule$lzycompute in internal/Definitions$DefinitionsClass.class
OptManifestClass$lzycompute in internal/Definitions$DefinitionsClass.class
NoManifest$lzycompute in internal/Definitions$DefinitionsClass.class
ExprsClass$lzycompute in internal/Definitions$DefinitionsClass.class
ExprClass$lzycompute in internal/Definitions$DefinitionsClass.class
ExprModule$lzycompute in internal/Definitions$DefinitionsClass.class
ClassTagModule$lzycompute in internal/Definitions$DefinitionsClass.class
ClassTagClass$lzycompute in internal/Definitions$DefinitionsClass.class
TypeTagsClass$lzycompute in internal/Definitions$DefinitionsClass.class
WeakTypeTagClass$lzycompute in internal/Definitions$DefinitionsClass.class
WeakTypeTagModule$lzycompute in internal/Definitions$DefinitionsClass.class
TypeTagClass$lzycompute in internal/Definitions$DefinitionsClass.class
TypeTagModule$lzycompute in internal/Definitions$DefinitionsClass.class
ApiUniverseClass$lzycompute in internal/Definitions$DefinitionsClass.class
JavaUniverseClass$lzycompute in internal/Definitions$DefinitionsClass.class
MirrorClass$lzycompute in internal/Definitions$DefinitionsClass.class
TypeCreatorClass$lzycompute in internal/Definitions$DefinitionsClass.class
TreeCreatorClass$lzycompute in internal/Definitions$DefinitionsClass.class
MacroContextClass$lzycompute in internal/Definitions$DefinitionsClass.class
MacroImplAnnotation$lzycompute in internal/Definitions$DefinitionsClass.class
StringContextClass$lzycompute in internal/Definitions$DefinitionsClass.class
ScalaSignatureAnnotation$lzycompute in internal/Definitions$DefinitionsClass.class
ScalaLongSignatureAnnotation$lzycompute in internal/Definitions$DefinitionsClass.class
OptionClass$lzycompute in internal/Definitions$DefinitionsClass.class
OptionModule$lzycompute in internal/Definitions$DefinitionsClass.class
Option_apply$lzycompute in internal/Definitions$DefinitionsClass.class
SomeClass$lzycompute in internal/Definitions$DefinitionsClass.class
NoneModule$lzycompute in internal/Definitions$DefinitionsClass.class
SomeModule$lzycompute in internal/Definitions$DefinitionsClass.class
ProductClass$lzycompute in internal/Definitions$DefinitionsClass.class
TupleClass$lzycompute in internal/Definitions$DefinitionsClass.class
FunctionClass$lzycompute in internal/Definitions$DefinitionsClass.class
AbstractFunctionClass$lzycompute in internal/Definitions$DefinitionsClass.class
ProductRootClass$lzycompute in internal/Definitions$DefinitionsClass.class
ObjectArray$lzycompute in internal/Definitions$DefinitionsClass.class
ComparatorClass$lzycompute in internal/Definitions$DefinitionsClass.class
ValueTypeClass$lzycompute in internal/Definitions$DefinitionsClass.class
DelegateClass$lzycompute in internal/Definitions$DefinitionsClass.class
Delegate_scalaCallerTargets$lzycompute in internal/Definitions$DefinitionsClass.class
Any_$eq$eq$lzycompute in internal/Definitions$DefinitionsClass.class
Any_$bang$eq$lzycompute in internal/Definitions$DefinitionsClass.class
Any_equals$lzycompute in internal/Definitions$DefinitionsClass.class
Any_hashCode$lzycompute in internal/Definitions$DefinitionsClass.class
Any_toString$lzycompute in internal/Definitions$DefinitionsClass.class
Any_$hash$hash$lzycompute in internal/Definitions$DefinitionsClass.class
Any_getClass$lzycompute in internal/Definitions$DefinitionsClass.class
Any_isInstanceOf$lzycompute in internal/Definitions$DefinitionsClass.class
Any_asInstanceOf$lzycompute in internal/Definitions$DefinitionsClass.class
Object_$hash$hash$lzycompute in internal/Definitions$DefinitionsClass.class
Object_$eq$eq$lzycompute in internal/Definitions$DefinitionsClass.class
Object_$bang$eq$lzycompute in internal/Definitions$DefinitionsClass.class
Object_eq$lzycompute in internal/Definitions$DefinitionsClass.class
Object_ne$lzycompute in internal/Definitions$DefinitionsClass.class
Object_isInstanceOf$lzycompute in internal/Definitions$DefinitionsClass.class
Object_asInstanceOf$lzycompute in internal/Definitions$DefinitionsClass.class
Object_synchronized$lzycompute in internal/Definitions$DefinitionsClass.class
String_$plus$lzycompute in internal/Definitions$DefinitionsClass.class
ObjectRefClass$lzycompute in internal/Definitions$DefinitionsClass.class
VolatileObjectRefClass$lzycompute in internal/Definitions$DefinitionsClass.class
RuntimeStaticsModule$lzycompute in internal/Definitions$DefinitionsClass.class
BoxesRunTimeModule$lzycompute in internal/Definitions$DefinitionsClass.class
BoxesRunTimeClass$lzycompute in internal/Definitions$DefinitionsClass.class
BoxedNumberClass$lzycompute in internal/Definitions$DefinitionsClass.class
BoxedCharacterClass$lzycompute in internal/Definitions$DefinitionsClass.class
BoxedBooleanClass$lzycompute in internal/Definitions$DefinitionsClass.class
BoxedByteClass$lzycompute in internal/Definitions$DefinitionsClass.class
BoxedShortClass$lzycompute in internal/Definitions$DefinitionsClass.class
BoxedIntClass$lzycompute in internal/Definitions$DefinitionsClass.class
BoxedLongClass$lzycompute in internal/Definitions$DefinitionsClass.class
BoxedFloatClass$lzycompute in internal/Definitions$DefinitionsClass.class
BoxedDoubleClass$lzycompute in internal/Definitions$DefinitionsClass.class
Boxes_isNumberOrBool$lzycompute in internal/Definitions$DefinitionsClass.class
Boxes_isNumber$lzycompute in internal/Definitions$DefinitionsClass.class
BoxedUnitClass$lzycompute in internal/Definitions$DefinitionsClass.class
BoxedUnitModule$lzycompute in internal/Definitions$DefinitionsClass.class
AnnotationClass$lzycompute in internal/Definitions$DefinitionsClass.class
ClassfileAnnotationClass$lzycompute in internal/Definitions$DefinitionsClass.class
StaticAnnotationClass$lzycompute in internal/Definitions$DefinitionsClass.class
BridgeClass$lzycompute in internal/Definitions$DefinitionsClass.class
ElidableMethodClass$lzycompute in internal/Definitions$DefinitionsClass.class
ImplicitNotFoundClass$lzycompute in internal/Definitions$DefinitionsClass.class
MigrationAnnotationClass$lzycompute in internal/Definitions$DefinitionsClass.class
ScalaStrictFPAttr$lzycompute in internal/Definitions$DefinitionsClass.class
SerializableAttr$lzycompute in internal/Definitions$DefinitionsClass.class
SwitchClass$lzycompute in internal/Definitions$DefinitionsClass.class
TailrecClass$lzycompute in internal/Definitions$DefinitionsClass.class
VarargsClass$lzycompute in internal/Definitions$DefinitionsClass.class
uncheckedStableClass$lzycompute in internal/Definitions$DefinitionsClass.class
uncheckedVarianceClass$lzycompute in internal/Definitions$DefinitionsClass.class
BeanPropertyAttr$lzycompute in internal/Definitions$DefinitionsClass.class
BooleanBeanPropertyAttr$lzycompute in internal/Definitions$DefinitionsClass.class
CloneableAttr$lzycompute in internal/Definitions$DefinitionsClass.class
CompileTimeOnlyAttr$lzycompute in internal/Definitions$DefinitionsClass.class
DeprecatedAttr$lzycompute in internal/Definitions$DefinitionsClass.class
DeprecatedNameAttr$lzycompute in internal/Definitions$DefinitionsClass.class
$DeprecatedInheritanceAttr$lzycompute in internal/Definitions$DefinitionsClass.class
DeprecatedOverridingAttr$lzycompute in internal/Definitions$DefinitionsClass.class
NativeAttr$lzycompute in internal/Definitions$DefinitionsClass.class
RemoteAttr$lzycompute in internal/Definitions$DefinitionsClass.class
ScalaInlineClass$lzycompute in internal/Definitions$DefinitionsClass.class
ScalaNoInlineClass$lzycompute in internal/Definitions$DefinitionsClass.class
SerialVersionUIDAttr$lzycompute in internal/Definitions$DefinitionsClass.class
SpecializedClass$lzycompute in internal/Definitions$DefinitionsClass.class
ThrowsClass$lzycompute in internal/Definitions$DefinitionsClass.class
TransientAttr$lzycompute in internal/Definitions$DefinitionsClass.class
UncheckedClass$lzycompute in internal/Definitions$DefinitionsClass.class
UnspecializedClass$lzycompute in internal/Definitions$DefinitionsClass.class
VolatileAttr$lzycompute in internal/Definitions$DefinitionsClass.class
BeanGetterTargetClass$lzycompute in internal/Definitions$DefinitionsClass.class
BeanSetterTargetClass$lzycompute in internal/Definitions$DefinitionsClass.class
FieldTargetClass$lzycompute in internal/Definitions$DefinitionsClass.class
GetterTargetClass$lzycompute in internal/Definitions$DefinitionsClass.class
ParamTargetClass$lzycompute in internal/Definitions$DefinitionsClass.class
SetterTargetClass$lzycompute in internal/Definitions$DefinitionsClass.class
ClassTargetClass$lzycompute in internal/Definitions$DefinitionsClass.class
ObjectTargetClass$lzycompute in internal/Definitions$DefinitionsClass.class
MethodTargetClass$lzycompute in internal/Definitions$DefinitionsClass.class
LanguageFeatureAnnot$lzycompute in internal/Definitions$DefinitionsClass.class
languageFeatureModule$lzycompute in internal/Definitions$DefinitionsClass.class
experimentalModule$lzycompute in internal/Definitions$DefinitionsClass.class
MacrosFeature$lzycompute in internal/Definitions$DefinitionsClass.class
DynamicsFeature$lzycompute in internal/Definitions$DefinitionsClass.class
PostfixOpsFeature$lzycompute in internal/Definitions$DefinitionsClass.class
ReflectiveCallsFeature$lzycompute in internal/Definitions$DefinitionsClass.class
ImplicitConversionsFeature$lzycompute in internal/Definitions$DefinitionsClass.class
HigherKindsFeature$lzycompute in internal/Definitions$DefinitionsClass.class
ExistentialsFeature$lzycompute in internal/Definitions$DefinitionsClass.class
metaAnnotations$lzycompute in internal/Definitions$DefinitionsClass.class
AnnotationDefaultAttr$lzycompute in internal/Definitions$DefinitionsClass.class
boxedClassValues$lzycompute in internal/Definitions$DefinitionsClass.class
isUnbox$lzycompute in internal/Definitions$DefinitionsClass.class
isBox$lzycompute in internal/Definitions$DefinitionsClass.class
isPhantomClass$lzycompute in internal/Definitions$DefinitionsClass.class
syntheticCoreClasses$lzycompute in internal/Definitions$DefinitionsClass.class
syntheticCoreMethods$lzycompute in internal/Definitions$DefinitionsClass.class
hijackedCoreClasses$lzycompute in internal/Definitions$DefinitionsClass.class
symbolsNotPresentInBytecode$lzycompute in internal/Definitions$DefinitionsClass.class
$isPossibleSyntheticParent$lzycompute in internal/Definitions$DefinitionsClass.class
boxedValueClassesSet$lzycompute in internal/Definitions$DefinitionsClass.class
abbrvTag$lzycompute in internal/Definitions$DefinitionsClass.class
numericWeight$lzycompute in internal/Definitions$DefinitionsClass.class
boxedModule$lzycompute in internal/Definitions$DefinitionsClass.class
boxedClass$lzycompute in internal/Definitions$DefinitionsClass.class
refClass$lzycompute in internal/Definitions$DefinitionsClass.class
volatileRefClass$lzycompute in internal/Definitions$DefinitionsClass.class
boxMethod$lzycompute in internal/Definitions$DefinitionsClass.class
unboxMethod$lzycompute in internal/Definitions$DefinitionsClass.class
UnitClass$lzycompute in internal/Definitions$DefinitionsClass.class
ByteClass$lzycompute in internal/Definitions$DefinitionsClass.class
ShortClass$lzycompute in internal/Definitions$DefinitionsClass.class
CharClass$lzycompute in internal/Definitions$DefinitionsClass.class
IntClass$lzycompute in internal/Definitions$DefinitionsClass.class
LongClass$lzycompute in internal/Definitions$DefinitionsClass.class
FloatClass$lzycompute in internal/Definitions$DefinitionsClass.class
DoubleClass$lzycompute in internal/Definitions$DefinitionsClass.class
BooleanClass$lzycompute in internal/Definitions$DefinitionsClass.class
Boolean_and$lzycompute in internal/Definitions$DefinitionsClass.class
Boolean_or$lzycompute in internal/Definitions$DefinitionsClass.class
Boolean_not$lzycompute in internal/Definitions$DefinitionsClass.class
UnitTpe$lzycompute in internal/Definitions$DefinitionsClass.class
ByteTpe$lzycompute in internal/Definitions$DefinitionsClass.class
ShortTpe$lzycompute in internal/Definitions$DefinitionsClass.class
CharTpe$lzycompute in internal/Definitions$DefinitionsClass.class
IntTpe$lzycompute in internal/Definitions$DefinitionsClass.class
LongTpe$lzycompute in internal/Definitions$DefinitionsClass.class
FloatTpe$lzycompute in internal/Definitions$DefinitionsClass.class
DoubleTpe$lzycompute in internal/Definitions$DefinitionsClass.class
BooleanTpe$lzycompute in internal/Definitions$DefinitionsClass.class
ScalaNumericValueClasses$lzycompute in internal/Definitions$DefinitionsClass.class
ScalaValueClassesNoUnit$lzycompute in internal/Definitions$DefinitionsClass.class
ScalaValueClasses$lzycompute in internal/Definitions$DefinitionsClass.class
symMap$lzycompute in internal/Importers$StandardImporter.class
tpeMap$lzycompute in internal/Importers$StandardImporter.class
fixups$lzycompute in internal/Importers$StandardImporter.class
reverse$lzycompute in internal/Importers$StandardImporter.class
RootPackage$lzycompute in internal/Mirrors$Roots.class
RootClass$lzycompute in internal/Mirrors$Roots.class
EmptyPackage$lzycompute in internal/Mirrors$Roots.class
EmptyPackageClass$lzycompute in internal/Mirrors$Roots.class
GetClassLoader$lzycompute in internal/StdNames$MSILNames.class
raw$lzycompute in internal/StdNames$TermNames.class
scala$reflect$internal$Symbols$Symbol$$SymbolKind$lzycompute in internal/Symbols$Symbol.class
Lscala$reflect$internal$util$TraceSymbolActivity$$findErasurePhase$lzycompute in internal/SymbolTable$traceSymbols$.class
treeBuild$lzycompute in internal/SymbolTable.class
Ascala$reflect$internal$SymbolTable$$SimpleNameOrdering$lzycompute in internal/SymbolTable.class
traceSymbols$lzycompute in internal/SymbolTable.class
perRunCaches$lzycompute in internal/SymbolTable.class
FixedMirrorTreeCreator$lzycompute in internal/SymbolTable.class
FixedMirrorTypeCreator$lzycompute in internal/SymbolTable.class
BackquotedIdentifierAttachment$lzycompute in internal/SymbolTable.class
CompoundTypeTreeOriginalAttachment$lzycompute in internal/SymbolTable.class
MacroExpansionAttachment$lzycompute in internal/SymbolTable.class
SuppressMacroExpansionAttachment$lzycompute in internal/SymbolTable.class
typeDebug$lzycompute in internal/SymbolTable.class
posAssigner$lzycompute in internal/SymbolTable.class
ConsoleWriter$lzycompute in internal/SymbolTable.class
PackageDef$lzycompute in internal/SymbolTable.class
ClassDef$lzycompute in internal/SymbolTable.class
ModuleDef$lzycompute in internal/SymbolTable.class
ValDef$lzycompute in internal/SymbolTable.class
DefDef$lzycompute in internal/SymbolTable.class
TypeDef$lzycompute in internal/SymbolTable.class
LabelDef$lzycompute in internal/SymbolTable.class
ImportSelector$lzycompute in internal/SymbolTable.class
Import$lzycompute in internal/SymbolTable.class
Template$lzycompute in internal/SymbolTable.class
Block$lzycompute in internal/SymbolTable.class
CaseDef$lzycompute in internal/SymbolTable.class
Alternative$lzycompute in internal/SymbolTable.class
Star$lzycompute in internal/SymbolTable.class
Bind$lzycompute in internal/SymbolTable.class
UnApply$lzycompute in internal/SymbolTable.class
ArrayValue$lzycompute in internal/SymbolTable.class
Function$lzycompute in internal/SymbolTable.class
Assign$lzycompute in internal/SymbolTable.class
AssignOrNamedArg$lzycompute in internal/SymbolTable.class
If$lzycompute in internal/SymbolTable.class
Match$lzycompute in internal/SymbolTable.class
Return$lzycompute in internal/SymbolTable.class
Try$lzycompute in internal/SymbolTable.class
Throw$lzycompute in internal/SymbolTable.class
New$lzycompute in internal/SymbolTable.class
Typed$lzycompute in internal/SymbolTable.class
TypeApply$lzycompute in internal/SymbolTable.class
Apply$lzycompute in internal/SymbolTable.class
ApplyDynamic$lzycompute in internal/SymbolTable.class
Super$lzycompute in internal/SymbolTable.class
This$lzycompute in internal/SymbolTable.class
Select$lzycompute in internal/SymbolTable.class
Ident$lzycompute in internal/SymbolTable.class
ReferenceToBoxed$lzycompute in internal/SymbolTable.class
Literal$lzycompute in internal/SymbolTable.class
Annotated$lzycompute in internal/SymbolTable.class
SingletonTypeTree$lzycompute in internal/SymbolTable.class
SelectFromTypeTree$lzycompute in internal/SymbolTable.class
CompoundTypeTree$lzycompute in internal/SymbolTable.class
AppliedTypeTree$lzycompute in internal/SymbolTable.class
TypeBoundsTree$lzycompute in internal/SymbolTable.class
ExistentialTypeTree$lzycompute in internal/SymbolTable.class
TypeTree$lzycompute in internal/SymbolTable.class
Modifiers$lzycompute in internal/SymbolTable.class
EmptyTree$lzycompute in internal/SymbolTable.class
emptyValDef$lzycompute in internal/SymbolTable.class
pendingSuperCall$lzycompute in internal/SymbolTable.class
EmptyTreeTypeSubstituter$lzycompute in internal/SymbolTable.class
3scala$reflect$internal$Trees$$duplicator$lzycompute in internal/SymbolTable.class
UnmappableAnnotArg$lzycompute in internal/SymbolTable.class
LiteralAnnotArg$lzycompute in internal/SymbolTable.class
ArrayAnnotArg$lzycompute in internal/SymbolTable.class
NestedAnnotArg$lzycompute in internal/SymbolTable.class
ScalaSigBytes$lzycompute in internal/SymbolTable.class
AnnotationInfo$lzycompute in internal/SymbolTable.class
Annotation$lzycompute in internal/SymbolTable.class
UnmappableAnnotation$lzycompute in internal/SymbolTable.class
ThrownException$lzycompute in internal/SymbolTable.class
6scala$reflect$internal$StdNames$$compactify$lzycompute in internal/SymbolTable.class
tpnme$lzycompute in internal/SymbolTable.class
fulltpnme$lzycompute in internal/SymbolTable.class
binarynme$lzycompute in internal/SymbolTable.class
nme$lzycompute in internal/SymbolTable.class
sn$lzycompute in internal/SymbolTable.class
Constant$lzycompute in internal/SymbolTable.class
definitions$lzycompute in internal/SymbolTable.class
Scope$lzycompute in internal/SymbolTable.class
EmptyScope$lzycompute in internal/SymbolTable.class
Flag$lzycompute in internal/SymbolTable.class
KindErrors$lzycompute in internal/SymbolTable.class
undoLog$lzycompute in internal/SymbolTable.class
UnmappableTree$lzycompute in internal/SymbolTable.class
NotNullType$lzycompute in internal/SymbolTable.class
ErrorType$lzycompute in internal/SymbolTable.class
WildcardType$lzycompute in internal/SymbolTable.class
BoundedWildcardType$lzycompute in internal/SymbolTable.class
NoType$lzycompute in internal/SymbolTable.class
NoPrefix$lzycompute in internal/SymbolTable.class
ThisType$lzycompute in internal/SymbolTable.class
SingleType$lzycompute in internal/SymbolTable.class
SuperType$lzycompute in internal/SymbolTable.class
TypeBounds$lzycompute in internal/SymbolTable.class
RefinedType$lzycompute in internal/SymbolTable.class
ClassInfoType$lzycompute in internal/SymbolTable.class
ConstantType$lzycompute in internal/SymbolTable.class
TypeRef$lzycompute in internal/SymbolTable.class
MethodType$lzycompute in internal/SymbolTable.class
NullaryMethodType$lzycompute in internal/SymbolTable.class
PolyType$lzycompute in internal/SymbolTable.class
ExistentialType$lzycompute in internal/SymbolTable.class
OverloadedType$lzycompute in internal/SymbolTable.class
AntiPolyType$lzycompute in internal/SymbolTable.class
HasTypeMember$lzycompute in internal/SymbolTable.class
HasTypeParams$lzycompute in internal/SymbolTable.class
TypeVar$lzycompute in internal/SymbolTable.class
AnnotatedType$lzycompute in internal/SymbolTable.class
NamedType$lzycompute in internal/SymbolTable.class
DeBruijnIndex$lzycompute in internal/SymbolTable.class
DeBruijnBinder$lzycompute in internal/SymbolTable.class
ErasedValueType$lzycompute in internal/SymbolTable.class
GenPolyType$lzycompute in internal/SymbolTable.class
normalizeAliases$lzycompute in internal/SymbolTable.class
dropSingletonType$lzycompute in internal/SymbolTable.class
dropAllRefinements$lzycompute in internal/SymbolTable.class
dropRepeatedParamType$lzycompute in internal/SymbolTable.class
toDeBruijn$lzycompute in internal/SymbolTable.class
7scala$reflect$internal$Types$$numericLoBound$lzycompute in internal/SymbolTable.class
7scala$reflect$internal$Types$$numericHiBound$lzycompute in internal/SymbolTable.class
TypeConstraint$lzycompute in internal/SymbolTable.class
unwrapToClass$lzycompute in internal/SymbolTable.class
unwrapToStableClass$lzycompute in internal/SymbolTable.class
unwrapWrapperTypes$lzycompute in internal/SymbolTable.class
IsDependentCollector$lzycompute in internal/SymbolTable.class
ApproximateDependentMap$lzycompute in internal/SymbolTable.class
StripAnnotationsMap$lzycompute in internal/SymbolTable.class
wildcardToTypeVarMap$lzycompute in internal/SymbolTable.class
typeVarToOriginMap$lzycompute in internal/SymbolTable.class
ErroneousCollector$lzycompute in internal/SymbolTable.class
scala$reflect$internal$Types$$commonOwnerMapObj$lzycompute in internal/SymbolTable.class
adaptToNewRunMap$lzycompute in internal/SymbolTable.class
RecoverableCyclicReference$lzycompute in internal/SymbolTable.class
NoSymbol$lzycompute in internal/SymbolTable.class
CyclicReference$lzycompute in internal/SymbolTable.class
6scala$reflect$internal$Symbols$$TypeHistory$lzycompute in internal/SymbolTable.class
StripCast$lzycompute in internal/TreeInfo.class
Applied$lzycompute in internal/TreeInfo.class
IsTrue$lzycompute in internal/TreeInfo.class
IsFalse$lzycompute in internal/TreeInfo.class
IsIf$lzycompute in internal/TreeInfo.class
DynamicUpdate$lzycompute in internal/TreeInfo.class
DynamicApplication$lzycompute in internal/TreeInfo.class
DynamicApplicationNamed$lzycompute in internal/TreeInfo.class
MacroImplReference$lzycompute in internal/TreeInfo.class
str$lzycompute in internal/TypeDebugging$typeDebug$.class
annotationArgRewriter$1$lzycompute in internal/Types$AsSeenFromMap.class
scala$reflect$internal$Types$ClassInfoType$$enterRefs$lzycompute in internal/Types$ClassInfoType.class
Jscala$reflect$internal$Types$InstantiateDependentMap$$StableArg$lzycompute in internal/Types$InstantiateDependentMap.class
Dscala$reflect$internal$Types$InstantiateDependentMap$$Arg$lzycompute in internal/Types$InstantiateDependentMap.class
treeTrans$1$lzycompute in internal/Types$InstantiateDependentMap.class
trans$1$lzycompute in internal/Types$SubstSymMap.class
trans$2$lzycompute in internal/Types$SubstTypeMap.class
ObjectArray$lzycompute in internal/transform/Erasure$ErasureMap.class
ErasedObject$lzycompute in internal/transform/Erasure$ErasureMap.class
GenericArray$lzycompute in internal/transform/Transforms$$anonfun$3$$anon$1.class
scalaErasure$lzycompute in internal/transform/Transforms$$anonfun$3$$anon$1.class
specialScalaErasure$lzycompute in internal/transform/Transforms$$anonfun$3$$anon$1.class
javaErasure$lzycompute in internal/transform/Transforms$$anonfun$3$$anon$1.class
verifiedJavaErasure$lzycompute in internal/transform/Transforms$$anonfun$3$$anon$1.class
boxingErasure$lzycompute in internal/transform/Transforms$$anonfun$3$$anon$1.class
lineIndices$lzycompute in internal/util/BatchSourceFile.class
extension$lzycompute in io/AbstractFile.class
in_s$lzycompute in io/File.class
out_s$lzycompute in io/File.class
in$lzycompute in io/File.class
out$lzycompute in io/File.class
in$lzycompute in io/Streamable$Bytes$class.class
Tscala$reflect$runtime$SynchronizedSymbols$SynchronizedTypeSymbol$$tpeLock$lzycompute in runtime/JavaMirrors$JavaMirror$$anon$1.class
Tscala$reflect$runtime$SynchronizedSymbols$SynchronizedTypeSymbol$$tpeLock$lzycompute in runtime/JavaMirrors$JavaMirror$$anon$2.class
assocs$lzycompute in runtime/JavaMirrors$JavaMirror$JavaAnnotationProxy.class
jconstr$lzycompute in runtime/JavaMirrors$JavaMirror$JavaConstructorMirror.class
jfield$lzycompute in runtime/JavaMirrors$JavaMirror$JavaFieldMirror.class
jmeth$lzycompute in runtime/JavaMirrors$JavaMirror$JavaMethodMirror.class
signature$lzycompute in runtime/JavaMirrors$JavaMirror$JavaTemplateMirror.class
PrimitiveClass$lzycompute in runtime/JavaMirrors$JavaMirror$toAnnotArg$.class
EnumClass$lzycompute in runtime/JavaMirrors$JavaMirror$toAnnotArg$.class
ArrayClass$lzycompute in runtime/JavaMirrors$JavaMirror$toAnnotArg$.class
AnnotationClass$lzycompute in runtime/JavaMirrors$JavaMirror$toAnnotArg$.class
ConstantArg$lzycompute in runtime/JavaMirrors$JavaMirror$toAnnotArg$.class
RootPackage$lzycompute in runtime/JavaMirrors$JavaMirror.class
RootClass$lzycompute in runtime/JavaMirrors$JavaMirror.class
EmptyPackage$lzycompute in runtime/JavaMirrors$JavaMirror.class
EmptyPackageClass$lzycompute in runtime/JavaMirrors$JavaMirror.class
rootLoader$lzycompute in runtime/JavaMirrors$JavaMirror.class
Cscala$reflect$runtime$JavaMirrors$JavaMirror$$toAnnotArg$lzycompute in runtime/JavaMirrors$JavaMirror.class
Lscala$reflect$runtime$JavaMirrors$JavaMirror$$JavaAnnotationProxy$lzycompute in runtime/JavaMirrors$JavaMirror.class
bytecodelessMethodOwners$lzycompute in runtime/JavaMirrors$JavaMirror.class
bytecodefulObjectMethods$lzycompute in runtime/JavaMirrors$JavaMirror.class
unpickler$lzycompute in runtime/JavaMirrors$JavaMirror.class
settings$lzycompute in runtime/JavaUniverse.class
gil$lzycompute in runtime/JavaUniverse.class
scala$reflect$runtime$SynchronizedOps$$nameLock$lzycompute in runtime/JavaUniverse.class
scala$reflect$runtime$SynchronizedTypes$$uniqueLock$lzycompute in runtime/JavaUniverse.class
scala$reflect$runtime$SynchronizedSymbols$$nextIdLock$lzycompute in runtime/JavaUniverse.class
Nscala$reflect$runtime$SynchronizedSymbols$$freshExistentialNameLock$lzycompute in runtime/JavaUniverse.class
5scala$reflect$runtime$JavaMirrors$$mirrors$lzycompute in runtime/JavaUniverse.class
rootMirror$lzycompute in runtime/JavaUniverse.class
universe$lzycompute in runtime/package$.class
Lscala$reflect$runtime$SynchronizedOps$SynchronizedScope$$syncLock$lzycompute in runtime/SymbolLoaders$PackageScope.class
Lscala$reflect$runtime$SynchronizedOps$SynchronizedScope$$syncLock$lzycompute in runtime/SynchronizedOps$$anon$1.class
Lscala$reflect$runtime$SynchronizedOps$SynchronizedScope$$syncLock$lzycompute in runtime/SynchronizedOps$$anon$2.class
maxDepth$lzycompute in runtime/SynchronizedOps$$anon$4.class
maxDepth$lzycompute in runtime/SynchronizedOps$SynchronizedBaseTypeSeq$$anon$3.class
Tscala$reflect$runtime$SynchronizedSymbols$SynchronizedTypeSymbol$$tpeLock$lzycompute in runtime/SynchronizedSymbols$$anon$4.class
Tscala$reflect$runtime$SynchronizedSymbols$SynchronizedTypeSymbol$$tpeLock$lzycompute in runtime/SynchronizedSymbols$SynchronizedSymbol$$anon$1.class
Tscala$reflect$runtime$SynchronizedSymbols$SynchronizedTypeSymbol$$tpeLock$lzycompute in runtime/SynchronizedSymbols$SynchronizedSymbol$$anon$11.class
Tscala$reflect$runtime$SynchronizedSymbols$SynchronizedTypeSymbol$$tpeLock$lzycompute in runtime/SynchronizedSymbols$SynchronizedSymbol$$anon$12.class
Tscala$reflect$runtime$SynchronizedSymbols$SynchronizedTypeSymbol$$tpeLock$lzycompute in runtime/SynchronizedSymbols$SynchronizedSymbol$$anon$13.class
Tscala$reflect$runtime$SynchronizedSymbols$SynchronizedTypeSymbol$$tpeLock$lzycompute in runtime/SynchronizedSymbols$SynchronizedSymbol$$anon$2.class
Tscala$reflect$runtime$SynchronizedSymbols$SynchronizedTypeSymbol$$tpeLock$lzycompute in runtime/SynchronizedSymbols$SynchronizedSymbol$$anon$3.class
Tscala$reflect$runtime$SynchronizedSymbols$SynchronizedTypeSymbol$$tpeLock$lzycompute in runtime/SynchronizedSymbols$SynchronizedSymbol$$anon$5.class
Tscala$reflect$runtime$SynchronizedSymbols$SynchronizedTypeSymbol$$tpeLock$lzycompute in runtime/SynchronizedSymbols$SynchronizedSymbol$$anon$6.class
Tscala$reflect$runtime$SynchronizedSymbols$SynchronizedTypeSymbol$$tpeLock$lzycompute in runtime/SynchronizedSymbols$SynchronizedSymbol$$anon$8.class
ascala$reflect$runtime$SynchronizedSymbols$SynchronizedMethodSymbol$$typeAsMemberOfLock$lzycompute in runtime/SynchronizedSymbols$SynchronizedSymbol$$anon$9.class
Bscala$reflect$runtime$TwoWayCaches$TwoWayCache$$SomeRef$lzycompute in runtime/TwoWayCaches$TwoWayCache.class

@scabug
Copy link
Author

scabug commented Feb 7, 2013

@xeno-by said:
Good news, everyone! https://github.com/xeno-by/reflection-thread-safety-1 and https://github.com/xeno-by/reflection-thread-safety-2 now work with my local Scala build. How do we incorporate them into our build process?

@scabug
Copy link
Author

scabug commented Feb 8, 2013

@JamesIry said:
scala/scala#2083

@scabug
Copy link
Author

scabug commented Feb 27, 2013

@adriaanm said:
I merged the PR, but leaving this open as this will likely need to be refined.

@scabug
Copy link
Author

scabug commented Mar 1, 2013

@adriaanm said (edited on Mar 1, 2013 7:43:55 PM UTC):
reverted 101 PRs later: scala/scala#2184

@scabug
Copy link
Author

scabug commented Apr 5, 2013

Jiawei Li (jiaweihli) said:
Not sure where to note this, but the issue on github hasn't been re-opened.

@scabug
Copy link
Author

scabug commented Apr 6, 2013

@xeno-by said:
@Jiawei Li. I'm not sure I understand what you mean. Which issue do you have in mind?

@scabug
Copy link
Author

scabug commented May 3, 2013

Kazuhiro Sera (seratch) said (edited on May 3, 2013 1:08:33 AM UTC):
The fix was reverted by this pull request.

scala/scala#2184

I understand that this issue has not been re-fixed yet. And I'm wondering about that I cannot find #6240 here.

https://github.com/scala/scala/issues?milestone=12&state=open

Is "Fix Version/s: Scala 2.10.2-RC1" still correct?

@scabug
Copy link
Author

scabug commented May 3, 2013

@OlegYch said (edited on May 3, 2013 1:18:50 AM UTC):
jfyi with 2.10.1 the following snippet
import scala.reflect.runtime.universe._
implicitly[TypeTag[Int]] //init reflection to avoid race condition
called in Boot class of my Lift application is not enough
i still occasionally get various exceptions when summoning type tags later in my app and have to restart it (about once in 10 runs)

@scabug
Copy link
Author

scabug commented Nov 21, 2013

@retronym said (edited on Nov 21, 2013 4:37:03 PM UTC):
Closing as functionally fixed in 2.11.0-M7. Let's use new tickets for performance optimization (avoiding the big lock) or for backports.

@scabug scabug closed this as completed Nov 21, 2013
@scabug
Copy link
Author

scabug commented Jan 14, 2014

Ngoc Dao (ngocdaothanh) said:
Scala 2.10.4-RC1 has been released.
Will 2.10.4-Final contain the fix for this issue?

@scabug
Copy link
Author

scabug commented Jan 14, 2014

@retronym said:
No, it will not. In fact we are still struggling to fix this completely for 2.11.0, see #8131

@scabug
Copy link
Author

scabug commented Sep 30, 2014

Daniel Darabos (darabos) said:
Thread-safe reflection is not coming to 2.10.5 either, is it?

How do people work around this? We can neither give up using reflection nor multi-threading. Can't switch to 2.11 because our dependencies do not support it (https://issues.apache.org/jira/browse/SPARK-1812).

Thanks.

@scabug
Copy link
Author

scabug commented Oct 14, 2014

Ngoc Dao (ngocdaothanh) said:
In Scala 2.11, you can use "typeOf".
In Scala 2.10, use "manifest" instead of "typeOf".

Example:

@scabug
Copy link
Author

scabug commented Feb 2, 2015

Malcolm Greaves (malcolmgreaves) said:
Will this glaring problem never get fixed on 2.10? The problem with Manifests is that they cannot account for type variance.

@scabug
Copy link
Author

scabug commented Feb 2, 2015

@retronym said:
Sorry, we don't have the resources to backport this.

2.10.x is now in maintainence mode and we are only targetting critical fixes. Given that reflection is an experimental module, and that the patch to add thread safety was pretty invasive and difficult to merge, we can't take that on.

@scabug
Copy link
Author

scabug commented Feb 2, 2015

Malcolm Greaves (malcolmgreaves) said (edited on Feb 2, 2015 3:46:01 AM UTC):
Ah...I understand. Sometimes reality is harsh. FWIW I think that Scala is a superb language. I really enjoy using it. It's a shame that the JVM doesn't have reified generics and causes all these kinds of problems.

@scabug
Copy link
Author

scabug commented Feb 2, 2015

@retronym said:
Erasure isn't to blame here, in fact it is rather crucial for a language like Scala to be able to innovate in its type system. Compare this to F#, for example, which hasn't been able to add type constructor polymorphism due to the assumptions about generics built into the VM.

@SethTisue
Copy link
Member

SethTisue commented Jun 13, 2020

https://docs.scala-lang.org/overviews/reflection/thread-safety.html says "Thread safety issues have been fixed in Scala 2.11.0-RC1", with a link to this ticket.

@nogurenn asked on Gitter so I did a little research about where things stand today.

the most negative thing I found is #10766, particularly @adriaanm's remark at #10766 (comment) :

scala.reflect is experimental. Making it thread safe without killing performance is nearly impossible. I was against even trying. The workaround is to synchronize access by the user, or not use it at all

and then at #10766 (comment) :

Just to be clear, we do not intend to provide (full) thread-safety for scala.reflect -- I don't think it's feasible

on the other hand, improvements to thread safety do sometimes still land, e.g. @retronym's recent scala/scala#8433 . (I believe this was work for a customer.) and we're certainly open to merging contributed fixes in this area

still-open bugs in this area include #10598 and #10431; perhaps there are others

@SethTisue
Copy link
Member

SethTisue unassigned xeno-by 3 minutes ago

uh, weird, I didn't intend to, and I don't understand why I can't undo the change, either :-/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants