Skip to content

Commit a4d74b6

Browse files
Kordyjananatoliykmetyuk
authored andcommitted
Fix problems with only first instance of inlined call being found
1 parent 0ef53d5 commit a4d74b6

File tree

2 files changed

+24
-14
lines changed

2 files changed

+24
-14
lines changed

compiler/src/dotty/tools/backend/jvm/BCodeSkelBuilder.scala

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,8 @@ trait BCodeSkelBuilder extends BCodeHelpers {
376376
var shouldEmitCleanup = false
377377
// line numbers
378378
var lastEmittedLineNr = -1
379+
// by real line number we mean line number that is not pointing to virtual lines added by inlined calls
380+
var lastRealLineNr = -1
379381

380382
object bc extends JCodeMethodN {
381383
override def jmethod = PlainSkelBuilder.this.mnode
@@ -552,19 +554,27 @@ trait BCodeSkelBuilder extends BCodeHelpers {
552554
case labnode: asm.tree.LabelNode => (labnode.getLabel == lbl);
553555
case _ => false } )
554556
}
557+
558+
def emitNr(nr: Int): Unit =
559+
if nr != lastEmittedLineNr then
560+
lastEmittedLineNr = nr
561+
lastInsn match
562+
case lnn: asm.tree.LineNumberNode =>
563+
// overwrite previous landmark as no instructions have been emitted for it
564+
lnn.line = nr
565+
case _ =>
566+
mnode.visitLineNumber(nr, currProgramPoint())
567+
555568
def lineNumber(tree: Tree): Unit = {
556-
if (!emitLines || !tree.span.exists) return;
557-
val nr = if (tree.source != cunit.source) sourceMap.lineFor(tree.sourcePos) else Some(ctx.source.offsetToLine(tree.span.point) + 1)
558-
nr match
559-
case Some(nr) if nr != lastEmittedLineNr =>
560-
lastEmittedLineNr = nr
561-
lastInsn match
562-
case lnn: asm.tree.LineNumberNode =>
563-
// overwrite previous landmark as no instructions have been emitted for it
564-
lnn.line = nr
565-
case _ =>
566-
mnode.visitLineNumber(nr, currProgramPoint())
567-
case _ => ()
569+
if !emitLines || !tree.span.exists then return;
570+
if tree.source != cunit.source then
571+
sourceMap.lineFor(tree.sourcePos, lastRealLineNr) match
572+
case Some(nr) => emitNr(nr)
573+
case None => ()
574+
else
575+
val nr = ctx.source.offsetToLine(tree.span.point) + 1
576+
lastRealLineNr = nr
577+
emitNr(nr)
568578
}
569579

570580
// on entering a method

compiler/src/dotty/tools/backend/jvm/InlinedSourceMaps.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ object InlinedSourceMaps:
130130
b.toString
131131
}
132132

133-
def lineFor(sourcePos: SourcePosition): Option[Int] =
134-
requests.find(_.origPos.contains(sourcePos)) match
133+
def lineFor(sourcePos: SourcePosition, lastRealNr: Int): Option[Int] =
134+
requests.find(r => r.origPos.contains(sourcePos) && r.targetPos.endLine + 1 >= lastRealNr) match
135135
case Some(request) =>
136136
val offset = sourcePos.startLine - request.origPos.startLine
137137
Some(request.firstFakeLine + offset + 1)

0 commit comments

Comments
 (0)