From: Olivier CARRERE Date: 2001-02-02T03:10:07+09:00 Subject: [ruby-talk:10221] Embedded Ruby (PART II)- Ruby hackers help wanted :) Hi, In yesterday's post, I tried to embed Ruby in another program with average success due to the fact that the ruby_run() and the ruby_stop() functions use exit() to terminate the ruby interpreter. What I wish to achieve is to make Ruby embeddable in another C++ application and to start/stop Ruby sripts into it at will. In this extent, I traced how ruby_run() was behaving in the hope that I would be able to replace each exit() call with a simple 'return'. Hopefully, ruby_run() has an empty stack when it comes to ruby_stop(), so it would work well (theorically). I replaced those exits with returns (and I changed the return value of ruby_run() to int so that it can return its error state :) ), and I had good results : I'm using Ruby 1.6.2 source and I'm using Debian GNU/Linux 2.3 with gcc 2.95.2. Here is the C++ source I'm using (quite simple :)): ================ // main.cpp : #include #include static unsigned int count=0; extern "C" { static void end_proc(...) { cout << "Ruby stopped " << count++ << " times" << endl; } }; main() { int i; ruby_init(); rb_load_file("foo.rb"); rb_set_end_proc(end_proc, rb_str_new2("end_proc called")); // BTW, what is the null object? // Let's run a bunch of these scripts to test potential memory leaks for(i=0;i<1000000;i++) { ruby_run(); } cout << "Great!" << endl; } ===================== I tested this using two ruby scripts : * First one : =================== class Nose def snif a=0 a=a+2 end end class Human < Nose def move b=8 b=b*2 end end humy = Human.new humy.snif humy.move i=0 i=i+1 ===================== No problem, It's still running (got it running 250000 times at this time). * Second one : ===================== print "** Ruby's running !**\n" ===================== Problem! The sript executes once fine and segfaults. I spent time tracing the ruby interpreter and finally found that rb_defout is broken (it has no longer the T_FILE TYPE) in the second call to ruby_run() wich cause infinite recursion in io_write(). Has anyone a clue? Thanks for reading so far and for any help, - Olivier CARRERE