[#16113] Strange idea... exporting from a scope — "Hal E. Fulton" <hal9000@...>

Hello...

33 messages 2001/06/01

[#16364] Re: Garbage Collection? — Michael Davis <mdavis@...>

Windows 2000 and linux (RedHat 6.2). I have run these tests on both OSs.

12 messages 2001/06/09

[#16400] Symbolic Computation III — Mathieu Bouchard <matju@...>

14 messages 2001/06/11

[#16502] Playing with Ruby Syntax (was: Initial thoughts about Ruby From a Smalltalk Programmer) — jweirich@...

Michael> Hi Everyone, I have to say I'm utterly fascinated by Ruby

9 messages 2001/06/15

[#16661] Problem running irb with Ruby 1.6.4 under FreeBSD 4.0 — Bob Alexander <balexander@...>

I've installed Ruby 1.6.4 on a FreeBSD 4.0 machine, and get the

11 messages 2001/06/20

[#16686] opening db files made by apache dbmmanage — Fritz Heinrichmeyer <fritz.heinrichmeyer@...>

14 messages 2001/06/21

[#16801] rb_define_class() vs Class.new() — Kero van Gelder <kero@...4050.upc-d.chello.nl>

Hi,

18 messages 2001/06/23
[#16802] Re: rb_define_class() vs Class.new() — ts <decoux@...> 2001/06/23

>>>>> "K" == Kero van Gelder <kero@d4050.upc-d.chello.nl> writes:

[#16841] RE: national characters is strings — "Aleksei Guzev" <aleksei.guzev@...>

Next week I'll try to rebuild Ruby with Unicode strings. But it would be

15 messages 2001/06/25
[#16842] Re: national characters is strings — matz@... (Yukihiro Matsumoto) 2001/06/25

Hi,

[#16843] Re: national characters is strings — "Aleksei Guzev" <aleksei.guzev@...> 2001/06/25

That's good enough. But I'm afraid this could ( not would ) cause string

[#16868] Something strange with Ruby's inheritance mechanism — Eric Jacoboni <jaco@...>

As Ruby beginner, i try some "canonical" OO scripts. Doing so, I've

14 messages 2001/06/25
[#16873] RE: Something strange with Ruby's inheritance mechanism — "Aleksei Guzev" <aleksei.guzev@...> 2001/06/26

[#16879] Re: Something strange with Ruby's inheritance mechanism — Mathieu Bouchard <matju@...> 2001/06/26

On Tue, 26 Jun 2001, Aleksei Guzev wrote:

[#16869] Something strange with Ruby's inheritance mechanism — Eric Jacoboni <jaco@...>

As Ruby beginner, i try some "canonical" OO scripts. Doing so, I've

12 messages 2001/06/25

[#16881] — "Aleksei Guzev" <aleksei.guzev@...>

32 messages 2001/06/26
[#16916] Re: Method overloading (option) Was: Re: — "Wayne Blair" <wayne.blair@...> 2001/06/26

[#16920] Re: Method overloading (option) Was: Re: — matz@... (Yukihiro Matsumoto) 2001/06/26

Hi,

[#16888] finalizers, destructors and whatnot — "David Leal" <david@...>

Hi all,

16 messages 2001/06/26

[#17037] keeping an Exception object alive — David Alan Black <dblack@...>

Hello --

19 messages 2001/06/28
[#17055] Re: keeping an Exception object alive — matz@... (Yukihiro Matsumoto) 2001/06/29

Hi,

[#17066] RCR: Exception methods (was: Re: Re: keeping an Exception object alive) — David Alan Black <dblack@...> 2001/06/29

Hello --

[#17076] Re: RCR: Exception methods (was: Re: Re: keeping an Exception object alive) — matz@... (Yukihiro Matsumoto) 2001/06/29

Hi,

[#17079] Re: RCR: Exception methods (was: Re: Re: keeping an Exception object alive) — David Alan Black <dblack@...> 2001/06/29

Hello --

[#17138] Re: RCR: Exception methods (was: Re: Re: keeping an Exception object alive) — matz@... (Yukihiro Matsumoto) 2001/07/02

Hi,

[#17141] Re: RCR: Exception methods (was: Re: Re: keeping an Exception object alive) — David Alan Black <dblack@...> 2001/07/02

Hello --

[#17142] Re: RCR: Exception methods (was: Re: Re: keeping an Exception object alive) — ts <decoux@...> 2001/07/02

>>>>> "D" == David Alan Black <dblack@candle.superlink.net> writes:

[ruby-talk:16931] Embedded Ruby Request

From: Bryan Murphy <bryan@...>
Date: 2001-06-26 19:56:38 UTC
List: ruby-talk #16931
Hey guys!

I'm embedding Ruby in my most recent application, and using it as a glue to to 
piece all my C/C++ modules together.  

I've found the default implementation of rb_protect() usefull, but somewhat 
lacking.  I frequently call handlers written in ruby from my C/C++ code using the 
rb_funcall functions.  Of course, the problem with that is that when there is a 
problem with the ruby script, my application exits out rather ungracefully, hence 
the need for rb_protect.  My application will potentially have MANY MANY callbacks 
implemented in it by the time it is done, and it is very inconvenient to write C 
wrapper functions for each callback and pass those wrapper functions to rb_protect.

Because of this, I've modified eval.c and ruby.h to add a couple extra functions.  
These funtions work like a combination of rb_protect combined with rb_load_file, 
rb_require, rb_funcall2, or rb_funcall3 (I did not implement a version of 
rb_funcall since I did not want to create a duplicate of the functionality in that 
function).  I've found these functions very usefull, and they will save me a lot of 
uneccessary coding effort.  I feel they are worth including in the next version of 
Ruby, so I'm submitting them here with the hopes that they will be included and 
hopefully help somebody else out in the future.

Thanks,
Bryan


---SNIP-- add these to eval.c and definitions to ruby.h --SNIP--

VALUE
rb_protect_funcall2(recv, id, argc, args, state)
        VALUE recv;
        ID id;
        int argc;
        VALUE *args;
        int *state;
{
        VALUE result;
        int status;

        PUSH_TAG(PROT_NONE);
        if ((status = EXEC_TAG()) == 0) {
                result = rb_funcall2(recv, id, argc, args);
        }
        POP_TAG();
        if (state) {
                *state = status;
        }
        if (status != 0) {
                return Qnil;
        }

        return result;
}

VALUE
rb_protect_funcall3(recv, id, argc, args, state)
        VALUE recv;
        ID id;
        int argc;
        VALUE *args;
        int *state;
{
        VALUE result;
        int status;

        PUSH_TAG(PROT_NONE);
        if ((status = EXEC_TAG()) == 0) {
                result = rb_funcall3(recv, id, argc, args);
        }
        POP_TAG();
        if (state) {
                *state = status;
        }
        if (status != 0) {
                return Qnil;
        }

        return result;
}

VALUE
rb_protect_require(name, state)
       char *name;
       int *state;
{
        VALUE result;
        int status;

        PUSH_TAG(PROT_NONE);
        if ((status = EXEC_TAG()) == 0) {
                result = rb_require(name);
        }
        POP_TAG();
        if (state) {
                *state = status;
        }
        if (status != 0) {
                return Qfalse;
        }

        return result;
}

void
rb_protect_load_file(name, state)
       char *name;
       int *state;
{
        VALUE result;
        int status;

        PUSH_TAG(PROT_NONE);
        if ((status = EXEC_TAG()) == 0) {
                rb_load_file(name);
        }
        POP_TAG();
        if (state) {
                *state = status;
        }
}

In This Thread

Prev Next