From 16fef6601bb817f4286198db519d0987bcf9c9c9 Mon Sep 17 00:00:00 2001 From: Mike Kestner Date: Mon, 27 Mar 2006 18:35:08 +0000 Subject: [PATCH] 2006-03-27 Mike Kestner * glib/ListBase.cs : deal with ownership of Opaque elements. * glib/Marshaller.cs : add a hack to deal with Opaque ownership in ListToArray marshaling. svn path=/trunk/gtk-sharp/; revision=58609 --- ChangeLog | 6 ++++++ glib/ListBase.cs | 8 ++++++-- glib/Marshaller.cs | 4 ++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0ba25ac31..172402f75 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-03-27 Mike Kestner + + * glib/ListBase.cs : deal with ownership of Opaque elements. + * glib/Marshaller.cs : add a hack to deal with Opaque ownership in + ListToArray marshaling. + 2006-02-28 Mike Kestner * bootstrap-2.* : update for 2.x.2 releases. diff --git a/glib/ListBase.cs b/glib/ListBase.cs index 27cf05900..51836aee9 100644 --- a/glib/ListBase.cs +++ b/glib/ListBase.cs @@ -31,7 +31,7 @@ namespace GLib { private IntPtr list_ptr = IntPtr.Zero; private int length = -1; private bool managed = false; - private bool elements_owned = false; + internal bool elements_owned = false; protected System.Type element_type = null; abstract internal IntPtr NthData (uint index); @@ -134,6 +134,8 @@ namespace GLib { ret = data; else if (element_type.IsSubclassOf (typeof (GLib.Object))) ret = GLib.Object.GetObject (data, false); + else if (element_type.IsSubclassOf (typeof (GLib.Opaque))) + ret = GLib.Opaque.GetOpaque (data, element_type, elements_owned); else if (element_type == typeof (int)) ret = (int) data; else if (element_type.IsValueType) @@ -159,7 +161,9 @@ namespace GLib { for (uint i = 0; i < Count; i++) if (typeof (GLib.Object).IsAssignableFrom (element_type)) g_object_unref (NthData (i)); - else + else if (typeof (GLib.Opaque).IsAssignableFrom (element_type)) + GLib.Opaque.GetOpaque (NthData (i), element_type, true).Dispose (); + else g_free (NthData (i)); if (managed) diff --git a/glib/Marshaller.cs b/glib/Marshaller.cs index 88f580844..99f1abdc1 100644 --- a/glib/Marshaller.cs +++ b/glib/Marshaller.cs @@ -286,6 +286,10 @@ namespace GLib { Array result = Array.CreateInstance (type, list.Count); if (list.Count > 0) list.CopyTo (result, 0); + + if (type.IsSubclassOf (typeof (GLib.Opaque))) + list.elements_owned = false; + return result; } }