[Kde-bindings] KDE/kdebindings/csharp/qyoto

Arno Rehn arno at arnorehn.de
Thu May 31 14:23:53 UTC 2007


Am Donnerstag, 31. Mai 2007 schrieb Richard Dale:
> On Wednesday 30 May 2007, Arno Rehn wrote:
> > Am Montag, 28. Mai 2007 schrieb Richard Dale:
> > > SVN commit 669020 by rdale:
> > >
> > > * Further simplified the marshalling of primitive reference types. As
> > >   a pointer the the value on the C# stack is copied to the smoke stack
> > >   before the method call, the value after the method call doesn't need
> > >   to be copied back.
> > > * Added a marshaller for 'short&' and 'short*' arg types
> >
> > I think these changes have broken the custom signal handling, e.g. t14
> > now crashes with
> >
> >   at (wrapper managed-to-native) Qyoto.SmokeInvocation.CallSmokeMethod
> > (int,intptr,intptr,int) <0x00004>
> >   at (wrapper managed-to-native) Qyoto.SmokeInvocation.CallSmokeMethod
> > (int,intptr,intptr,int) <0xffffffff>
> >   at Qyoto.SmokeInvocation.Invoke (string,string,System.Type,object[])
> > <0x00885>
> >   at Qyoto.QWidget.Show () <0x00032>
> >   at T14.Main (string[]) <0x0005e>
> >   at (wrapper runtime-invoke) System.Object.runtime_invoke_void_string[]
> > (object,intptr,intptr,intptr) <0xffffffff>
> >
> > Native stacktrace:
> >
> >         mono [0x8161fa4]
> >         mono [0x812c544]
> >         [0xb7eef440]
> >         /usr/lib/libX11.so.6(XSetWMProperties+0xa0) [0xb5c043a0]
> >         /usr/lib/qt4/libQtGui.so.4
> > (_ZN19QApplicationPrivate36applyX11SpecificCommandLineArgumentsEP7QWidget
> >+0 xac) [0xb630f46c]
> >         /usr/lib/qt4/libQtGui.so.4(_ZN7QWidget10setVisibleEb+0x508)
> > [0xb6306608]
> >         /usr/lib/libsmokeqt.so.2(_ZN9x_QWidget10setVisibleEb+0x68)
> > [0xb6ea4b58]
> >         /usr/lib/libsmokeqt.so.2
> > (_Z13xcall_QWidgetsPvPN5Smoke9StackItemE+0x14a0) [0xb6e9b3b0]
> >         ./libqyoto.so(_ZN10MethodCall10callMethodEv+0xe8) [0xb6fe63d2]
> >         ./libqyoto.so(_ZN10MethodCall4nextEv+0x97) [0xb6fe65b1]
> >         ./libqyoto.so(CallSmokeMethod+0x164) [0xb6fe0c36]
> >         [0xb4fb0c76]
> >         [0xb4fafbde]
> >         [0xb4d8d9f3]
> >         [0xb738e5ef]
> >         [0xb738e063]
> >         mono(mono_runtime_exec_main+0x62) [0x80dd302]
> >         mono(mono_runtime_run_main+0x1b3) [0x80dd5f3]
> >         mono(mono_main+0x109d) [0x805932d]
> >         mono [0x8057d92]
> >         /lib/libc.so.6(__libc_start_main+0xdc) [0xb7cd783c]
> >         mono [0x8057ce1]
>
> The problem is with the int& arg type in 'QApplication ( int & argc, char
> ** argv )', the marshaller used to allocate a new version of the argc arg
> to pass to the method:
>
>         case Marshall::FromObject:
>             {
>             int * i = new int;
>             *i = m->var().s_int;
>             m->item().s_voidp = i;
>             m->next();
>             if(m->cleanup() && m->type().isConst()) {
>                 delete i;
>             } else {
> //                m->item().s_voidp = new int((int)NUM2INT(rv));
>             }
>             }
>             break;
>
> And now it doesn't:
>
> 	case Marshall::FromObject:
> 	{
> 		m->item().s_voidp = &(m->var().s_int);
> 	}
> 	break;
>
> But I think the new marshaller is correct and we shouldn't introduce a
> memory leak for all 'int&' arg types just to fix this problem. The
> QApplication constructor 'int&' should be special cased, along with any
> others like it.
Shall we special case each int& or only some specific ones? In case of the 
last one, how can we get the method name or signature from within a 
marshaller?


-- 
Arno Rehn
arno at arnorehn.de



More information about the Kde-bindings mailing list