From 6cec69ef7ba448f0be1ce3a51118bbbfc6f49aef Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Thu, 13 Feb 2020 19:46:05 +0000 Subject: [PATCH] Remove an unnecessary shared_ptr reference count increment in Ruby wrappers When wrapping STL containers, remove a shared_ptr reference count increment when an upcast is needed when checking type conversion in traits_check::check. --- Lib/ruby/std_shared_ptr.i | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/Lib/ruby/std_shared_ptr.i b/Lib/ruby/std_shared_ptr.i index dee35ec03..086e30814 100644 --- a/Lib/ruby/std_shared_ptr.i +++ b/Lib/ruby/std_shared_ptr.i @@ -13,24 +13,27 @@ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::shared_ptr **val) { - std::shared_ptr *p = 0; + int res = SWIG_ERROR; swig_type_info *descriptor = type_info >(); - swig_ruby_owntype newmem = {0, 0}; - int res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR; - if (SWIG_IsOK(res)) { - if (val) { - if (*val) { - **val = p ? *p : std::shared_ptr(); - } else { - *val = p; - if (newmem.own & SWIG_CAST_NEW_MEMORY) { - // Upcast for pointers to shared_ptr in this generic framework has not been implemented - res = SWIG_ERROR; - } - } - } - if (newmem.own & SWIG_CAST_NEW_MEMORY) - delete p; + if (val) { + std::shared_ptr *p = 0; + swig_ruby_owntype newmem = {0, 0}; + res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR; + if (SWIG_IsOK(res)) { + if (*val) { + **val = p ? *p : std::shared_ptr(); + } else { + *val = p; + if (newmem.own & SWIG_CAST_NEW_MEMORY) { + // Upcast for pointers to shared_ptr in this generic framework has not been implemented + res = SWIG_ERROR; + } + } + if (newmem.own & SWIG_CAST_NEW_MEMORY) + delete p; + } + } else { + res = descriptor ? SWIG_ConvertPtr(obj, 0, descriptor, 0) : SWIG_ERROR; } return res; }