@@ -790,13 +790,11 @@ class Semantic {
790
790
Result (value, Nil )
791
791
792
792
case Block (stats, expr) =>
793
- val (ress, env2) = eval(stats, thisV, klass)
794
- withEnv(env2) {
795
- eval(expr, thisV, klass) ++ ress.flatMap(_.errors)
796
- }
793
+ val ress = eval(stats, thisV, klass)
794
+ eval(expr, thisV, klass) ++ ress.flatMap(_.errors)
797
795
798
796
case If (cond, thenp, elsep) =>
799
- val ( ress, env2) = eval(cond :: thenp :: elsep :: Nil , thisV, klass)
797
+ val ress = eval(cond :: thenp :: elsep :: Nil , thisV, klass)
800
798
val value = ress.map(_.value).join
801
799
val errors = ress.flatMap(_.errors)
802
800
Result (value, errors)
@@ -807,7 +805,7 @@ class Semantic {
807
805
808
806
case Match (selector, cases) =>
809
807
val res1 = eval(selector, thisV, klass).ensureHot(" The value to be matched needs to be fully initialized" , selector)
810
- val ( ress, env) = eval(cases.map(_.body), thisV, klass)
808
+ val ress = eval(cases.map(_.body), thisV, klass)
811
809
val value = ress.map(_.value).join
812
810
val errors = res1.errors ++ ress.flatMap(_.errors)
813
811
Result (value, errors)
@@ -816,15 +814,15 @@ class Semantic {
816
814
eval(expr, thisV, klass).ensureHot(" return expression may only be initialized value" , expr)
817
815
818
816
case WhileDo (cond, body) =>
819
- val ( ress, env2) = eval(cond :: body :: Nil , thisV, klass)
817
+ val ress = eval(cond :: body :: Nil , thisV, klass)
820
818
Result (Hot , ress.flatMap(_.errors))
821
819
822
820
case Labeled (_, expr) =>
823
821
eval(expr, thisV, klass)
824
822
825
823
case Try (block, cases, finalizer) =>
826
824
val res1 = eval(block, thisV, klass)
827
- val ( ress, env2) = eval(cases.map(_.body), thisV, klass)
825
+ val ress = eval(cases.map(_.body), thisV, klass)
828
826
val errors = ress.flatMap(_.errors)
829
827
val resValue = ress.map(_.value).join
830
828
if finalizer.isEmpty then
@@ -840,7 +838,7 @@ class Semantic {
840
838
Result (Hot , ress.flatMap(_.errors))
841
839
842
840
case Inlined (call, bindings, expansion) =>
843
- val ( ress, env2) = eval(bindings, thisV, klass)
841
+ val ress = eval(bindings, thisV, klass)
844
842
eval(expansion, thisV, klass) ++ ress.flatMap(_.errors)
845
843
846
844
case Thicket (List ()) =>
@@ -896,10 +894,27 @@ class Semantic {
896
894
// It's always safe to approximate them with `Cold`.
897
895
Result (Cold , Nil )
898
896
else
899
- // resolve this for local variable
900
- val enclosingClass = sym.owner.enclosingClass.asClass
901
- val thisValue2 = resolveThis(enclosingClass, thisV, klass, source)
902
-
897
+ sym.defTree match {
898
+ case vdef : ValDef => {
899
+ // resolve this for local variable
900
+ val enclosingClass = sym.owner.enclosingClass.asClass
901
+ val thisValue2 = resolveThis(enclosingClass, thisV, klass, source)
902
+ thisValue2 match {
903
+ case Hot => Result (Hot , Errors .empty)
904
+ case Cold => {
905
+ val error = AccessCold (sym, source, trace.toVector)
906
+ Result (Hot , error :: Nil )
907
+ }
908
+ case addr : Addr => {
909
+ val res = eval(vdef.rhs, addr, klass)
910
+ if res.value.promote(" Try promote" , source).isEmpty then Result (Hot , Errors .empty) else res
911
+ }
912
+ case _ => ???
913
+ }
914
+ }
915
+ case _ => default()
916
+ }
917
+
903
918
case tmref : TermRef =>
904
919
cases(tmref.prefix, thisV, klass, source).select(tmref.symbol, source)
905
920
@@ -994,7 +1009,7 @@ class Semantic {
994
1009
// parents
995
1010
def initParent (parent : Tree , tasks : Tasks )(using Env ) = parent match {
996
1011
case tree @ Block (stats, NewExpr (tref, New (tpt), ctor, argss)) => // can happen
997
- eval(stats, thisV, klass)._1. foreach { res => errorBuffer ++= res.errors }
1012
+ eval(stats, thisV, klass).foreach { res => errorBuffer ++= res.errors }
998
1013
val (errors, args) = evalArgs(argss.flatten, thisV, klass)
999
1014
errorBuffer ++= errors
1000
1015
superCall(tref, ctor, args, tree, tasks)
0 commit comments