@@ -289,21 +289,22 @@ object Semantic {
289
289
if out.contains(value, expr) then out(value)(expr)
290
290
else stable(value)(expr)
291
291
292
- def assume (value : Value , expr : Tree ) =
293
-
292
+ def assume (value : Value , expr : Tree )(fun : => Result ): Result =
294
293
val assumeValue =
295
294
if in.contains(value, expr) then
296
295
in.get(value, expr)
297
296
else
298
297
in.put(value, expr, Hot )
299
298
Hot
300
299
out.put(value, expr, assumeValue)
301
- assumeValue
302
300
303
- def update (value : Value , expr : Tree , result : Value ) =
304
- this .changed = true
305
- in.put(value, expr, result)
306
- out.put(value, expr, result)
301
+ val actual = fun
302
+ if actual.value != assumeValue then
303
+ this .changed = true
304
+ in.put(value, expr, actual.value)
305
+ out.put(value, expr, actual.value)
306
+
307
+ actual
307
308
308
309
def remove (value : Value , expr : Tree ) =
309
310
out.remove(value, expr)
@@ -910,16 +911,7 @@ object Semantic {
910
911
*/
911
912
def eval (expr : Tree , thisV : Ref , klass : ClassSymbol , cacheResult : Boolean = false ): Contextual [Result ] = log(" evaluating " + expr.show + " , this = " + thisV.show, printer, (_ : Result ).show) {
912
913
if (cache.contains(thisV, expr)) Result (cache(thisV, expr), Errors .empty)
913
- else {
914
- val assumeValue = cache.assume(thisV, expr)
915
- val res = cases(expr, thisV, klass)
916
- if res.value != assumeValue then
917
- // println("changed: old = " + assumeValue + ", res = " + res.value)
918
- cache.update(thisV, expr, res.value) // must put in cache for termination
919
- else
920
- if ! cacheResult then cache.remove(thisV, expr)
921
- res
922
- }
914
+ else cache.assume(thisV, expr) { cases(expr, thisV, klass) }
923
915
}
924
916
925
917
/** Evaluate a list of expressions */
0 commit comments