Do an ordinal step over while stepping over inlined calls in dex
(cherry picked from commit d741895)
This commit is contained in:
committed by
Nikolay Krasko
parent
b6460e6280
commit
06b72e608e
@@ -35,6 +35,7 @@ import com.sun.jdi.request.EventRequestManager;
|
||||
import com.sun.jdi.request.StepRequest;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.kotlin.idea.debugger.NoStrataPositionManagerHelperKt;
|
||||
import org.jetbrains.kotlin.psi.KtFunctionLiteral;
|
||||
import org.jetbrains.kotlin.psi.KtNamedFunction;
|
||||
|
||||
@@ -50,9 +51,17 @@ public class DebuggerSteppingHelper {
|
||||
final KotlinSteppingCommandProvider.KotlinSourcePosition kotlinSourcePosition
|
||||
) {
|
||||
final DebugProcessImpl debugProcess = suspendContext.getDebugProcess();
|
||||
|
||||
return debugProcess.new ResumeCommand(suspendContext) {
|
||||
@Override
|
||||
public void contextAction() {
|
||||
// In DEX there's no strata for trying to understand what lines were inlined and no local variables attributes are
|
||||
// preserved that can be used for fine tuning. So do an ordinal 'step over' instead.
|
||||
if (NoStrataPositionManagerHelperKt.isDexDebug(suspendContext.getDebugProcess())) {
|
||||
debugProcess.createStepOverCommand(suspendContext, true).contextAction();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
StackFrameProxyImpl frameProxy = suspendContext.getFrameProxy();
|
||||
if (frameProxy != null) {
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
LineBreakpoint created at inlineInIfFalseDex.kt:6
|
||||
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! inlineInIfFalseDex.InlineInIfFalseDexKt
|
||||
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
inlineInIfFalseDex.kt:6
|
||||
inlineInIfFalseDex.kt:15
|
||||
inlineInIfFalseDex.kt:9
|
||||
inlineInIfFalseDex.kt:10
|
||||
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
|
||||
Process finished with exit code 0
|
||||
@@ -0,0 +1,10 @@
|
||||
LineBreakpoint created at inlineInIfTrueDex.kt:6
|
||||
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! inlineInIfTrueDex.InlineInIfTrueDexKt
|
||||
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
inlineInIfTrueDex.kt:6
|
||||
inlineInIfTrueDex.kt:14
|
||||
inlineInIfTrueDex.kt:7
|
||||
inlineInIfTrueDex.kt:9
|
||||
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
|
||||
Process finished with exit code 0
|
||||
@@ -0,0 +1,14 @@
|
||||
LineBreakpoint created at soInlineAnonymousFunctionArgumentDex.kt:5
|
||||
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineAnonymousFunctionArgumentDex.SoInlineAnonymousFunctionArgumentDexKt
|
||||
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
soInlineAnonymousFunctionArgumentDex.kt:5
|
||||
soInlineAnonymousFunctionArgumentDex.kt:7
|
||||
soInlineAnonymousFunctionArgumentDex.kt:15
|
||||
soInlineAnonymousFunctionArgumentDex.kt:8
|
||||
soInlineAnonymousFunctionArgumentDex.kt:16
|
||||
soInlineAnonymousFunctionArgumentDex.kt:15
|
||||
soInlineAnonymousFunctionArgumentDex.kt:11
|
||||
soInlineAnonymousFunctionArgumentDex.kt:16
|
||||
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
|
||||
Process finished with exit code 0
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
LineBreakpoint created at soInlineCallInLastStatementInInlineDex.kt:10
|
||||
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineCallInLastStatementInInlineDex.SoInlineCallInLastStatementInInlineDexKt
|
||||
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
soInlineCallInLastStatementInInlineDex.kt:10
|
||||
soInlineCallInLastStatementInInlineDex.kt:11
|
||||
soInlineCallInLastStatementInInlineDex.kt:15
|
||||
soInlineCallInLastStatementInInlineDex.kt:11
|
||||
soInlineCallInLastStatementInInlineDex.kt:16
|
||||
soInlineCallInLastStatementInInlineDex.kt:6
|
||||
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
|
||||
Process finished with exit code 0
|
||||
Vendored
+9
@@ -0,0 +1,9 @@
|
||||
LineBreakpoint created at soInlineCallInLastStatementInInlineFunctionArgument.kt:7
|
||||
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineCallInLastStatementInInlineFunctionArgument.SoInlineCallInLastStatementInInlineFunctionArgumentKt
|
||||
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
soInlineCallInLastStatementInInlineFunctionArgument.kt:7
|
||||
soInlineCallInLastStatementInInlineFunctionArgument.kt:8
|
||||
soInlineCallInLastStatementInInlineFunctionArgument.kt:9
|
||||
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
|
||||
Process finished with exit code 0
|
||||
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
LineBreakpoint created at soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:7
|
||||
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineCallInLastStatementInInlineFunctionArgumentDex.SoInlineCallInLastStatementInInlineFunctionArgumentDexKt
|
||||
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:7
|
||||
soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:17
|
||||
soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:18
|
||||
soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:14
|
||||
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
|
||||
Process finished with exit code 0
|
||||
@@ -0,0 +1,18 @@
|
||||
LineBreakpoint created at soInlineWhileConditionDex.kt:5
|
||||
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineWhileConditionDex.SoInlineWhileConditionDexKt
|
||||
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
soInlineWhileConditionDex.kt:5
|
||||
soInlineWhileConditionDex.kt:7
|
||||
soInlineWhileConditionDex.kt:18
|
||||
soInlineWhileConditionDex.kt:7
|
||||
soInlineWhileConditionDex.kt:8
|
||||
soInlineWhileConditionDex.kt:7
|
||||
soInlineWhileConditionDex.kt:18
|
||||
soInlineWhileConditionDex.kt:7
|
||||
soInlineWhileConditionDex.kt:12
|
||||
soInlineWhileConditionDex.kt:18
|
||||
soInlineWhileConditionDex.kt:12
|
||||
soInlineWhileConditionDex.kt:15
|
||||
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||
|
||||
Process finished with exit code 0
|
||||
@@ -0,0 +1,18 @@
|
||||
package inlineInIfFalseDex
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val bar = ""
|
||||
//Breakpoint!
|
||||
if (inlineCall { true }) {
|
||||
foo()
|
||||
}
|
||||
foo()
|
||||
}
|
||||
|
||||
fun foo() {}
|
||||
|
||||
inline fun inlineCall(predicate: (String?) -> Boolean): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
// STEP_OVER: 8
|
||||
@@ -0,0 +1,17 @@
|
||||
package inlineInIfTrueDex
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val bar = ""
|
||||
//Breakpoint!
|
||||
if (inlineCall { true }) {
|
||||
foo()
|
||||
}
|
||||
}
|
||||
|
||||
fun foo() {}
|
||||
|
||||
inline fun inlineCall(predicate: (String?) -> Boolean): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
// STEP_OVER: 6
|
||||
Vendored
+20
@@ -0,0 +1,20 @@
|
||||
package soInlineAnonymousFunctionArgumentDex
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
//Breakpoint!
|
||||
val b = 1
|
||||
|
||||
foo(
|
||||
fun (){ test(1) }
|
||||
)
|
||||
|
||||
foo(fun (){ test(1) })
|
||||
}
|
||||
|
||||
inline fun foo(f: () -> Unit) {
|
||||
f()
|
||||
}
|
||||
|
||||
fun test(i: Int) = 1
|
||||
|
||||
// STEP_OVER: 10
|
||||
Vendored
+20
@@ -0,0 +1,20 @@
|
||||
package soInlineCallInLastStatementInInlineDex
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
bar()
|
||||
nop()
|
||||
}
|
||||
|
||||
inline fun bar() {
|
||||
//Breakpoint!
|
||||
nop()
|
||||
foo { 42 }
|
||||
}
|
||||
|
||||
inline fun foo(f: () -> Unit) {
|
||||
f()
|
||||
}
|
||||
|
||||
fun nop() {}
|
||||
|
||||
// STEP_OVER: 8
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
package soInlineCallInLastStatementInInlineFunctionArgument
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
bar {
|
||||
nop()
|
||||
//Breakpoint!
|
||||
foo()
|
||||
}
|
||||
}
|
||||
|
||||
inline fun bar(f: () -> Unit) {
|
||||
nop()
|
||||
f()
|
||||
}
|
||||
|
||||
inline fun foo() {
|
||||
nop()
|
||||
}
|
||||
|
||||
fun nop() {}
|
||||
|
||||
// STEP_OVER: 3
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
package soInlineCallInLastStatementInInlineFunctionArgumentDex
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
bar {
|
||||
nop()
|
||||
//Breakpoint!
|
||||
foo()
|
||||
}
|
||||
}
|
||||
|
||||
inline fun bar(f: () -> Unit) {
|
||||
nop()
|
||||
f()
|
||||
}
|
||||
|
||||
inline fun foo() {
|
||||
nop()
|
||||
}
|
||||
|
||||
fun nop() {}
|
||||
|
||||
// STEP_OVER: 5
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
package soInlineWhileConditionDex
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
//Breakpoint!
|
||||
var i = 1
|
||||
// inline in while condition (true)
|
||||
while (id { i < 2 }) {
|
||||
i++
|
||||
}
|
||||
|
||||
// inline in while condition (false)
|
||||
while (id { false }) {
|
||||
bar()
|
||||
}
|
||||
}
|
||||
|
||||
inline fun id(f: () -> Boolean): Boolean {
|
||||
return f()
|
||||
}
|
||||
|
||||
fun bar() {}
|
||||
|
||||
// STEP_OVER: 12
|
||||
@@ -421,12 +421,24 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest {
|
||||
doStepOverTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("inlineInIfFalseDex.kt")
|
||||
public void testInlineInIfFalseDex() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInIfFalseDex.kt");
|
||||
doStepOverTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("inlineInIfTrue.kt")
|
||||
public void testInlineInIfTrue() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInIfTrue.kt");
|
||||
doStepOverTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("inlineInIfTrueDex.kt")
|
||||
public void testInlineInIfTrueDex() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInIfTrueDex.kt");
|
||||
doStepOverTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("inlineInObjectDex.kt")
|
||||
public void testInlineInObjectDex() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInObjectDex.kt");
|
||||
@@ -451,12 +463,36 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest {
|
||||
doStepOverTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("soInlineAnonymousFunctionArgumentDex.kt")
|
||||
public void testSoInlineAnonymousFunctionArgumentDex() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineAnonymousFunctionArgumentDex.kt");
|
||||
doStepOverTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("soInlineCallInLastStatementInInline.kt")
|
||||
public void testSoInlineCallInLastStatementInInline() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInline.kt");
|
||||
doStepOverTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("soInlineCallInLastStatementInInlineDex.kt")
|
||||
public void testSoInlineCallInLastStatementInInlineDex() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineDex.kt");
|
||||
doStepOverTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("soInlineCallInLastStatementInInlineFunctionArgument.kt")
|
||||
public void testSoInlineCallInLastStatementInInlineFunctionArgument() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgument.kt");
|
||||
doStepOverTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("soInlineCallInLastStatementInInlineFunctionArgumentDex.kt")
|
||||
public void testSoInlineCallInLastStatementInInlineFunctionArgumentDex() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgumentDex.kt");
|
||||
doStepOverTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("soInlineCallInLastStatementInInlineInInline.kt")
|
||||
public void testSoInlineCallInLastStatementInInlineInInline() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineInInline.kt");
|
||||
@@ -505,6 +541,12 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest {
|
||||
doStepOverTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("soInlineWhileConditionDex.kt")
|
||||
public void testSoInlineWhileConditionDex() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineWhileConditionDex.kt");
|
||||
doStepOverTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("soReifiedInlineIfConditionFalse.kt")
|
||||
public void testSoReifiedInlineIfConditionFalse() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soReifiedInlineIfConditionFalse.kt");
|
||||
|
||||
Reference in New Issue
Block a user