Merge pull request #63 from knocte/class_init

glib: avoid a delegate to be GCed which could cause a NRE (bxc#13113)
This commit is contained in:
Bertrand Lorentz 2013-07-23 08:39:45 -07:00
commit a7c335c4c4
2 changed files with 10 additions and 7 deletions

View File

@ -1,9 +1,11 @@
// GLib.Type.cs - GLib GType class implementation
//
// Author: Mike Kestner <mkestner@speakeasy.net>
// Authors: Mike Kestner <mkestner@speakeasy.net>
// Andres G. Aragoneses <knocte@gmail.com>
//
// Copyright (c) 2003 Mike Kestner
// Copyright (c) 2003 Novell, Inc.
// Copyright (c) 2013 Andres G. Aragoneses
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 2 of the Lesser GNU General
@ -36,11 +38,10 @@ namespace GLib {
IntPtr val;
[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
internal delegate void ClassInitDelegate (IntPtr gobject_class_handle);
struct GTypeInfo {
[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
public delegate void ClassInitDelegate (IntPtr gobject_class_handle);
public ushort class_size;
public IntPtr base_init;
public IntPtr base_finalize;
@ -371,7 +372,7 @@ namespace GLib {
GTypeInfo info = new GTypeInfo ();
info.class_size = (ushort) query.class_size;
info.instance_size = (ushort) query.instance_size;
info.class_init = gobject_class_initializer.ClassInit;
info.class_init = gobject_class_initializer.ClassInitManagedDelegate;
GType gtype = new GType (g_type_register_static (parent_gtype.Val, native_name, ref info, 0));
GLib.Marshaller.Free (native_name);

View File

@ -188,6 +188,7 @@ namespace GLib {
internal Type Type { get; private set; }
internal bool HandlersOverriden { get; private set; }
internal GType.ClassInitDelegate ClassInitManagedDelegate { get; private set; }
uint idx = 1;
bool is_first_subclass;
@ -196,6 +197,7 @@ namespace GLib {
internal ClassInitializer (Type type)
{
ClassInitManagedDelegate = this.ClassInit;
Type = type;
gtype = GType.RegisterGObjectType (this);
is_first_subclass = gtype.GetBaseType () == gtype.GetThresholdType ();
@ -231,7 +233,7 @@ namespace GLib {
}
}
internal void ClassInit (IntPtr gobject_class_handle)
private void ClassInit (IntPtr gobject_class_handle)
{
bool override_ctor = is_first_subclass;