/* NSC -- new Scala compiler * Copyright 2005-2010 LAMP/EPFL * @author Martin Odersky */ // $Id$ package scala.tools.nsc package backend.icode.analysis /** A complete lattice. */ trait CompleteLattice { type Elem <: AnyRef /** Hold together local variable and stack state. The * equals method uses reference equality for top and bottom, * and structural equality for other values. */ case class IState[V, S](val vars: V, val stack: S) { override def equals(other: Any): Boolean = other match { case that: IState[_, _] => if ((this eq bottom) || (that eq bottom)) this eq that else if ((this eq top) || (that eq top)) this eq that else (stack == that.stack && vars == that.vars) case _ => false } } /** Return the least upper bound of a and b */ def lub2(exceptional: Boolean)(a: Elem, b: Elem): Elem /** Return the top element. */ def top: Elem /** Return the bottom element. */ def bottom: Elem /** Compute the least upper bound of a list of elements. */ def lub(xs: List[Elem], exceptional: Boolean): Elem = try { if (xs == Nil) bottom else xs reduceLeft lub2(exceptional) } catch { case e: LubException => Console.println("Lub on blocks: " + xs) throw e } }