@@ -350,7 +350,11 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
350
350
val controlState = ref(defn.LazyValsControlState )
351
351
val evaluating = Select (ref(defn.LazyValsModule ), lazyNme.RLazyVals .evaluating)
352
352
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
+ )
354
358
val accessorMethodSymbol = memberDef.symbol.asTerm
355
359
val lazyInitMethodName = LazyLocalInitName .fresh(memberDef.name.asTermName)
356
360
val lazyInitMethodSymbol = newSymbol(claz, lazyInitMethodName, Synthetic | Method | Private , MethodType (Nil )(_ => Nil , _ => defn.ObjectType ))
@@ -392,12 +396,12 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
392
396
val lockRel = {
393
397
val lockSymb = newSymbol(lazyInitMethodSymbol, lazyNme.lock, Synthetic , waiting.typeOpt)
394
398
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 ,
396
400
ref(lockSymb).select(lazyNme.RLazyVals .waitingRelease).ensureApplied)
397
401
}
398
402
// finally block
399
403
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,
401
405
lockRel,
402
406
unitLiteral
403
407
)
@@ -418,7 +422,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
418
422
)
419
423
// if CAS(_, null, Evaluating)
420
424
If (
421
- objCas2Flag .appliedTo(thiz, varHandle , nullLiteral, evaluating),
425
+ casFlag .appliedTo(thiz, nullLiteral, evaluating),
422
426
Block (ValDef (resSymb, nullLiteral) :: ValDef (resSymbNullable, nullLiteral) :: evaluate :: Nil , // var result: AnyRef = null
423
427
Return (ref(resSymbNullable), lazyInitMethodSymbol)),
424
428
unitLiteral
@@ -434,7 +438,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
434
438
ref(current).select(defn.Object_eq ).appliedTo(evaluating),
435
439
// if is Evaluating then CAS(_, Evaluating, new Waiting)
436
440
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 ,
438
442
unitLiteral
439
443
),
440
444
// if not Evaluating
@@ -480,7 +484,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
480
484
val varHandleInfo = appendVarHandleDefs.getOrElseUpdate(claz, new VarHandleInfo (EmptyTree , Nil ))
481
485
varHandleInfo.methodHandlesLookupDef match
482
486
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 )
484
488
lookupSym.addAnnotation(Annotation (defn.ScalaStaticAnnot , lookupSym.span))
485
489
varHandleInfo.methodHandlesLookupDef =
486
490
ValDef (lookupSym, Apply (Select (ref(defn.MethodHandlesClass ), defn.MethodHandles_lookup .name), Nil ))
@@ -679,8 +683,6 @@ object LazyVals {
679
683
val waitingRelease : TermName = " countDown" .toTermName
680
684
val evaluating : TermName = " Evaluating" .toTermName
681
685
val nullValue : TermName = " NullValue" .toTermName
682
- val objCas : TermName = " objCAS" .toTermName
683
- val objCas2 : TermName = " objCAS2" .toTermName
684
686
val get : TermName = N .get.toTermName
685
687
val setFlag : TermName = N .setFlag.toTermName
686
688
val wait4Notification : TermName = N .wait4Notification.toTermName
@@ -701,12 +703,13 @@ object LazyVals {
701
703
val current : TermName = " current" .toTermName
702
704
val lock : TermName = " lock" .toTermName
703
705
val discard : TermName = " discard" .toTermName
706
+ val compareAndSet : TermName = " compareAndSet" .toTermName
704
707
val lzyHandleSuffix : String = " $$lzyHandle"
705
- val methodHandleLookup : String = " $$methodHandleLookup"
708
+ val methodHandleLookupSuffix : String = " $$methodHandleLookup"
706
709
}
707
710
708
711
extension (sym : Symbol ) def isVarHandleForLazy (using Context ) =
709
712
sym.name.endsWith(lazyNme.lzyHandleSuffix)
710
713
extension (sym : Symbol ) def isMethodLookupForLazy (using Context ) =
711
- sym.name.endsWith(lazyNme.methodHandleLookup )
714
+ sym.name.endsWith(lazyNme.methodHandleLookupSuffix )
712
715
}
0 commit comments