Niklas Baumstark
2008-Sep-15  16:08 UTC
[wxruby-development] Init_wxruby2 issue when called twice in the same program
Hello,
i ran into the following issue while trying to setup my C++ wxWidgets program
for embedded ruby code.
reproduce: add the following to a button event handler of a running wxWidgets
application linked to wxruby2.so:
   ====================    extern "C" void Init_wxruby2();
    ...
    ruby_init();
    ruby_init_loadpath();
    rb_eval_string(" $: << ''src'' ");
    ruby_script("embed");
    Init_wxruby2();
    
    ruby_finalize();
    ...
   ====================
now click the button twice. a segmentation fault should occur, at least it does
on my machine (Ubuntu 8.04, ruby 1.8.7 (2008-08-02 revision 0), wxWidgets 2.8.7,
wxRuby 1.9.8 SVN yesterday).
i figured out that the line
 
  rb_define_const(mWxruby2, "VERSION_STRING", 
                  SWIG_FromCharPtr("wxRuby2"));
at the end of the Init_wxruby2 causes the error, so i wrapped it into a
rb_protect and got the following error:
   class: SystemStackError
   message: stack level too deep
   backtrace: 
	from embed:0:in `write''
this error occurs every time a global constant is re-defined (even if the
interpreter has been restarted in the meanwhile). Unfortunately i can''t
test if this problem occurs in a newer version of ruby. maybe someone could test
just the following code in a standard c file?
  #include "ruby.h"
  void main()
  {
    for (int i = 0; i++; i <= 1) {
      ruby_init();
      ruby_init_loadpath();
      ruby_script("embed");
    
      rb_define_global_const("TEST", Qnil);
      ruby_finalize();
    }
  }
is there a better way to shut down the interpreter apart from ruby_finalize?
Greetings,
Niklas
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL:
<http://rubyforge.org/pipermail/wxruby-development/attachments/20080915/bee5a259/attachment.bin>