I've got a headscratcher for y'all. I have a C extension which uses
Data_Make_Struct, and then calls rb_obj_call_init. In my init
function, I try to pull out my data pointer using Data_Get_Struct, but
it pukes in rb_check_type, claiming I'm passing it the wrong type of
data.
This is almost identical to the example in the pickaxe book... what am
I missing?
Any help is greatly appreciated.
Here's the output (the problem):
colin@ska$ ruby extconf.rb
creating Makefile
colin@ska$ make
gcc -fPIC -g -O2 -fPIC -I/usr/local/lib/ruby/1.6/i686-linux -I/usr/local/include -c -o foo.o foo.c
gcc -shared -L/usr/local/lib/ruby/1.6/i686-linux -L/usr/local/lib -o foo.so foo.o -L. -lruby -lc
colin@ska$ ruby ./test.rb
./test.rb:3:in `initialize': wrong argument type XXX::Process (expected Data) (TypeError)
from ./test.rb:3:in `new'
from ./test.rb:3
colin@ska$
----------------------------------------------------------------------
Here's the ruby test:
require "foo"
foo = XXX::Process.new(42)
----------------------------------------------------------------------
Here's the C code:
#include "ruby.h"
VALUE mXXX;
VALUE cProcess;
struct _foo {
int something;
};
typedef struct _foo foo;
VALUE
process_init(VALUE self, VALUE pid)
{
foo *ptr;
Data_Get_Struct(self, foo, ptr);
return self;
}
VALUE
process_new(VALUE class, VALUE thePID)
{
foo *ptr;
VALUE tdata;
tdata = Data_Make_Struct(class,
foo,
0,
0,
ptr);
Data_Get_Struct(tdata, foo, ptr);
return tdata;
}
void Init_foo() {
mXXX = rb_define_module("XXX");
cProcess = rb_define_class_under(mXXX, "Process", rb_cObject);
rb_define_method(cProcess, "initialize", process_init, 1);
rb_define_method(cProcess, "new", process_new, 1);
}
--
Colin Steele
colin / webg2.com / www.colinsteele.org / www.rubycookbook.org
From "The Hacker's Dictionary":
softy: [IBM] n. Hardware hackers' term for a software expert who
is largely ignorant of the mysteries of hardware.