@@ -112,8 +112,10 @@ class Semantic {
112
112
def empty : Heap = mutable.Map .empty
113
113
114
114
extension (heap : Heap )
115
+ def contains (addr : Addr ): Boolean = heap.contains(addr)
115
116
def apply (addr : Addr ): Objekt = heap(addr)
116
- def add (addr : Addr , obj : Objekt ): Unit = heap(addr) = obj
117
+ def update (addr : Addr , obj : Objekt ): Unit =
118
+ heap(addr) = obj
117
119
end extension
118
120
119
121
extension (ref : Addr )
@@ -346,15 +348,18 @@ class Semantic {
346
348
val error = CallCold (ctor, source, trace.toVector)
347
349
Result (Hot , error :: Nil )
348
350
349
- case thisRef : ThisRef =>
350
- val value = Warm (klass, outer = thisRef)
351
- val res = value.call(ctor, superType = NoType , source)
352
- Result (value, res.errors)
353
-
354
- case warm : Warm =>
351
+ case addr : Addr =>
355
352
// widen the outer to finitize addresses
356
- val outer = if warm.outer.isInstanceOf [Warm ] then warm.copy(outer = Cold ) else warm
353
+ val outer = addr match
354
+ case _ : ThisRef => addr
355
+ case warm : Warm =>
356
+ if warm.outer.isInstanceOf [Warm ] then warm.copy(outer = Cold )
357
+ else warm
358
+
357
359
val value = Warm (klass, outer)
360
+ if ! heap.contains(value) then
361
+ val obj = Objekt (klass, fields = mutable.Map .empty, outers = mutable.Map (klass -> outer))
362
+ heap.update(value, obj)
358
363
val res = value.call(ctor, superType = NoType , source)
359
364
Result (value, res.errors)
360
365
0 commit comments