Embedded Ruby (PART II)- Ruby hackers help wanted :) 
Author Message
 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 <iostream>
#include <ruby.h>

static unsigned int count=0;

extern "C"
{
        static void end_proc(...)
        {
                cout << "Ruby stopped " << count++ << " times" << endl;
        }

Quote:
};

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;

Quote:
}

=====================

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



Tue, 22 Jul 2003 01:51:42 GMT  
 Embedded Ruby (PART II)- Ruby hackers help wanted :)

O> so it would work well (theorically). I replaced those exits with returns
O> (and I changed the return value of ruby_run() to int so that it can
O> return its error state :) ), and I had good results :

 Why you don't read the script and then call rb_eval_string_protect(), or
 rb_eval_string_wrap() (with rb_protect())

 You will have only one call to ruby_init() and no call to ruby_run()

Guy Decoux



Tue, 22 Jul 2003 02:31:35 GMT  
 Embedded Ruby (PART II)- Ruby hackers help wanted :)

Quote:
>  Why you don't read the script and then call rb_eval_string_protect(), or
>  rb_eval_string_wrap() (with rb_protect())

>  You will have only one call to ruby_init() and no call to ruby_run()

> Guy Decoux

Well, I didn't know that those functions existed! I only read a little
the README.ext file wich shortly gave four functions (ruby_init(),
ruby_run()...).
Thank you very much for your help, I'll have a close look at it... And
I'll probably produce a HOWTO to help Ruby embedders :)

- Olivier CARRERE



Tue, 22 Jul 2003 16:59:21 GMT  
 Embedded Ruby (PART II)- Ruby hackers help wanted :)

O> Well, I didn't know that those functions existed! I only read a little
O> the README.ext file wich shortly gave four functions (ruby_init(),
O> ruby_run()...).

 Hey, you was modifying the source of ruby_run() and if you look at it :

pigeon% cat -n eval.c
[...]
  1154  ruby_run()
  1155  {
[...]
  1208  VALUE
  1209  rb_eval_string_protect(str, state)
[...]
  1231  VALUE
  1232  rb_eval_string_wrap(str, state)
[...]
pigeon%

 read the fine documentation which came with ruby :-)))

Guy Decoux



Tue, 22 Jul 2003 17:18:17 GMT  
 Embedded Ruby (PART II)- Ruby hackers help wanted :)

Quote:
>  read the fine documentation which came with ruby :-)))

I will!

Thx,

- Olivier



Tue, 22 Jul 2003 19:30:58 GMT  
 
 [ 5 post ] 

 Relevant Pages 

1. ruby-talk separation, part II

2. A Ruby-C Interface Model: Part II

3. Embedded Ruby (Part III)

4. pthread trouble with ruby-opengl on FreeBSD (was: Re: [announcement] Ruby 3D Ruby)

5. Ruby books (Ruby NG FAQ, Ruby FAQ, home page)

6. Ruby tutorial for Perl hackers?

7. Ruby Weekly News - Help Wanted

8. Problems with Ruby/GtkGLArea, help wanted

9. Interactive Ruby II

10. Mozilla relicensing: Help wanted - Python hacker

11. Help Wanted - Unix C/Tcl/Tk Hacker - US-CA-LA/OC/SD

12. RFD: comp.lang.ruby (getting Ruby out of comp.lang.misc)

 

 
Powered by phpBB® Forum Software