diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2007-07-11 14:09:31 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2007-07-11 14:09:31 +0000 |
commit | 9f2ea1b3421df7b6e4a3e5f60af9d96167cf8f69 (patch) | |
tree | 8e5b8f8622e78662e27844f942475a7de525bc94 /src | |
parent | 802a3e3a8f11c7fc41d40f2270154237ca9cc9c1 (diff) | |
download | scala-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')
3 files changed, 14 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/BasicBlocks.scala b/src/compiler/scala/tools/nsc/backend/icode/BasicBlocks.scala index ee70dd16d3..c95f392e9d 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/BasicBlocks.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/BasicBlocks.scala @@ -381,8 +381,8 @@ trait BasicBlocks { def successors : List[BasicBlock] = if (isEmpty) Nil else { var res = lastInstruction match { case JUMP (whereto) => List(whereto) - case CJUMP(success, failure, _, _) => success :: failure :: Nil - case CZJUMP(success, failure, _, _) => success :: failure :: Nil + case CJUMP(success, failure, _, _) => failure :: success :: Nil + case CZJUMP(success, failure, _, _) => failure :: success :: Nil case SWITCH(_,labels) => labels case RETURN(_) => Nil case THROW() => Nil diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala index 51f7c6af4b..198522829e 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala @@ -911,7 +911,10 @@ abstract class GenICode extends SubComponent { case Literal(value) => if (value.tag != UnitTag) ctx.bb.emit(CONSTANT(value), tree.pos); - generatedType = toTypeKind(value.tpe) + if (value.tag == NullTag) + generatedType = expectedType + else + generatedType = toTypeKind(value.tpe) ctx case Block(stats, expr) => 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 |