@@ -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}
0 commit comments