Debugger: Fix memory leak in conditional breakpoints (KT-31195)

This commit is contained in:
Yan Zhulanow
2019-04-24 22:37:20 +03:00
parent 999d5ce3bb
commit c17c15db42
2 changed files with 15 additions and 7 deletions
@@ -176,6 +176,10 @@ class CodeFragmentCodegen private constructor(
codeFragment.putUserData(INFO_USERDATA_KEY, info)
}
fun clearCodeFragmentInfo(codeFragment: KtCodeFragment) {
codeFragment.putUserData(INFO_USERDATA_KEY, null)
}
@JvmStatic
fun getCodeFragmentInfo(codeFragment: KtCodeFragment): CodeFragmentCodegenInfo {
return codeFragment.getUserData(INFO_USERDATA_KEY) ?: error("Codegen info user data is not set")
@@ -89,17 +89,21 @@ class CodeFragmentCompiler(private val executionContext: ExecutionContext) {
val codegenInfo = CodeFragmentCodegenInfo(classDescriptor, methodDescriptor, parameterInfo.parameters)
CodeFragmentCodegen.setCodeFragmentInfo(codeFragment, codegenInfo)
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
try {
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
val classes = generationState.factory.asList().filterClassFiles()
.map { ClassToLoad(it.internalClassName, it.relativePath, it.asByteArray()) }
val classes = generationState.factory.asList().filterClassFiles()
.map { ClassToLoad(it.internalClassName, it.relativePath, it.asByteArray()) }
val methodSignature = getMethodSignature(methodDescriptor, parameterInfo, generationState)
val functionSuffixes = getLocalFunctionSuffixes(parameterInfo.parameters, generationState.typeMapper)
val methodSignature = getMethodSignature(methodDescriptor, parameterInfo, generationState)
val functionSuffixes = getLocalFunctionSuffixes(parameterInfo.parameters, generationState.typeMapper)
generationState.destroy()
generationState.destroy()
return CompilationResult(classes, parameterInfo, functionSuffixes, methodSignature)
return CompilationResult(classes, parameterInfo, functionSuffixes, methodSignature)
} finally {
CodeFragmentCodegen.clearCodeFragmentInfo(codeFragment)
}
}
private fun getLocalFunctionSuffixes(