[Kde-bindings] Crash in qtruby4 (svn) using custom C++ classes

Stefano Crocco stefano.crocco at alice.it
Thu Jun 19 09:47:54 UTC 2008


I'm attempting to use the latest svn revision of korundum4 to build an application which uses a custom C++ class, following the procedure explained in a thread on the korundum forum 
(http://rubyforge.org/forum/forum.php?thread_id=10371&forum_id=723). The code I wrote worked correctly with an older revision (from about a month ago), but now it crashes when I try to write a C++ 
slot which returns a string.

Here's a sample code which causes the crash:

#include <ruby.h>
#include <QApplication>
#include <QList>
#include <QPoint>
#include <QWidget>

class MyWidget: public QWidget{
  Q_OBJECT
  
  public:
  MyWidget(QWidget*parent = 0):QWidget(parent){
  }
  ~MyWidget(){}

  public slots:
  QString string_test(){return QString("My test");}
  int int_test(){return 124;}
  QPoint point_test(){return QPoint(12,89);}
};

#include "ext_moc.cpp"

static VALUE create_my_widget(VALUE self, VALUE name){
  QWidgetList l = QApplication::allWidgets();
  QWidget * parent = l.first();
  MyWidget * w = new MyWidget(parent);
  QString objName = STR2CSTR(name);
  w->setObjectName(objName);
  return Qnil;
}

extern "C" void Init_ext(void){
  typedef VALUE ( *HOOK ) ( ... );
  rb_define_method(rb_cObject, "create_my_widget", reinterpret_cast<HOOK>(create_my_widget), 1);
}

Once compiled that as a ruby extension file called ext.so, if I run the following ruby code:

require 'Qt4'
require 'ext'

app = Qt::Application.new []
w = Qt::Widget.new
create_my_widget "test"
my_widget = w.findChild Qt::Object, "test"
puts "int_test:#{my_widget.int_test}"
puts "point_test: #{my_widget.point_test.inspect}"
puts "doing string_test"
p my_widget.string_test

This is what I get:
int_test:124              
point_test: nil           
doing string_test         
try.rb:11: [BUG] Segmentation fault
ruby 1.8.6 (2008-03-03) [i686-linux]

And here's the backtrace obtained by running ruby in gdb:
#0  0xb7afc222 in QString::operator= () from /usr/lib/qt4/libQtCore.so.4
#1  0xb6b3af73 in MyWidget::qt_metacall () from ./ext.so
#2  0xb756356e in InvokeNativeSlot::invokeSlot (this=0xbfe447f4) at /home/stefano/Desktop/kdebindings/ruby/qtruby/src/Qt.cpp:413
#3  0xb756366d in InvokeNativeSlot::mainfunction (this=0xbfe447f4) at /home/stefano/Desktop/kdebindings/ruby/qtruby/src/Qt.cpp:424
#4  0xb759c96c in SigSlotBase::next (this=0xbfe447f4) at /home/stefano/Desktop/kdebindings/ruby/qtruby/src/marshall_types.cpp:628
#5  0xb7568d19 in method_missing (argc=1, argv=0xbfe44bc0, self=3060248180) at /home/stefano/Desktop/kdebindings/ruby/qtruby/src/Qt.cpp:856
#6  0xb7f08805 in call_cfunc () from /usr/lib/libruby18.so.1.8
#7  0xb7f12945 in rb_call0 () from /usr/lib/libruby18.so.1.8
#8  0xb7f12ad1 in rb_call () from /usr/lib/libruby18.so.1.8
#9  0xb7f133ad in rb_funcall2 () from /usr/lib/libruby18.so.1.8
#10 0xb7f18b36 in method_missing () from /usr/lib/libruby18.so.1.8
#11 0xb7f12bc3 in rb_call () from /usr/lib/libruby18.so.1.8
#12 0xb7f0d599 in rb_eval () from /usr/lib/libruby18.so.1.8
#13 0xb7f0fcc5 in rb_eval () from /usr/lib/libruby18.so.1.8
#14 0xb7f1dfe3 in ruby_exec_internal () from /usr/lib/libruby18.so.1.8
#15 0xb7f1e023 in ruby_exec () from /usr/lib/libruby18.so.1.8
#16 0xb7f1e058 in ruby_run () from /usr/lib/libruby18.so.1.8
#17 0x08048715 in main ()

Stefano



More information about the Kde-bindings mailing list