@@ -236,8 +236,6 @@ object Semantic:
236
236
case tree : Tree => tree
237
237
case null => ???
238
238
239
- private val queryTreeMapper : MutableTreeWrapper = new MutableTreeWrapper
240
-
241
239
class Cache :
242
240
/** The cache for expression values from last iteration */
243
241
private var last : ExprValueCache = Map .empty
@@ -288,14 +286,15 @@ object Semantic:
288
286
/** Used to revert heap to last stable heap. */
289
287
private var heapStable : Heap = Map .empty
290
288
291
- def hasChanged = changed
289
+ /** Used to avoid allocation, its state does not matter */
290
+ private given MutableTreeWrapper = new MutableTreeWrapper
292
291
293
- def contains (value : Value , expr : Tree ) =
294
- current.contains(value, expr) || stable.contains(value, expr)
292
+ def hasChanged = changed
295
293
296
- def apply (value : Value , expr : Tree ) =
297
- if current.contains(value, expr) then current.get(value, expr)
298
- else stable.get(value, expr)
294
+ def get (value : Value , expr : Tree ): Option [Value ] =
295
+ current.get(value, expr) match
296
+ case None => stable.get(value, expr)
297
+ case res => res
299
298
300
299
/** Conditionally perform an operation
301
300
*
@@ -330,12 +329,12 @@ object Semantic:
330
329
*/
331
330
def assume (value : Value , expr : Tree , cacheResult : Boolean )(fun : => Value ): Contextual [Value ] =
332
331
val assumeValue : Value =
333
- if last.contains (value, expr) then
334
- last.get (value, expr)
335
- else
332
+ last.get (value, expr) match
333
+ case Some (value) => value
334
+ case None =>
336
335
this .last = last.updatedNested(value, expr, Hot )
337
336
Hot
338
- end if
337
+
339
338
this .current = current.updatedNested(value, expr, assumeValue)
340
339
341
340
val actual = fun
@@ -408,17 +407,13 @@ object Semantic:
408
407
end Cache
409
408
410
409
extension (cache : ExprValueCache )
411
- private def contains (value : Value , expr : Tree ) =
412
- queryTreeMapper .queryTree = expr
413
- cache.contains (value) && cache(value).contains(queryTreeMapper )
410
+ private def get (value : Value , expr : Tree )( using queryWrapper : MutableTreeWrapper ) : Option [ Value ] =
411
+ queryWrapper .queryTree = expr
412
+ cache.get (value).flatMap(_.get(queryWrapper) )
414
413
415
- private def get (value : Value , expr : Tree ): Value =
416
- queryTreeMapper.queryTree = expr
417
- cache(value)(queryTreeMapper)
418
-
419
- private def removed (value : Value , expr : Tree ) =
420
- queryTreeMapper.queryTree = expr
421
- val innerMap2 = cache(value).removed(queryTreeMapper)
414
+ private def removed (value : Value , expr : Tree )(using queryWrapper : MutableTreeWrapper ) =
415
+ queryWrapper.queryTree = expr
416
+ val innerMap2 = cache(value).removed(queryWrapper)
422
417
cache.updated(value, innerMap2)
423
418
424
419
private def updatedNested (value : Value , expr : Tree , result : Value ): ExprValueCache =
@@ -1167,10 +1162,14 @@ object Semantic:
1167
1162
* it is located.
1168
1163
*
1169
1164
* This method only handles cache logic and delegates the work to `cases`.
1165
+ *
1166
+ * The parameter `cacheResult` is used to reduce the size of the cache.
1170
1167
*/
1171
1168
def eval (expr : Tree , thisV : Ref , klass : ClassSymbol , cacheResult : Boolean = false ): Contextual [Value ] = log(" evaluating " + expr.show + " , this = " + thisV.show + " in " + klass.show, printer, (_ : Value ).show) {
1172
- if (cache.contains(thisV, expr)) cache(thisV, expr)
1173
- else cache.assume(thisV, expr, cacheResult) { cases(expr, thisV, klass) }
1169
+ cache.get(thisV, expr) match
1170
+ case Some (value) => value
1171
+ case None =>
1172
+ cache.assume(thisV, expr, cacheResult) { cases(expr, thisV, klass) }
1174
1173
}
1175
1174
1176
1175
/** Evaluate a list of expressions */
0 commit comments