cedlemo
cedlemo

Reputation: 3334

Ruby Data_Get_Struct error wrong argument expect Data

I am writting a little ruby module with some very simple classes in C:

typedef struct window_t {
   GtkWidget * widget;
}
static void c_window_struct_free(window_t *c)
{
  if(c)
  {
    ruby_xfree(c);
  }
}
static VALUE c_window_struct_alloc( VALUE klass)
{
  return Data_Wrap_Struct(klass, NULL, c_window_struct_free,ruby_xmalloc(sizeof(window_t)));
}

VALUE c_window = rb_define_class_under(m_rtortosa, "Window", c_widget)
rb_define_method(c_window, "set_title",RUBY_METHOD_FUNC(window_set_title), 1);
//For each class I don't rewritte any "new" or "initialize" function. I let the default 

When my module is initialized, a gtk window is created, and I have a ruby method for this module that call:

static VALUE rtortosa_window(VALUE self)
{
  VALUE win;
  VALUE m_rtortosa = rb_const_get( rb_cObject, rb_intern( "Rtortosa" ) );
  VALUE cWindow = rb_const_get_at( m_rtortosa, rb_intern("Window") );
  win = rb_class_new_instance(0, NULL, backbone.rb_objects.cWindow);
  window_t *w;
  Data_Get_Struct(win,window_t, w);
  w->widget = backbone.window.widget;
  return win;
}

The problesm occurs when I call the rtortosta_window from ruby, it throws an error like this :

wrong argument type Rtortosa::Window (expected Data) (TypeError)

After investigations this message is comming from the Data_Get_Struct function.

I don't see what I am doing wrong, I have a notebook class that is written in the same way but it works as expected.

Upvotes: 4

Views: 348

Answers (1)

cedlemo
cedlemo

Reputation: 3334

I have forgotten to bind the alloc function to the class:

rb_define_alloc_func(c_window, c_window_struct_alloc);

Upvotes: 3

Related Questions