ObjCExport: don't generate redundant exception handler for objc_release

This commit is contained in:
Svyatoslav Scherbina
2022-01-13 12:37:38 +03:00
committed by Space
parent cdfcffbd57
commit eaa6a75de4
2 changed files with 14 additions and 1 deletions
@@ -661,6 +661,12 @@ internal abstract class FunctionGenerationContext(
}.let {} // Force exhaustive.
}
fun switchThreadStateIfExperimentalMM(state: ThreadState) {
if (context.memoryModel == MemoryModel.EXPERIMENTAL) {
switchThreadState(state)
}
}
fun memset(pointer: LLVMValueRef, value: Byte, size: Int, isVolatile: Boolean = false) =
call(context.llvm.memsetFunction,
listOf(pointer,
@@ -86,6 +86,13 @@ internal class ObjCExportFunctionGenerationContext(
rawRet(result)
}
fun objcReleaseFromRunnableThreadState(objCReference: LLVMValueRef) {
switchThreadStateIfExperimentalMM(ThreadState.Native)
// It is nounwind, so no exception handler is required.
call(objCExportCodegen.objcRelease, listOf(objCReference), exceptionHandler = ExceptionHandler.None)
switchThreadStateIfExperimentalMM(ThreadState.Runnable)
}
override fun processReturns() {
// Do nothing.
}
@@ -1041,7 +1048,7 @@ private fun ObjCExportCodeGenerator.generateObjCImp(
is MethodBridge.ReturnValue.WithError.ZeroForError -> {
if (returnType.successBridge == MethodBridge.ReturnValue.Instance.InitResult) {
// Release init receiver, as required by convention.
callFromBridge(objcRelease, listOf(param(0)), toNative = true)
objcReleaseFromRunnableThreadState(param(0))
}
Zero(returnType.toLlvmRetType(context).llvmType).llvm
}