summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2007-07-11 14:09:31 +0000
committerIulian Dragos <jaguarul@gmail.com>2007-07-11 14:09:31 +0000
commit9f2ea1b3421df7b6e4a3e5f60af9d96167cf8f69 (patch)
tree8e5b8f8622e78662e27844f942475a7de525bc94 /src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala
parent802a3e3a8f11c7fc41d40f2270154237ca9cc9c1 (diff)
downloadscala-9f2ea1b3421df7b6e4a3e5f60af9d96167cf8f69.tar.gz
scala-9f2ea1b3421df7b6e4a3e5f60af9d96167cf8f69.tar.bz2
scala-9f2ea1b3421df7b6e4a3e5f60af9d96167cf8f69.zip
Fixed linearization order and a small inefficie...
Fixed linearization order and a small inefficiency regarding null literals
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala')
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala b/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala
index cdc1023f88..835f41dd7e 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala
@@ -8,7 +8,7 @@
package scala.tools.nsc.backend.icode;
import scala.tools.nsc.ast._;
-import scala.collection.mutable.{Stack, HashSet};
+import scala.collection.mutable.{Stack, HashSet, BitSet};
trait Linearizers { self: ICodes =>
import opcodes._;
@@ -141,10 +141,12 @@ trait Linearizers { self: ICodes =>
class ReversePostOrderLinearizer extends Linearizer {
var blocks: List[BasicBlock] = Nil;
var visited: HashSet[BasicBlock] = new HashSet;
+ val added: BitSet = new BitSet
def linearize(m: IMethod): List[BasicBlock] = {
blocks = Nil;
visited.clear;
+ added.clear;
m.exh foreach (b => rpo(b.startBlock));
rpo(m.code.startBlock);
@@ -160,6 +162,8 @@ trait Linearizers { self: ICodes =>
def linearizeAt(m: IMethod, start: BasicBlock): List[BasicBlock] = {
blocks = Nil
visited.clear
+ added.clear
+
rpo(start)
blocks
}
@@ -177,8 +181,10 @@ trait Linearizers { self: ICodes =>
* @return Returns true if the block was added.
*/
def add(b: BasicBlock) =
- if (!blocks.contains(b))
+ if (!added(b.label)) {
+ added += b.label
blocks = b :: blocks;
+ }
}
/** A 'dump' of the blocks in this method, which does not