Just submitted a patch for a macro to generate setter for char* member in
consistent way. Please review.
https://bugzilla.gnome.org/show_bug.cgi?id=793778


-Pavlo Solntsev
---------------------------------------------------------------------------------------------

*Please avoid sending me Word or PowerPoint attachments.See
http://www.gnu.org/philosophy/no-word-attachments.html
<http://www.gnu.org/philosophy/no-word-attachments.html>*

On Fri, Feb 23, 2018 at 10:12 AM, Pavlo Solntsev <pavlo.solnt...@gmail.com>
wrote:

> Perfect! Now I understand the methodology to implement setter for a
> structure. Do you think it would make sense to have a macro for this?  Say,
> _MEMBER_SET_CHAR.
>
> -Pavlo Solntsev
> ------------------------------------------------------------
> ---------------------------------
>
> *Please avoid sending me Word or PowerPoint attachments.See
> http://www.gnu.org/philosophy/no-word-attachments.html
> <http://www.gnu.org/philosophy/no-word-attachments.html>*
>
> On Fri, Feb 23, 2018 at 9:43 AM, Kjell Ahlstedt <kjellahlst...@gmail.com>
> wrote:
>
>> Den 2018-02-23 kl. 15:36, skrev Pavlo Solntsev:
>>
>> >>>  Your concern is justified. The Glib::ustring must be returned by
>> value. The _MEMBER_GET should be
>> It is interesting. getter must return by value....
>>
>> >>> Your _MEMBER_SET macro doesn't seem to fit the generated code that
>> you show. I would think that
>> >>>  _MEMBER_SET(name, name, const Glib::ustring&, gchar*)
>>
>> from https://github.com/GNOME/glibmm/blob/master/tools/m4/member.m4
>> My understanding that the generated type will be const T& if T is
>> provided to the macros.
>>
>> dnl Creates accessors for simple types:
>>
>> define(`_MEMBER_SET',`dnl
>>
>> ifelse(`$5',`deprecated',`_DEPRECATE_IFDEF_START ')dnl
>>
>> void set_$1(const $3`'& value);
>>
>> ifelse(`$5',`deprecated',`_DEPRECATE_IFDEF_END ')dnl
>>
>> _PUSH(SECTION_CC)
>>
>> ifelse(`$5',`deprecated',`_DEPRECATE_IFDEF_START ')dnl
>>
>> void __CPPNAME__::set_$1(const $3`'& value)
>>
>> {
>>
>> gobj()->$2 = _CONVERT($3,$4,`value');
>>
>> }
>>
>> ifelse(`$5',`deprecated',`_DEPRECATE_IFDEF_END ')dnl
>>
>>
>> _POP()')
>>
>>
>>
>>
>> Sorry, I was wrong. _MEMBER_SET(name, name, Glib::ustring, gchar*)
>> does generate the code you showed.
>>
>> >> would generate that code. In this case a reference is OK, but it looks
>> like the generated code can cause a memory leak. Who owns the duplicated
>> string? Who deallocates it? What if gobj()->name contains a pointer to a
>> string when set_name() is called?
>>
>>
>> Basically once again, return by value. What would be the correct wrap for
>> the simple struct? Wrap struct and manually wrap set/get method?
>>
>> I will investigate how private members are stored and how they related to
>> the original C struct. Thanks
>>
>> In Glib::OptionEntry, _MEMBER_SET is not used for strings. Those methods
>> are hand-coded to avoid a memory leak. Example:
>>
>> void OptionEntry::set_long_name(const Glib::ustring& value)
>> {
>>   if (gobject_->long_name)
>>   {
>>     g_free((gchar*)(gobject_->long_name));
>>     gobject_->long_name = nullptr;
>>   }
>>
>>   gobj()->long_name = (value).c_str() ? g_strdup((value).c_str()) :
>> nullptr;
>> }
>>
>>
>> Don't ask me why value.c_str() is tested for nullptr. I don't understand.
>> I don't think it can ever be a nullptr. And even if it is, g_strdup() can
>> handle that.
>>
>>
>>
>> -Pavlo Solntsev
>>
>>
>>
>
_______________________________________________
gtkmm-list mailing list
gtkmm-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to