Skip to content

Commit 87de2d9

Browse files
authored
Merge pull request #6579 from dotty-staging/volatile-by-default
Make lazy vals thread-safe by default
2 parents 3cf3dd3 + a73b830 commit 87de2d9

31 files changed

+674
-492
lines changed

compiler/src/dotty/tools/backend/jvm/BTypesFromSymbols.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package backend
33
package jvm
44

55
import scala.tools.asm
6+
import scala.annotation.threadUnsafe
67

78
/**
89
* This class mainly contains the method classBTypeFromSymbol, which extracts the necessary
@@ -30,14 +31,14 @@ class BTypesFromSymbols[I <: BackendInterface](val int: I) extends BTypes {
3031
coreBTypes.setBTypes(new CoreBTypes[this.type](this))
3132
}
3233

33-
protected lazy val classBTypeFromInternalNameMap = {
34+
@threadUnsafe protected lazy val classBTypeFromInternalNameMap = {
3435
perRunCaches.recordCache(collection.concurrent.TrieMap.empty[String, ClassBType])
3536
}
3637

3738
/**
3839
* Cache for the method classBTypeFromSymbol.
3940
*/
40-
private lazy val convertedClasses = perRunCaches.newMap[Symbol, ClassBType]()
41+
@threadUnsafe private lazy val convertedClasses = perRunCaches.newMap[Symbol, ClassBType]()
4142

4243
/**
4344
* The ClassBType for a class symbol `sym`.

compiler/src/dotty/tools/backend/jvm/BackendInterface.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import dotty.tools.io.AbstractFile
88
import scala.language.implicitConversions
99
import scala.tools.asm
1010

11-
1211
/* Interface to abstract over frontend inside backend.
1312
* Intended to be implemented by both scalac and dotc
1413
*/

compiler/src/dotty/tools/backend/jvm/DottyBackendInterface.scala

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import dotty.tools.dotc.transform.{Erasure, GenericSignatures}
88
import dotty.tools.dotc.transform.SymUtils._
99
import java.io.{File => _}
1010

11+
import scala.annotation.threadUnsafe
1112
import scala.collection.generic.Clearable
1213
import scala.collection.mutable
1314
import scala.reflect.ClassTag
@@ -104,8 +105,8 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
104105
val nme_EQEQ_LOCAL_VAR: Name = StdNames.nme.EQEQ_LOCAL_VAR
105106

106107
// require LambdaMetafactory: scalac uses getClassIfDefined, but we need those always.
107-
override lazy val LambdaMetaFactory: ClassSymbol = ctx.requiredClass("java.lang.invoke.LambdaMetafactory")
108-
override lazy val MethodHandle: ClassSymbol = ctx.requiredClass("java.lang.invoke.MethodHandle")
108+
@threadUnsafe override lazy val LambdaMetaFactory: ClassSymbol = ctx.requiredClass("java.lang.invoke.LambdaMetafactory")
109+
@threadUnsafe override lazy val MethodHandle: ClassSymbol = ctx.requiredClass("java.lang.invoke.MethodHandle")
109110

110111
val nme_valueOf: Name = StdNames.nme.valueOf
111112
val nme_apply: TermName = StdNames.nme.apply
@@ -145,13 +146,13 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
145146
val PartialFunctionClass: Symbol = defn.PartialFunctionClass
146147
val AbstractPartialFunctionClass: Symbol = defn.AbstractPartialFunctionClass
147148
val String_valueOf: Symbol = defn.String_valueOf_Object
148-
lazy val Predef_classOf: Symbol = defn.ScalaPredefModule.requiredMethod(nme.classOf)
149+
@threadUnsafe lazy val Predef_classOf: Symbol = defn.ScalaPredefModule.requiredMethod(nme.classOf)
149150

150-
lazy val AnnotationRetentionAttr: ClassSymbol = ctx.requiredClass("java.lang.annotation.Retention")
151-
lazy val AnnotationRetentionSourceAttr: TermSymbol = ctx.requiredClass("java.lang.annotation.RetentionPolicy").linkedClass.requiredValue("SOURCE")
152-
lazy val AnnotationRetentionClassAttr: TermSymbol = ctx.requiredClass("java.lang.annotation.RetentionPolicy").linkedClass.requiredValue("CLASS")
153-
lazy val AnnotationRetentionRuntimeAttr: TermSymbol = ctx.requiredClass("java.lang.annotation.RetentionPolicy").linkedClass.requiredValue("RUNTIME")
154-
lazy val JavaAnnotationClass: ClassSymbol = ctx.requiredClass("java.lang.annotation.Annotation")
151+
@threadUnsafe lazy val AnnotationRetentionAttr: ClassSymbol = ctx.requiredClass("java.lang.annotation.Retention")
152+
@threadUnsafe lazy val AnnotationRetentionSourceAttr: TermSymbol = ctx.requiredClass("java.lang.annotation.RetentionPolicy").linkedClass.requiredValue("SOURCE")
153+
@threadUnsafe lazy val AnnotationRetentionClassAttr: TermSymbol = ctx.requiredClass("java.lang.annotation.RetentionPolicy").linkedClass.requiredValue("CLASS")
154+
@threadUnsafe lazy val AnnotationRetentionRuntimeAttr: TermSymbol = ctx.requiredClass("java.lang.annotation.RetentionPolicy").linkedClass.requiredValue("RUNTIME")
155+
@threadUnsafe lazy val JavaAnnotationClass: ClassSymbol = ctx.requiredClass("java.lang.annotation.Annotation")
155156

156157
def boxMethods: Map[Symbol, Symbol] = defn.ScalaValueClasses().map{x => // @darkdimius Are you sure this should be a def?
157158
(x, Erasure.Boxing.boxMethod(x.asClass))

compiler/src/dotty/tools/backend/jvm/scalaPrimitives.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Names.TermName, StdNames._
1414
import Types.{JavaArrayType, UnspecifiedErrorType, Type}
1515
import Symbols.{Symbol, NoSymbol}
1616

17+
import scala.annotation.threadUnsafe
1718
import scala.collection.immutable
1819

1920

@@ -37,7 +38,7 @@ import scala.collection.immutable
3738
class DottyPrimitives(ctx: Context) {
3839
import dotty.tools.backend.ScalaPrimitivesOps._
3940

40-
private lazy val primitives: immutable.Map[Symbol, Int] = init
41+
@threadUnsafe private lazy val primitives: immutable.Map[Symbol, Int] = init
4142

4243
/** Return the code for the given symbol. */
4344
def getPrimitive(sym: Symbol): Int = {

0 commit comments

Comments
 (0)