diff options
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 |