@@ -234,7 +234,8 @@ object Objects:
234
234
235
235
def of (ddef : DefDef , args : List [Value ], outer : Data )(using Context ): Data =
236
236
val params = ddef.termParamss.flatten.map(_.symbol)
237
- assert(args.size == params.size && (ddef.symbol.owner.isClass ^ (outer != NoEnv )), " arguments = " + args.size + " , params = " + params.size)
237
+ assert(args.size == params.size, " arguments = " + args.size + " , params = " + params.size)
238
+ assert(ddef.symbol.owner.isClass ^ (outer != NoEnv ), " ddef.owner = " + ddef.symbol.owner.show + " , outer = " + outer + " , " + ddef.source)
238
239
new LocalEnv (params.zip(args).toMap, ddef.symbol, outer)
239
240
240
241
def setLocalVal (x : Symbol , value : Value )(using data : Data , ctx : Context ): Unit =
@@ -247,10 +248,10 @@ object Objects:
247
248
throw new RuntimeException (" Incorrect local environment for initializing " + x.show)
248
249
249
250
/**
250
- * Resolve the environment owned by the given symbol .
251
+ * Resolve the environment owned by the given method .
251
252
*
252
- * The owner (e.g., method) could be located in outer scope with intermixed classes between its
253
- * definition site and usage site.
253
+ * The method could be located in outer scope with intermixed classes between its definition
254
+ * site and usage site.
254
255
*
255
256
* Due to widening, the corresponding environment might not exist. As a result reading the local
256
257
* variable will return `Cold` and it's forbidden to write to the local variable.
@@ -272,6 +273,8 @@ object Objects:
272
273
case _ =>
273
274
None
274
275
end resolveEnv
276
+
277
+ def withEnv [T ](env : Data )(fn : Data ?=> T ): T = fn(using env)
275
278
end Env
276
279
277
280
/** Abstract heap for mutable fields
@@ -435,7 +438,7 @@ object Objects:
435
438
if meth.owner.isClass then
436
439
(ref, Env .NoEnv )
437
440
else
438
- Env .resolveEnv(meth.owner, ref, summon[Env .Data ]).getOrElse(Cold -> Env .NoEnv )
441
+ Env .resolveEnv(meth.owner.enclosingMethod , ref, summon[Env .Data ]).getOrElse(Cold -> Env .NoEnv )
439
442
440
443
val env2 = Env .of(ddef, args.map(_.value), outerEnv)
441
444
extendTrace(ddef) {
@@ -579,7 +582,7 @@ object Objects:
579
582
if klass.owner.isClass then
580
583
(outer.widen(1 ), Env .NoEnv )
581
584
else
582
- Env .resolveEnv(klass.owner , outer, summon[Env .Data ]).getOrElse(Cold -> Env .NoEnv )
585
+ Env .resolveEnv(klass.enclosingMethod , outer, summon[Env .Data ]).getOrElse(Cold -> Env .NoEnv )
583
586
584
587
val instance = OfClass (klass, outerWidened, ctor, args.map(_.value), envWidened, State .currentObject)
585
588
callConstructor(instance, ctor, args)
@@ -598,7 +601,7 @@ object Objects:
598
601
}
599
602
600
603
def readLocal (thisV : Value , sym : Symbol ): Contextual [Value ] = log(" reading local " + sym.show, printer, (_ : Value ).show) {
601
- Env .resolveEnv(sym.owner , thisV, summon[Env .Data ]) match
604
+ Env .resolveEnv(sym.enclosingMethod , thisV, summon[Env .Data ]) match
602
605
case Some (thisV -> env) =>
603
606
if sym.is(Flags .Mutable ) then
604
607
thisV match
@@ -620,7 +623,7 @@ object Objects:
620
623
621
624
assert(sym.is(Flags .Mutable ), " Writing to immutable variable " + sym.show)
622
625
623
- Env .resolveEnv(sym.owner , thisV, summon[Env .Data ]) match
626
+ Env .resolveEnv(sym.enclosingMethod , thisV, summon[Env .Data ]) match
624
627
case Some (thisV -> env) =>
625
628
thisV match
626
629
case ref : Ref =>
@@ -649,7 +652,7 @@ object Objects:
649
652
count += 1
650
653
651
654
given Trace = Trace .empty.add(tpl.constr)
652
- given env : Env .Data = Env .NoEnv
655
+ given env : Env .Data = Env .emptyEnv(tpl.constr.symbol)
653
656
654
657
log(" Iteration " + count) {
655
658
init(tpl, ObjectRef (classSym), classSym)
0 commit comments