diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2006-12-04 13:38:26 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2006-12-04 13:38:26 +0000 |
commit | 98f71af784e981f170d69fdbb416fc23b0ca72dd (patch) | |
tree | 4cdbcc5e698a9472c5975f49fffc30914e936d80 /src/compiler | |
parent | db6ceead4bdf713705a34937d798fc7bf08e459c (diff) | |
download | scala-98f71af784e981f170d69fdbb416fc23b0ca72dd.tar.gz scala-98f71af784e981f170d69fdbb416fc23b0ca72dd.tar.bz2 scala-98f71af784e981f170d69fdbb416fc23b0ca72dd.zip |
Fixed non-terminating iteration in data flow an...
Fixed non-terminating iteration in data flow analysis framework.
Diffstat (limited to 'src/compiler')
3 files changed, 17 insertions, 13 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/DataFlowAnalysis.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/DataFlowAnalysis.scala index ac6cf70093..b8d4a1e92c 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/analysis/DataFlowAnalysis.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/DataFlowAnalysis.scala @@ -32,7 +32,7 @@ trait DataFlowAnalysis[L <: CompleteLattice] { val point = worklist.elements.next; worklist -= point; visited += point; val output = f(point, in(point)); - if (out(point) == (lattice.bottom) || output != out(point)) { + if ((lattice.bottom == out(point)) || output != out(point)) { out(point) = output; val succs = point.successors; succs foreach { p => @@ -51,7 +51,7 @@ trait DataFlowAnalysis[L <: CompleteLattice] { out(point) = lattice.lub(point.successors map in.apply); val input = f(point, out(point)); - if (in(point) == (lattice.bottom) || input != in(point)) { + if ((lattice.bottom == in(point)) || input != in(point)) { in(point) = input; point.predecessors foreach { p => if (!worklist.contains(p)) diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala index 45e5a8b61e..f873ae44d7 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala @@ -64,7 +64,7 @@ abstract class TypeFlowAnalysis { */ object typeFlowLattice extends CompleteLattice { import icodes._; - type Elem = Pair[VarBinding, icodes.TypeStack]; + type Elem = Pair[VarBinding, icodes.TypeStack] override val top = new Pair(new VarBinding, typeStackLattice.top) { override def equals(that: Any) = (this eq that.asInstanceOf[AnyRef]); @@ -206,7 +206,7 @@ abstract class TypeFlowAnalysis { stack push kind; case Logical(op, kind) => - stack.pop2; + stack.pop2; stack push kind; case Shift(op, kind) => diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala index a4a1ba8a31..2dcd983b0c 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala @@ -42,19 +42,19 @@ abstract class ICodeReader extends ClassfileParser { */ def readClass(cls: Symbol): Pair[IClass, IClass] = { var classFile: AbstractFile = null; + var sym = cls isScalaModule = cls.isModule && !cls.hasFlag(JAVA) - if (isScalaModule) { - Console.println("Loading module: " + cls); - classFile = classPath.root.find(cls.fullNameString(java.io.File.separatorChar) + "$", false).classFile - } else - classFile = cls.asInstanceOf[ClassSymbol].classFile + val name = cls.fullNameString(java.io.File.separatorChar) + (if (isScalaModule) "$" else "") + classFile = classPath.root.find(name, false).classFile + if (cls.isModule && !cls.hasFlag(JAVA)) + sym = cls.linkedClassOfModule assert(classFile ne null, "No classfile for " + cls) // for (val s <- cls.info.members) // Console.println("" + s + ": " + s.tpe) - this.instanceCode = new IClass(cls) - this.staticCode = new IClass(cls.linkedClassOfModule) - parse(classFile, cls) + this.instanceCode = new IClass(sym) + this.staticCode = new IClass(sym.linkedClassOfClass) + parse(classFile, sym) Pair(staticCode, instanceCode) } @@ -554,8 +554,11 @@ abstract class ICodeReader extends ClassfileParser { skipAttributes() code.toBasicBlock - if (code.containsDUPX) + assert(method.code ne null) + if (code.containsDUPX) { + code.resolveDups + } } /** Return the icode class that should include members with the given flags. @@ -696,6 +699,7 @@ abstract class ICodeReader extends ClassfileParser { } } + icodes.dump(method) tfa.init(method) tfa.run for (val bb <- linearizer.linearize(method)) { |