From: Aleksei Guzev Date: 2001-07-18T16:49:40+09:00 Subject: [ruby-talk:18033] RE: rb_define_class_under appears to be broke on WIN32 ...... OH! And the line #define IMPORT # -----Original Message----- # From: Bryan Murphy [mailto:bryan@terralab.com] # Sent: 18 ???? 2001 ?. 11:11 # To: ruby-talk ML # Subject: [ruby-talk:18027] rb_define_class_under appears to # be broke on WIN32 # # # Hey guys, # # rb_define_class_under() appears to be seriously broken on # WIN32 (Microsoft Visual # C++ 6.0 sp5) builds. The same code I have works fine when built with # C++ g++/gcc on my # Linux box. Here is the quick breakdown: # # rb_define_class_under() executes it's first few lines of # code, and then passes # control over to rb_define_class_id() which proceeds to # segfault on the following # line: # # RBASIC(klass)->klass = rb_singleton_class_new(RBASIC(super)->klass); # # Unfortunately, I am relatively new to the Ruby code base and # haven't been able to # figure out what the cause of this problem is, but I can # reproduce it 100% of the # time and this happens with both 1.6.4 and the nightly 1.7.x snapshot. # # Below is the code I am using that exhibits the problem. I # also have a few programs # available that I used to narrow the problem down at this url: # # http://strider.terralab.com/~bryan/rb-cpp-test.zip # # SWIG makes consistent use of this function, so this could be # a problem for anybody # porting their SWIG modules to WIN32 (otherwise I'd just work # around it). # # Should I also submit this as a bug report? # # Thanks, # Bryan # # --[SNIP]-- # # # Build: # cl.exe -nologo -DWIN32 -Zi -MD -O2b2xg- -G5 -GR -GX -Fm # test4.cpp mswin32- ruby16.lib -link /STACK:0x2000000 # # test4.cpp: # #include # #include "ruby.h" # # class ITestSwig # { # public: # ITestSwig(); # virtual ~ITestSwig(); # # virtual int Multiply(int, int) = 0; # }; # # class CTestSwig: # public ITestSwig # { # public: # CTestSwig(); # virtual ~CTestSwig(); # # virtual int Multiply(int, int); # }; # # ITestSwig::ITestSwig() # { # cout << "ITestSwig::Constructor" << endl; # } # # ITestSwig::~ITestSwig() # { # cout << "ITestSwig::Destructor" << endl; # } # # CTestSwig::CTestSwig() # { # cout << "CTestSwig::Constructor" << endl; # } # # CTestSwig::~CTestSwig() # { # cout << "CTestSwig::Destructor" << endl; # } # # int CTestSwig::Multiply(int a, int b) # { # return a * b; # } # # VALUE rbModule, cTestSwig; # # VALUE wrap_Multiply(VALUE self, VALUE a, VALUE b) # { # CTestSwig *c; # # Data_Get_Struct(self, CTestSwig, c); # # int r = c->Multiply(NUM2INT(a), NUM2INT(b)); # # return INT2NUM(r); # }; # # void wrap_FREE(void *p) # { # CTestSwig *c = (CTestSwig *)p; # # delete c; # } # # VALUE wrap_NEW(VALUE clss) # { # CTestSwig *c = new CTestSwig(); # # VALUE t = Data_Wrap_Struct(clss, 0, wrap_FREE, c); # # rb_obj_call_init(t, 0, NULL); # # return t; # } # # #define RB_FUNC(func) ((VALUE (*)__(()))func) # # int main(int argc, char **argv) # { # ruby_init(); # # ruby_script("embedded"); # # rbModule = rb_define_module("TestSwig"); # # cTestSwig = rb_define_class_under(rbModule, # "CTestSwig", rb_cObject); # rb_define_singleton_method(cTestSwig, "new", # RB_FUNC(wrap_NEW), 0); # rb_define_method(cTestSwig, "Multiply", # RB_FUNC(wrap_Multiply), 2); # # rb_load_file("test4.rb"); # # ruby_run(); # # return 0; # } # # test4.rb: # obj = TestSwig::CTestSwig.new() # # print "4 * 22 = " + obj.Multiply(4,22).to_s #