summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2016-05-30 14:38:50 +0200
committerJason Zaugg <jzaugg@gmail.com>2016-06-06 14:34:57 +1000
commit1f812e9482855d3fd5a8a5e9118942dc80f22db5 (patch)
tree2aa13db16bb9b32028ac277632d9b54627da2269 /src
parent3bb735823f6815002895b1a335c6d105ddbe3e9e (diff)
downloadscala-1f812e9482855d3fd5a8a5e9118942dc80f22db5.tar.gz
scala-1f812e9482855d3fd5a8a5e9118942dc80f22db5.tar.bz2
scala-1f812e9482855d3fd5a8a5e9118942dc80f22db5.zip
Avoid separate traversal in inliner to remove line number nodes
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/analysis/BackendUtils.scala10
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala6
2 files changed, 7 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/analysis/BackendUtils.scala b/src/compiler/scala/tools/nsc/backend/jvm/analysis/BackendUtils.scala
index 6d3c3f3863..9abd1d8006 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/analysis/BackendUtils.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/analysis/BackendUtils.scala
@@ -98,7 +98,7 @@ class BackendUtils[BT <: BTypes](val btypes: BT) {
* a boolean indicating if the instruction list contains an instantiation of a serializable SAM
* type.
*/
- def cloneInstructions(methodNode: MethodNode, labelMap: Map[LabelNode, LabelNode]): (InsnList, Map[AbstractInsnNode, AbstractInsnNode], Boolean) = {
+ def cloneInstructions(methodNode: MethodNode, labelMap: Map[LabelNode, LabelNode], keepLineNumbers: Boolean): (InsnList, Map[AbstractInsnNode, AbstractInsnNode], Boolean) = {
val javaLabelMap = labelMap.asJava
val result = new InsnList
var map = Map.empty[AbstractInsnNode, AbstractInsnNode]
@@ -112,9 +112,11 @@ class BackendUtils[BT <: BTypes](val btypes: BT) {
}
case _ =>
}
- val cloned = ins.clone(javaLabelMap)
- result add cloned
- map += ((ins, cloned))
+ if (keepLineNumbers || !ins.isInstanceOf[LineNumberNode]) {
+ val cloned = ins.clone(javaLabelMap)
+ result add cloned
+ map += ((ins, cloned))
+ }
}
(result, map, hasSerializableClosureInstantiation)
}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala
index 809b9e310d..d18963ec8b 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala
@@ -268,11 +268,7 @@ class Inliner[BT <: BTypes](val btypes: BT) {
// New labels for the cloned instructions
val labelsMap = cloneLabels(callee)
- val (clonedInstructions, instructionMap, hasSerializableClosureInstantiation) = cloneInstructions(callee, labelsMap)
- val keepLineNumbers = callsiteClass == calleeDeclarationClass
- if (!keepLineNumbers) {
- removeLineNumberNodes(clonedInstructions)
- }
+ val (clonedInstructions, instructionMap, hasSerializableClosureInstantiation) = cloneInstructions(callee, labelsMap, keepLineNumbers = callsiteClass == calleeDeclarationClass)
// local vars in the callee are shifted by the number of locals at the callsite
val localVarShift = callsiteMethod.maxLocals