[Kde-bindings] calling KParts::MainWindow#action_collection causes a crash with recent revision of korundum from 4.4 branch

Arno Rehn arno at arnorehn.de
Thu Jan 28 15:39:18 UTC 2010


On Wednesday 27 January 2010 23:58:14 Richard Dale wrote:
> On Wednesday 27 January 2010 09:44:43 pm Richard Dale wrote:
> > On Wednesday 27 January 2010 01:42:46 pm Stefano Crocco wrote:
> > > With the latest revision of smoke and korundum from the 4.4 branch,
> > > calling KParts::MainWindow#action_collection causes a crash (both with
> > > ruby 1.8 and 1.9). You can obtain it by running the following code
> > > 
> > > require 'korundum4'
> > > 
> > > data = KDE::AboutData.new "test", "", KDE::ki18n("Test"), "0.1",
> > > 
> > >     KDE.ki18n('A test application')
> > > 
> > > KDE::CmdLineArgs.init ARGV, data
> > > a = KDE::Application.new
> > > w = KParts::MainWindow.new nil, 0
> > > w.action_collection
> > > 
> > > The same code runs perfectly with an older revision of smoke and
> > > korundum (with smoke still generated using kalyptus). With the recent
> > > one,
> > 
> > > instead, I get the following backtrace:
> > I think this is a bug in the new Smoke library generator, rather than
> > 
> >  QtRuby. KParts::MainWindow has a complicated inheritance heirarchy, and
> >  it might be to do with that rather than a problem with the
> >  KActionCollection class.
> 
> The libsmokekde library generated by kalyptus had these casts for
> KParts::MainWindow, including one for KXMLGUIClient with the
> actionCollection() method in it:
> 
>       case 266: //KParts::MainWindow
>         switch(to) {
>             case 413: return
> (void*)(KXmlGuiWindow*)(KParts::MainWindow*)xptr; case 222: return
> (void*)(KMainWindow*)(KParts::MainWindow*)xptr; case 492: return
> (void*)(QMainWindow*)(KParts::MainWindow*)xptr; case 576: return
> (void*)(QWidget*)(KParts::MainWindow*)xptr; case 503: return
> (void*)(QObject*)(KParts::MainWindow*)xptr; case 504: return
> (void*)(QPaintDevice*)(KParts::MainWindow*)xptr; case 409: return
> (void*)(KXMLGUIBuilder*)
> (KParts::MainWindow*)xptr;
>             case 410: return
> (void*)(KXMLGUIClient*)(KParts::MainWindow*)xptr; case 271: return
> (void*)(KParts::PartBase*)
> (KParts::MainWindow*)xptr;
>             case 266: return (void*)(KParts::MainWindow*)
> (KParts::MainWindow*)xptr;
>           default: return xptr;
>         }
> 
> Whereas the new generator in the KDE 4.4 branch has these casts in the
> libsmokekparts library:
> 
>     case 24:   //KParts::MainWindow
>       switch(to) {
>         case 29: return
> (void*)(KParts::PartBase*)(KParts::MainWindow*)xptr; case 24: return
> (void*)(KParts::MainWindow*)xptr;
>         default: return xptr;
>       }
> 
> It looks as though it is missing the casts for external classes.
Yes. If we included every possible upcast for every external class, we would 
end up with a huge classes table, depending on the module. The correct way to 
cast external classes is to look up the corresponding smoke module and do the 
cast there.

-- 
Arno Rehn
arno at arnorehn.de



More information about the Kde-bindings mailing list