[Gtk-sharp-list] System.InvalidCastException from generated code

Martin Willemoes Hansen mwh@sysrq.dk
Mon, 26 Jan 2004 22:47:02 +0100


On Mon, 2004-01-26 at 17:53, Mike Kestner wrote:
> On Mon, 2004-01-26 at 07:05, Martin Willemoes Hansen wrote:
> 
> > > Looking into the code, i found that the generator made the code:
> > > 
> > > 
> > > > 		public Gtk.SourceMarker CreateMarker(string name, string type, Gtk.TextIter where) {
> > > > 			IntPtr raw_ret = gtk_source_buffer_create_marker(Handle, name, type, ref where);
> > > > 			Gtk.SourceMarker ret = (Gtk.SourceMarker) GLib.Object.GetObject(raw_ret);
> > > > 			return ret;
> > > > 		}
> > 
> > try changing the code to be like this:
> > Gtk.SourceMarker ret = new Gtk.SourceMarker (raw_ret);
> 
> Not a good idea.  If you do this, you will end up with two or more
> wrappers pointing to the same native object, but only holding one native
> ref to the object.  When one of those wrappers gets GC'd, all your other
> wrappers are hosed.  It's going to bite you eventually, and it will be
> one of those almost impossible to debug problems, especially for
> somebody who doesn't know that you short-circuited the GetObject
> mechanism with custom code.

Heh okay.

> > > I think the problem comes from the folowing C code:
> > > 
> > > 
> > > >  33             GType 
> > > >  34             gtk_source_marker_get_type (void)
> > > >  35             {
> > > >  36             	static GType our_type = 0;
> > > >  37             
> > > >  38             	/* this function's solely purpose is to allow us to later
> > > >  39             	 * derive GtkSourceMarker from other base object and not break
> > > >  40             	 * ABI compatibility (since this way the type is resolved at
> > > >  41             	 * runtime) */
> > > >  42             	if (!our_type) {
> > > >  43				our_type = GTK_TYPE_TEXT_MARK;
> > > 
> > > It seems that Gtk# is confused as to the type of the object. What would
> > > be the best way to fix this?
> 
> Ben and I talked about this on IRC last night, and I advised him to file
> a bug against SourceView for subclassing objects without registering a
> new GType for the object.  There is no way a language binding can
> properly introspect a GObject type that's coded in this manner.

Yes, sounds like an idea, ill try to file som bug reports about these
issues, got some in DiaCanvas# too.
-- 
Martin Willemoes Hansen

--------------------------------------------------------
E-Mail	mwh@sysrq.dk	Website	mwh.sysrq.dk
IRC     MWH, freenode.net
--------------------------------------------------------