ObjCExport: don't generate redundant exception handler for objc_release
This commit is contained in:
committed by
Space
parent
cdfcffbd57
commit
eaa6a75de4
+6
@@ -661,6 +661,12 @@ internal abstract class FunctionGenerationContext(
|
|||||||
}.let {} // Force exhaustive.
|
}.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) =
|
fun memset(pointer: LLVMValueRef, value: Byte, size: Int, isVolatile: Boolean = false) =
|
||||||
call(context.llvm.memsetFunction,
|
call(context.llvm.memsetFunction,
|
||||||
listOf(pointer,
|
listOf(pointer,
|
||||||
|
|||||||
+8
-1
@@ -86,6 +86,13 @@ internal class ObjCExportFunctionGenerationContext(
|
|||||||
rawRet(result)
|
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() {
|
override fun processReturns() {
|
||||||
// Do nothing.
|
// Do nothing.
|
||||||
}
|
}
|
||||||
@@ -1041,7 +1048,7 @@ private fun ObjCExportCodeGenerator.generateObjCImp(
|
|||||||
is MethodBridge.ReturnValue.WithError.ZeroForError -> {
|
is MethodBridge.ReturnValue.WithError.ZeroForError -> {
|
||||||
if (returnType.successBridge == MethodBridge.ReturnValue.Instance.InitResult) {
|
if (returnType.successBridge == MethodBridge.ReturnValue.Instance.InitResult) {
|
||||||
// Release init receiver, as required by convention.
|
// Release init receiver, as required by convention.
|
||||||
callFromBridge(objcRelease, listOf(param(0)), toNative = true)
|
objcReleaseFromRunnableThreadState(param(0))
|
||||||
}
|
}
|
||||||
Zero(returnType.toLlvmRetType(context).llvmType).llvm
|
Zero(returnType.toLlvmRetType(context).llvmType).llvm
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user