@@ -799,13 +799,11 @@ class Semantic {
799
799
Result (value, Nil )
800
800
801
801
case Block (stats, expr) =>
802
- val (ress, env2) = eval(stats, thisV, klass)
803
- withEnv(env2) {
804
- eval(expr, thisV, klass) ++ ress.flatMap(_.errors)
805
- }
802
+ val ress = eval(stats, thisV, klass)
803
+ eval(expr, thisV, klass) ++ ress.flatMap(_.errors)
806
804
807
805
case If (cond, thenp, elsep) =>
808
- val ( ress, env2) = eval(cond :: thenp :: elsep :: Nil , thisV, klass)
806
+ val ress = eval(cond :: thenp :: elsep :: Nil , thisV, klass)
809
807
val value = ress.map(_.value).join
810
808
val errors = ress.flatMap(_.errors)
811
809
Result (value, errors)
@@ -816,7 +814,7 @@ class Semantic {
816
814
817
815
case Match (selector, cases) =>
818
816
val res1 = eval(selector, thisV, klass).ensureHot(" The value to be matched needs to be fully initialized" , selector)
819
- val ( ress, env) = eval(cases.map(_.body), thisV, klass)
817
+ val ress = eval(cases.map(_.body), thisV, klass)
820
818
val value = ress.map(_.value).join
821
819
val errors = res1.errors ++ ress.flatMap(_.errors)
822
820
Result (value, errors)
@@ -825,15 +823,15 @@ class Semantic {
825
823
eval(expr, thisV, klass).ensureHot(" return expression may only be initialized value" , expr)
826
824
827
825
case WhileDo (cond, body) =>
828
- val ( ress, env2) = eval(cond :: body :: Nil , thisV, klass)
826
+ val ress = eval(cond :: body :: Nil , thisV, klass)
829
827
Result (Hot , ress.flatMap(_.errors))
830
828
831
829
case Labeled (_, expr) =>
832
830
eval(expr, thisV, klass)
833
831
834
832
case Try (block, cases, finalizer) =>
835
833
val res1 = eval(block, thisV, klass)
836
- val ( ress, env2) = eval(cases.map(_.body), thisV, klass)
834
+ val ress = eval(cases.map(_.body), thisV, klass)
837
835
val errors = ress.flatMap(_.errors)
838
836
val resValue = ress.map(_.value).join
839
837
if finalizer.isEmpty then
@@ -849,7 +847,7 @@ class Semantic {
849
847
Result (Hot , ress.flatMap(_.errors))
850
848
851
849
case Inlined (call, bindings, expansion) =>
852
- val ( ress, env2) = eval(bindings, thisV, klass)
850
+ val ress = eval(bindings, thisV, klass)
853
851
eval(expansion, thisV, klass) ++ ress.flatMap(_.errors)
854
852
855
853
case Thicket (List ()) =>
@@ -905,10 +903,27 @@ class Semantic {
905
903
// It's always safe to approximate them with `Cold`.
906
904
Result (Cold , Nil )
907
905
else
908
- // resolve this for local variable
909
- val enclosingClass = sym.owner.enclosingClass.asClass
910
- val thisValue2 = resolveThis(enclosingClass, thisV, klass, source)
911
-
906
+ sym.defTree match {
907
+ case vdef : ValDef => {
908
+ // resolve this for local variable
909
+ val enclosingClass = sym.owner.enclosingClass.asClass
910
+ val thisValue2 = resolveThis(enclosingClass, thisV, klass, source)
911
+ thisValue2 match {
912
+ case Hot => Result (Hot , Errors .empty)
913
+ case Cold => {
914
+ val error = AccessCold (sym, source, trace.toVector)
915
+ Result (Hot , error :: Nil )
916
+ }
917
+ case addr : Addr => {
918
+ val res = eval(vdef.rhs, addr, klass)
919
+ if res.value.promote(" Try promote" , source).isEmpty then Result (Hot , Errors .empty) else res
920
+ }
921
+ case _ => ???
922
+ }
923
+ }
924
+ case _ => default()
925
+ }
926
+
912
927
case tmref : TermRef =>
913
928
cases(tmref.prefix, thisV, klass, source).select(tmref.symbol, source)
914
929
@@ -1003,7 +1018,7 @@ class Semantic {
1003
1018
// parents
1004
1019
def initParent (parent : Tree , tasks : Tasks )(using Env ) = parent match {
1005
1020
case tree @ Block (stats, NewExpr (tref, New (tpt), ctor, argss)) => // can happen
1006
- eval(stats, thisV, klass)._1. foreach { res => errorBuffer ++= res.errors }
1021
+ eval(stats, thisV, klass).foreach { res => errorBuffer ++= res.errors }
1007
1022
val (errors, args) = evalArgs(argss.flatten, thisV, klass)
1008
1023
errorBuffer ++= errors
1009
1024
superCall(tref, ctor, args, tree, tasks)
0 commit comments