@@ -289,21 +289,22 @@ object Semantic {
289289 if out.contains(value, expr) then out(value)(expr)
290290 else stable(value)(expr)
291291
292- def assume (value : Value , expr : Tree ) =
293-
292+ def assume (value : Value , expr : Tree )(fun : => Result ): Result =
294293 val assumeValue =
295294 if in.contains(value, expr) then
296295 in.get(value, expr)
297296 else
298297 in.put(value, expr, Hot )
299298 Hot
300299 out.put(value, expr, assumeValue)
301- assumeValue
302300
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
307308
308309 def remove (value : Value , expr : Tree ) =
309310 out.remove(value, expr)
@@ -910,16 +911,7 @@ object Semantic {
910911 */
911912 def eval (expr : Tree , thisV : Ref , klass : ClassSymbol , cacheResult : Boolean = false ): Contextual [Result ] = log(" evaluating " + expr.show + " , this = " + thisV.show, printer, (_ : Result ).show) {
912913 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) }
923915 }
924916
925917 /** Evaluate a list of expressions */
0 commit comments