From 7856797b6a43f5e0fa8137761d4c41251bf91b1e Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 28 May 2019 07:05:47 -0700 Subject: [PATCH] [generator] Check if an object/pointer is null before trying to call release on it. (#6148) Note that the 'needsPtrZeroCheck' variable is not accurately named anymore, but given that the code is somewhat impenetrable I wasn't able to come up with a better name. Also simplify two consecutive and identical null checks to a single check. --- src/generator.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/generator.cs b/src/generator.cs index c900dc4536..ef719c7827 100644 --- a/src/generator.cs +++ b/src/generator.cs @@ -4458,14 +4458,22 @@ public partial class Generator : IMemberGatherer { RegisterMethodName ("void_objc_msgSend"); } - if (!needsPtrZeroCheck) + if (!needsPtrZeroCheck) { + print ("if (ret != null)"); + indent++; print ("global::{0}.void_objc_msgSend (ret.Handle, Selector.GetHandle (\"release\"));", ns.Messaging); - else { + indent--; + } else { // We must create the managed wrapper before calling Release on it // FIXME: https://trello.com/c/1ukS9TbL/43-introduce-common-object-type-for-all-unmanaged-types-which-will-correctly-implement-idisposable-and-inativeobject // We should consider using return INativeObject (ptr, bool); here at some point - print ("global::{0} relObj = ret == IntPtr.Zero ? null : new global::{0} (ret);", mi.ReturnType.FullName); - print ("if (relObj != null) global::{0}.void_objc_msgSend (relObj.Handle, Selector.GetHandle (\"release\"));", ns.Messaging); + print ("global::{0} relObj = null;", mi.ReturnType.FullName); + print ("if (ret != IntPtr.Zero) {"); + indent++; + print ("relObj = new global::{0} (ret);", mi.ReturnType.FullName); + print ("global::{0}.void_objc_msgSend (ret, Selector.GetHandle (\"release\"));", ns.Messaging); + indent--; + print ("}"); } }