diff --git a/src/main/kotlin/be/ugent/topl/mio/debugger/Debugger.kt b/src/main/kotlin/be/ugent/topl/mio/debugger/Debugger.kt index 1983adb..912983e 100644 --- a/src/main/kotlin/be/ugent/topl/mio/debugger/Debugger.kt +++ b/src/main/kotlin/be/ugent/topl/mio/debugger/Debugger.kt @@ -201,6 +201,12 @@ open class Debugger(private val connection: Connection, start: Boolean = true, p messageQueue.waitForResponse("STEP!") //currentSnapshot = snapshotFull().second } + fun stepUntil(cond: (WOODDumpResponse) -> Boolean) { + stepInto() + while (!cond(checkpoints.last()!!.snapshot)) { + stepInto() + } + } open fun stepOver() { commandBreakpoint = true send(5) @@ -210,10 +216,10 @@ open class Debugger(private val connection: Connection, start: Boolean = true, p } commandBreakpoint = false } - fun stepUntil(cond: (WOODDumpResponse) -> Boolean) { - stepInto() + fun stepOverUntil(cond: (WOODDumpResponse) -> Boolean) { + stepOver() while (!cond(checkpoints.last()!!.snapshot)) { - stepInto() + stepOver() } } diff --git a/src/main/kotlin/be/ugent/topl/mio/ui/InteractiveDebugger.kt b/src/main/kotlin/be/ugent/topl/mio/ui/InteractiveDebugger.kt index 61d7f94..9cbe3ea 100644 --- a/src/main/kotlin/be/ugent/topl/mio/ui/InteractiveDebugger.kt +++ b/src/main/kotlin/be/ugent/topl/mio/ui/InteractiveDebugger.kt @@ -63,11 +63,14 @@ class InteractiveDebugger( private val stepIntoButton = JButton().apply { toolTipText = "Step a single instruction" } + private val stepBackLineButton = JButton().apply { + toolTipText = "Step to the previous line" + } private val stepLineButton = JButton().apply { toolTipText = "Step to the next line" } - private val stepBackLineButton = JButton().apply { - toolTipText = "Step to the previous line" + private val stepOverLineButton = JButton().apply { + toolTipText = "Step over line" } private val flashButton = JButton().apply { toolTipText = "Upload module to microcontroller" @@ -75,8 +78,8 @@ class InteractiveDebugger( private val progressBar = JProgressBar().apply { isVisible = false } - private val allButtons = listOf(pauseButton, stepBackButton, stepOverButton, stepIntoButton, stepLineButton, stepBackLineButton, flashButton) - private val pausedOnlyButtons = listOf(stepBackButton, stepOverButton, stepIntoButton, stepLineButton, stepBackLineButton) + private val allButtons = listOf(pauseButton, stepBackButton, stepOverButton, stepIntoButton, stepLineButton, stepBackLineButton, stepOverLineButton, flashButton) + private val pausedOnlyButtons = listOf(stepBackButton, stepOverButton, stepIntoButton, stepLineButton, stepBackLineButton, stepOverLineButton) private var paused = false init { @@ -205,6 +208,31 @@ class InteractiveDebugger( updateStepBackButton() updatePcLabel() } + stepOverLineButton.icon = FlatSVGIcon(javaClass.getResource("/debug-step-over.svg")) + stepOverLineButton.addActionListener { + if (sourceMapping == null) { + stepBackLineButton.isEnabled = false + return@addActionListener + } + + println("Step over line") + var startLine = -1 + try { + startLine = sourceMapping.getLineForPc(debugger.checkpoints.last()!!.snapshot.pc!!) + } catch(re: RuntimeException) { + System.err.println("WARNING: " + re.message) + } + debugger.stepOverUntil { + try { + sourceMapping.getLineForPc(it.pc!!) != startLine + } catch(re: RuntimeException) { + System.err.println("WARNING: " + re.message) + false + } + } + updateStepBackButton() + updatePcLabel() + } flashButton.icon = FlatSVGIcon(javaClass.getResource("/debug-update-module.svg")) flashButton.addActionListener { /*val dialog = JFileChooser() @@ -240,6 +268,7 @@ class InteractiveDebugger( toolBar.addSeparator() toolBar.add(stepBackLineButton) toolBar.add(stepLineButton) + toolBar.add(stepOverLineButton) toolBar.addSeparator() toolBar.add(flashButton) toolBar.addSeparator()