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 <iostream>
#include <ruby.h>
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