blob: bcf9978c164a94818326463a88a94497782ffca3 (
plain) (
tree)
|
|
package scala.tools.nsc
package backend.jvm
package analysis
import scala.tools.asm.Type
import scala.tools.asm.tree.analysis.{BasicValue, BasicInterpreter}
abstract class TypeFlowInterpreter extends BasicInterpreter {
override def newValue(tp: Type) = {
if (tp == null) super.newValue(tp)
else if (isRef(tp)) new BasicValue(tp)
else super.newValue(tp)
}
def isRef(tp: Type) = tp != null && (tp.getSort match {
case Type.OBJECT | Type.ARRAY => true
case _ => false
})
def refLub(a: BasicValue, b: BasicValue): BasicValue
override def merge(a: BasicValue, b: BasicValue): BasicValue = {
if (a == b) a
else if (isRef(a.getType) && isRef(b.getType)) refLub(a, b)
else BasicValue.UNINITIALIZED_VALUE
}
}
/**
* A [[TypeFlowInterpreter]] which collapses LUBs of non-equal reference types to Object.
* This could be made more precise by looking up ClassBTypes for the two reference types and using
* the `jvmWiseLUB` method.
*/
class NonLubbingTypeFlowInterpreter extends TypeFlowInterpreter {
def refLub(a: BasicValue, b: BasicValue): BasicValue = BasicValue.REFERENCE_VALUE // java/lang/Object
}
|