summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/backend/jvm/opt/LocalOpt.scala
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2015-10-29 09:59:51 +0100
committerLukas Rytz <lukas.rytz@gmail.com>2015-10-29 21:37:34 +0100
commit6ca9490b179533169da041e9af937f89485e05a1 (patch)
treeadd63bfd7625755bb407272072141e1a94bb8eee /src/compiler/scala/tools/nsc/backend/jvm/opt/LocalOpt.scala
parent8cd1f9566db60f06ab368fad32d474397ece90be (diff)
downloadscala-6ca9490b179533169da041e9af937f89485e05a1.tar.gz
scala-6ca9490b179533169da041e9af937f89485e05a1.tar.bz2
scala-6ca9490b179533169da041e9af937f89485e05a1.zip
[trivial] import Opcodes._ in two files, move a utility method
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/jvm/opt/LocalOpt.scala')
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/opt/LocalOpt.scala20
1 files changed, 5 insertions, 15 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/LocalOpt.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/LocalOpt.scala
index a80b3d0487..25e4bb1593 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/opt/LocalOpt.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/LocalOpt.scala
@@ -9,6 +9,7 @@ package opt
import scala.annotation.switch
import scala.tools.asm.{Type, ClassWriter, MethodWriter, Opcodes}
+import scala.tools.asm.Opcodes._
import scala.tools.asm.tree._
import scala.collection.convert.decorateAsScala._
import scala.tools.nsc.backend.jvm.BTypes.InternalName
@@ -193,7 +194,7 @@ class LocalOpt[BT <: BTypes](val btypes: BT) {
var i = 0
var liveLabels = Set.empty[LabelNode]
var removedInstructions = Set.empty[AbstractInsnNode]
- var maxLocals = (Type.getArgumentsAndReturnSizes(method.desc) >> 2) - (if (BytecodeUtils.isStaticMethod(method)) 1 else 0)
+ var maxLocals = parametersSize(method)
var maxStack = 0
val itr = method.instructions.iterator()
while (itr.hasNext) {
@@ -214,7 +215,7 @@ class LocalOpt[BT <: BTypes](val btypes: BT) {
maxLocals = math.max(maxLocals, i.`var` + 1)
case _ =>
- if (!isLive || insn.getOpcode == Opcodes.NOP) {
+ if (!isLive || insn.getOpcode == NOP) {
// Instruction iterators allow removing during iteration.
// Removing is O(1): instructions are doubly linked list elements.
itr.remove()
@@ -247,7 +248,7 @@ object LocalOptImpls {
def containsExecutableCode(start: AbstractInsnNode, end: LabelNode): Boolean = {
start != end && ((start.getOpcode : @switch) match {
// FrameNode, LabelNode and LineNumberNode have opcode == -1.
- case -1 | Opcodes.GOTO => containsExecutableCode(start.getNext, end)
+ case -1 | GOTO => containsExecutableCode(start.getNext, end)
case _ => true
})
}
@@ -295,17 +296,6 @@ object LocalOptImpls {
}
/**
- * The number of local variable slots used for parameters and for the `this` reference.
- */
- private def parametersSize(method: MethodNode): Int = {
- // Double / long fields occupy two slots, so we sum up the sizes. Since getSize returns 0 for
- // void, we have to add `max 1`.
- val paramsSize = scala.tools.asm.Type.getArgumentTypes(method.desc).iterator.map(_.getSize max 1).sum
- val thisSize = if ((method.access & Opcodes.ACC_STATIC) == 0) 1 else 0
- paramsSize + thisSize
- }
-
- /**
* Compact the local variable slots used in the method's implementation. This prevents having
* unused slots for example after eliminating unreachable code.
*
@@ -579,7 +569,7 @@ object LocalOptImpls {
case Goto(jump) =>
nextExecutableInstruction(jump.label) match {
case Some(target) =>
- if (isReturn(target) || target.getOpcode == Opcodes.ATHROW) {
+ if (isReturn(target) || target.getOpcode == ATHROW) {
method.instructions.set(jump, target.clone(null))
true
} else false