Skip to content

Commit 0c680a4

Browse files
committed
Error checking on getVar and getVal
1 parent a68568c commit 0c680a4

File tree

1 file changed

+22
-14
lines changed

1 file changed

+22
-14
lines changed

compiler/src/dotty/tools/dotc/transform/init/Objects.scala

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -336,9 +336,12 @@ object Objects:
336336
def emptyEnv(meth: Symbol)(using Context): Data =
337337
new LocalEnv(Map.empty, meth, NoEnv)(valsMap = mutable.Map.empty, varsMap = mutable.Map.empty)
338338

339-
def valValue(x: Symbol)(using data: Data, ctx: Context): Value = data.getVal(x).get
340-
341-
def varAddr(x: Symbol)(using data: Data, ctx: Context): Heap.Addr = data.getVar(x).get
339+
def valValue(x: Symbol)(using data: Data, ctx: Context): Value =
340+
data.getVal(x) match
341+
case Some(theValue) =>
342+
theValue
343+
case _ =>
344+
Bottom
342345

343346
def getVal(x: Symbol)(using data: Data, ctx: Context): Option[Value] = data.getVal(x)
344347

@@ -855,13 +858,16 @@ object Objects:
855858
if sym.is(Flags.Mutable) then
856859
// Assume forward reference check is doing a good job
857860
given Env.Data = env
858-
val addr = Env.varAddr(sym)
859-
if addr.owner == State.currentObject then
860-
Heap.read(addr)
861-
else
862-
errorReadOtherStaticObject(State.currentObject, addr.owner)
861+
Env.getVar(sym) match
862+
case Some(addr) =>
863+
if addr.owner == State.currentObject then
864+
Heap.read(addr)
865+
else
866+
errorReadOtherStaticObject(State.currentObject, addr.owner)
867+
Bottom
868+
end if
869+
case _ =>
863870
Bottom
864-
end if
865871
else if sym.isPatternBound then
866872
// TODO: handle patterns
867873
Cold
@@ -908,11 +914,13 @@ object Objects:
908914
Env.resolveEnv(sym.enclosingMethod, thisV, summon[Env.Data]) match
909915
case Some(thisV -> env) =>
910916
given Env.Data = env
911-
val addr = Env.varAddr(sym)
912-
if addr.owner != State.currentObject then
913-
errorMutateOtherStaticObject(State.currentObject, addr.owner)
914-
else
915-
Heap.write(addr, value)
917+
Env.getVar(sym) match
918+
case Some(addr) =>
919+
if addr.owner != State.currentObject then
920+
errorMutateOtherStaticObject(State.currentObject, addr.owner)
921+
else
922+
Heap.write(addr, value)
923+
case _ =>
916924

917925
case _ =>
918926
report.warning("Assigning to variables in outer scope. Calling trace:\n" + Trace.show, Trace.position)

0 commit comments

Comments
 (0)