Skip to content

Commit 669713b

Browse files
committed
Inline the cas method and remove the change from stdlib
1 parent 351ce57 commit 669713b

File tree

3 files changed

+18
-23
lines changed

3 files changed

+18
-23
lines changed

compiler/src/dotty/tools/dotc/transform/LazyVals.scala

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,11 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
350350
val controlState = ref(defn.LazyValsControlState)
351351
val evaluating = Select(ref(defn.LazyValsModule), lazyNme.RLazyVals.evaluating)
352352
val nullValue = Select(ref(defn.LazyValsModule), lazyNme.RLazyVals.nullValue)
353-
val objCas2Flag = Select(ref(defn.LazyValsModule), lazyNme.RLazyVals.objCas2)
353+
val casFlag =
354+
typer.Applications.retypeSignaturePolymorphicFn( // must be retyped to avoid wrapping into Array[Object]
355+
Select(varHandle, lazyNme.compareAndSet),
356+
MethodType(List(defn.ObjectType,defn.ObjectType,defn.ObjectType), defn.BooleanType)
357+
)
354358
val accessorMethodSymbol = memberDef.symbol.asTerm
355359
val lazyInitMethodName = LazyLocalInitName.fresh(memberDef.name.asTermName)
356360
val lazyInitMethodSymbol = newSymbol(claz, lazyInitMethodName, Synthetic | Method | Private, MethodType(Nil)(_ => Nil, _ => defn.ObjectType))
@@ -392,12 +396,12 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
392396
val lockRel = {
393397
val lockSymb = newSymbol(lazyInitMethodSymbol, lazyNme.lock, Synthetic, waiting.typeOpt)
394398
Block(ValDef(lockSymb, ref(target).cast(waiting.typeOpt))
395-
:: objCas2Flag.appliedTo(thiz, varHandle, ref(lockSymb), ref(resSymb)) :: Nil,
399+
:: casFlag.appliedTo(thiz, ref(lockSymb), ref(resSymb)) :: Nil,
396400
ref(lockSymb).select(lazyNme.RLazyVals.waitingRelease).ensureApplied)
397401
}
398402
// finally block
399403
val fin = If(
400-
objCas2Flag.appliedTo(thiz, varHandle, evaluating, ref(resSymb)).select(nme.UNARY_!).appliedToNone,
404+
casFlag.appliedTo(thiz, evaluating, ref(resSymb)).select(nme.UNARY_!).appliedToNone,
401405
lockRel,
402406
unitLiteral
403407
)
@@ -418,7 +422,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
418422
)
419423
// if CAS(_, null, Evaluating)
420424
If(
421-
objCas2Flag.appliedTo(thiz, varHandle, nullLiteral, evaluating),
425+
casFlag.appliedTo(thiz, nullLiteral, evaluating),
422426
Block(ValDef(resSymb, nullLiteral) :: ValDef(resSymbNullable, nullLiteral) :: evaluate :: Nil, // var result: AnyRef = null
423427
Return(ref(resSymbNullable), lazyInitMethodSymbol)),
424428
unitLiteral
@@ -434,7 +438,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
434438
ref(current).select(defn.Object_eq).appliedTo(evaluating),
435439
// if is Evaluating then CAS(_, Evaluating, new Waiting)
436440
Block(
437-
objCas2Flag.appliedTo(thiz, varHandle, ref(current), Select(New(waiting), StdNames.nme.CONSTRUCTOR).ensureApplied) :: Nil,
441+
casFlag.appliedTo(thiz, ref(current), Select(New(waiting), StdNames.nme.CONSTRUCTOR).ensureApplied) :: Nil,
438442
unitLiteral
439443
),
440444
// if not Evaluating
@@ -480,7 +484,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
480484
val varHandleInfo = appendVarHandleDefs.getOrElseUpdate(claz, new VarHandleInfo(EmptyTree, Nil))
481485
varHandleInfo.methodHandlesLookupDef match
482486
case EmptyTree =>
483-
val lookupSym: TermSymbol = newSymbol(claz, (s"${claz.name}${lazyNme.methodHandleLookup}").toTermName, Synthetic, defn.MethodHandlesLookupClass.typeRef).enteredAfter(this)
487+
val lookupSym: TermSymbol = newSymbol(claz, (s"${claz.name}${lazyNme.methodHandleLookupSuffix}").toTermName, Synthetic, defn.MethodHandlesLookupClass.typeRef).enteredAfter(this)
484488
lookupSym.addAnnotation(Annotation(defn.ScalaStaticAnnot, lookupSym.span))
485489
varHandleInfo.methodHandlesLookupDef =
486490
ValDef(lookupSym, Apply(Select(ref(defn.MethodHandlesClass), defn.MethodHandles_lookup.name), Nil))
@@ -679,8 +683,6 @@ object LazyVals {
679683
val waitingRelease: TermName = "countDown".toTermName
680684
val evaluating: TermName = "Evaluating".toTermName
681685
val nullValue: TermName = "NullValue".toTermName
682-
val objCas: TermName = "objCAS".toTermName
683-
val objCas2: TermName = "objCAS2".toTermName
684686
val get: TermName = N.get.toTermName
685687
val setFlag: TermName = N.setFlag.toTermName
686688
val wait4Notification: TermName = N.wait4Notification.toTermName
@@ -701,12 +703,13 @@ object LazyVals {
701703
val current: TermName = "current".toTermName
702704
val lock: TermName = "lock".toTermName
703705
val discard: TermName = "discard".toTermName
706+
val compareAndSet: TermName = "compareAndSet".toTermName
704707
val lzyHandleSuffix: String = "$$lzyHandle"
705-
val methodHandleLookup: String = "$$methodHandleLookup"
708+
val methodHandleLookupSuffix: String = "$$methodHandleLookup"
706709
}
707710

708711
extension (sym: Symbol) def isVarHandleForLazy(using Context) =
709712
sym.name.endsWith(lazyNme.lzyHandleSuffix)
710713
extension (sym: Symbol) def isMethodLookupForLazy(using Context) =
711-
sym.name.endsWith(lazyNme.methodHandleLookup)
714+
sym.name.endsWith(lazyNme.methodHandleLookupSuffix)
712715
}

library/src/scala/runtime/LazyVals.scala

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import language.experimental.captureChecking
44
import java.util.concurrent.CountDownLatch
55

66
import scala.annotation.*
7-
import java.lang.invoke.VarHandle
87

98
/**
109
* Helper methods used in thread-safe lazy vals.
@@ -107,12 +106,6 @@ object LazyVals {
107106
unsafe.compareAndSwapObject(t, offset, exp, n): @nowarn("cat=deprecation")
108107
}
109108

110-
def objCAS2(t: Object, handle: VarHandle, exp: Object, n: Object): Boolean = {
111-
if (debug)
112-
println(s"objCAS2($t, $exp, $n)")
113-
handle.compareAndSet(t, exp, n)
114-
}
115-
116109
def setFlag(t: Object, offset: Long, v: Int, ord: Int): Unit = {
117110
if (debug)
118111
println(s"setFlag($t, $offset, $v, $ord)")

tests/printing/transformed/lazy-vals-new.check

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ package <empty> {
3636
val current: Object = A.x$lzy1
3737
if current eq null then
3838
if
39-
scala.runtime.LazyVals.objCAS2(this, A.x$lzy1$$lzyHandle, null,
39+
A.x$lzy1$$lzyHandle.compareAndSet(this, null,
4040
scala.runtime.LazyVals.Evaluating)
4141
then
4242
{
@@ -52,15 +52,14 @@ package <empty> {
5252
}
5353
finally
5454
if
55-
scala.runtime.LazyVals.objCAS2(this, A.x$lzy1$$lzyHandle,
55+
A.x$lzy1$$lzyHandle.compareAndSet(this,
5656
scala.runtime.LazyVals.Evaluating, result).unary_!()
5757
then
5858
{
5959
val lock: scala.runtime.LazyVals.LazyVals$Waiting =
6060
A.x$lzy1.asInstanceOf[
6161
scala.runtime.LazyVals.LazyVals$Waiting]
62-
scala.runtime.LazyVals.objCAS2(this, A.x$lzy1$$lzyHandle,
63-
lock, result)
62+
A.x$lzy1$$lzyHandle.compareAndSet(this, lock, result)
6463
lock.countDown()
6564
}
6665
else ()
@@ -74,8 +73,8 @@ package <empty> {
7473
then
7574
if current eq scala.runtime.LazyVals.Evaluating then
7675
{
77-
scala.runtime.LazyVals.objCAS2(this, A.x$lzy1$$lzyHandle,
78-
current, new scala.runtime.LazyVals.LazyVals$Waiting())
76+
A.x$lzy1$$lzyHandle.compareAndSet(this, current,
77+
new scala.runtime.LazyVals.LazyVals$Waiting())
7978
()
8079
}
8180
else

0 commit comments

Comments
 (0)