Skip to content

Commit c2317ff

Browse files
Evaluate Expression: interrupt JDIEval after 10 seconds
1 parent 100e75f commit c2317ff

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ import org.jetbrains.kotlin.psi.*
7171
import org.jetbrains.kotlin.psi.codeFragmentUtil.debugTypeInfo
7272
import org.jetbrains.kotlin.psi.codeFragmentUtil.suppressDiagnosticsInDebugMode
7373
import org.jetbrains.kotlin.resolve.AnalyzingUtils
74+
import org.jetbrains.kotlin.resolve.DescriptorUtils
75+
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
7476
import org.jetbrains.kotlin.resolve.BindingContext
7577
import org.jetbrains.kotlin.resolve.BindingTrace
7678
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
@@ -79,6 +81,9 @@ import org.jetbrains.org.objectweb.asm.*
7981
import org.jetbrains.org.objectweb.asm.Opcodes.ASM5
8082
import org.jetbrains.org.objectweb.asm.tree.MethodNode
8183
import java.util.*
84+
import java.util.concurrent.Executors
85+
import java.util.concurrent.TimeUnit
86+
import java.util.concurrent.TimeoutException
8287

8388
internal val RECEIVER_NAME = "\$receiver"
8489
internal val THIS_NAME = "this"
@@ -144,6 +149,10 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour
144149

145150
return result.toJdiValue(context)
146151
}
152+
catch(e: TimeoutException) {
153+
// TODO logError(e)
154+
exception("Evaluation of ${codeFragment.getText()} was interrupted because it took more than 10 seconds")
155+
}
147156
catch(e: EvaluateException) {
148157
throw e
149158
}
@@ -159,9 +168,9 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour
159168
attachmentByPsiFile(codeFragment),
160169
Attachment("breakpoint.info", "line: ${sourcePosition.line}"))
161170
LOG.error(LogMessageEx.createEvent(
162-
"Couldn't evaluate expression",
163-
ExceptionUtil.getThrowableText(e),
164-
mergeAttachments(*attachments)))
171+
"Couldn't evaluate expression",
172+
ExceptionUtil.getThrowableText(e),
173+
mergeAttachments(*attachments)))
165174

166175
val cause = if (e.message != null) ": ${e.message}" else ""
167176
exception("An exception occurs during Evaluate Expression Action $cause")
@@ -238,11 +247,27 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour
238247
context.suspendContext.thread?.threadReference!!,
239248
context.suspendContext.getInvokePolicy())
240249

241-
resultValue = interpreterLoop(
242-
this,
243-
makeInitialFrame(this, args.zip(argumentTypes).map { boxOrUnboxArgumentIfNeeded(eval, it.first, it.second) }),
244-
eval
245-
)
250+
val executor = Executors.newSingleThreadExecutor();
251+
val future = executor.submit {
252+
resultValue = interpreterLoop(
253+
this,
254+
makeInitialFrame(this, args.zip(argumentTypes).map { boxOrUnboxArgumentIfNeeded(eval, it.first, it.second) }),
255+
eval
256+
)
257+
}
258+
259+
try {
260+
future.get(10, TimeUnit.SECONDS)
261+
}
262+
catch (e: TimeoutException) {
263+
context.suspendContext.thread?.threadReference?.resume()
264+
throw e
265+
}
266+
finally {
267+
executor.shutdownNow()
268+
269+
allRequests.forEach { it.enable() }
270+
}
246271

247272
allRequests.forEach { it.enable() }
248273
}

0 commit comments

Comments
 (0)