From 150162e3db5dab4b00a56e7749cc781cd8a9f444 Mon Sep 17 00:00:00 2001 From: Marius Ungureanu Date: Wed, 14 Sep 2016 17:24:47 +0300 Subject: [PATCH] [Gen] Always free strdup strings as they're not held by native This fixes a few leaks caused by gstrdup-ing by firing and forgetting. --- generator/MarshalGen.cs | 17 +++++++++++++++++ generator/SymbolTable.cs | 6 +++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/generator/MarshalGen.cs b/generator/MarshalGen.cs index fbbe3aafc..017e0a91e 100644 --- a/generator/MarshalGen.cs +++ b/generator/MarshalGen.cs @@ -60,5 +60,22 @@ public override string FromNative (string var) return String.Format (from_fmt, var); } } + + public class StringMarshalGen : MarshalGen, IManualMarshaler + { + public StringMarshalGen (string ctype, string type, string mtype, string call_fmt, string from_fmt) : base (ctype, type, mtype, call_fmt, from_fmt, true) + { + } + + public string AllocNative (string managed_var) + { + return CallByName (managed_var); + } + + public string ReleaseNative (string native_var) + { + return string.Format ("GLib.Marshaller.Free ({0})", native_var); + } + } } diff --git a/generator/SymbolTable.cs b/generator/SymbolTable.cs index 3ac41d01f..b2a019f34 100644 --- a/generator/SymbolTable.cs +++ b/generator/SymbolTable.cs @@ -107,9 +107,9 @@ public SymbolTable () AddType (new ConstStringGen ("const-xmlChar")); AddType (new ConstStringGen ("const-char")); AddType (new ConstFilenameGen ("const-gfilename")); - AddType (new MarshalGen ("gfilename", "string", "IntPtr", "GLib.Marshaller.StringToFilenamePtr({0})", "GLib.Marshaller.FilenamePtrToStringGFree({0})")); - AddType (new MarshalGen ("gchar", "string", "IntPtr", "GLib.Marshaller.StringToPtrGStrdup({0})", "GLib.Marshaller.PtrToStringGFree({0})")); - AddType (new MarshalGen ("char", "string", "IntPtr", "GLib.Marshaller.StringToPtrGStrdup({0})", "GLib.Marshaller.PtrToStringGFree({0})")); + AddType (new StringMarshalGen ("gfilename", "string", "IntPtr", "GLib.Marshaller.StringToFilenamePtr({0})", "GLib.Marshaller.FilenamePtrToStringGFree({0})")); + AddType (new StringMarshalGen ("gchar", "string", "IntPtr", "GLib.Marshaller.StringToPtrGStrdup({0})", "GLib.Marshaller.PtrToStringGFree({0})")); + AddType (new StringMarshalGen ("char", "string", "IntPtr", "GLib.Marshaller.StringToPtrGStrdup({0})", "GLib.Marshaller.PtrToStringGFree({0})")); AddType (new SimpleGen ("GStrv", "string[]", "null")); // manually wrapped types requiring more complex marshaling