summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2006-12-04 13:38:26 +0000
committerIulian Dragos <jaguarul@gmail.com>2006-12-04 13:38:26 +0000
commit98f71af784e981f170d69fdbb416fc23b0ca72dd (patch)
tree4cdbcc5e698a9472c5975f49fffc30914e936d80
parentdb6ceead4bdf713705a34937d798fc7bf08e459c (diff)
downloadscala-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.
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/analysis/DataFlowAnalysis.scala4
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala4
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala22
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)) {