[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Ruby extension and static function in C++

yue_nicholas

8/15/2006 1:16:00 AM

HI,

I am writing an extension for Ruby in C++ and as I have more and more
functions, I need to separate them into individual C++ source for
easier maintenance in the long run.

From Programming Ruby, the section on Extending Ruby defines function
as static, if I continue to use the static keyword and the functions
are implemented in separate C++ source file, it would not be visible in
the main ruby method registration file.

How significant is the static keyword when defining functions for use
as Ruby extension?

I had a quick browse of the ruby-netcdf package and noticed that they
do not prefix their function with the static keyword.

Anyone has advice?

Cheers

2 Answers

Francis Cianfrocca

8/15/2006 1:58:00 AM

0

On 8/14/06, yue_nicholas@hotmail.com <yue_nicholas@hotmail.com> wrote:
> HI,
>
> I am writing an extension for Ruby in C++ and as I have more and more
> functions, I need to separate them into individual C++ source for
> easier maintenance in the long run.
>
> From Programming Ruby, the section on Extending Ruby defines function
> as static, if I continue to use the static keyword and the functions
> are implemented in separate C++ source file, it would not be visible in
> the main ruby method registration file.
>
> How significant is the static keyword when defining functions for use
> as Ruby extension?
>
> I had a quick browse of the ruby-netcdf package and noticed that they
> do not prefix their function with the static keyword.
>
> Anyone has advice?
>
> Cheers
>
>
>

As a general rule, I dislike exposing C++ as a library interface. I
prefer to write a light wrapper in C on top of the C++ functionality-
much easier to link with other code that way because you have much
more control over the names that the linker sees. Then, put the Ruby
wrapper on top of the C wrapper, and all of the Ruby extension
functions can be static, and it will all fit reasonably into one
source file (because the extension functions are only making calls to
another interface).

For an example, look at the extension code in EventMachine (under
branch version_0). The Ruby wrapper is in rubymain.cpp. The C wrapper
is in cmain.cpp. Everything else is C++.

yue_nicholas

8/15/2006 6:37:00 AM

0

Francis Cianfrocca wrote:
> For an example, look at the extension code in EventMachine (under
> branch version_0). The Ruby wrapper is in rubymain.cpp. The C wrapper
> is in cmain.cpp. Everything else is C++.

Thanks.

Looking at the code

static VALUE t_add_oneshot_timer (VALUE self, VALUE interval)
{
const char *f = evma_install_oneshot_timer (FIX2INT (interval));
if (!f || !*f)
rb_raise (rb_eRuntimeError, "no timer");
return rb_str_new2 (f);
}

I have a further question, the parameter I get in my call is an array
e.g.

["pos",[ 0, 0, 0],"dir",[1, 0, 1],"custom",[ 0, 1, 1, 2, 2, 2,
3, 1, 1]]

they are token-value pair

Should I process the array in cmain.cpp or rubymain.cpp

If in cmain.cpp I would need to include "ruby.h" for the definition of
"VALUE" right?

Cheers