[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

How do i stop a block being passed on?

jrmair

8/12/2008 6:17:00 AM

Hello friends,

Im writing a ruby C API program, and i have this difficulty:

VALUE
m_func1(VALUE self) {
m_func2();
}



the problem i have is that if a block is passed to m_func1 it seems to
also
be passed onto m_func2, how do i stop it being passed on? is there a way
to
'delete' a block after i've finished with it? (i.e yielded to it)

thx

john
--
Posted via http://www.ruby-....

1 Answer

Tim Pease

8/12/2008 9:22:00 PM

0

On Aug 12, 2008, at 12:16 AM, John Mair wrote:

> Hello friends,
>
> Im writing a ruby C API program, and i have this difficulty:
>
> VALUE
> m_func1(VALUE self) {
> m_func2();
> }
>
>
>
> the problem i have is that if a block is passed to m_func1 it seems to
> also
> be passed onto m_func2, how do i stop it being passed on? is there a
> way
> to
> 'delete' a block after i've finished with it? (i.e yielded to it)
>

You need to create is a new ruby_frame for m_func2 to operate in. The
frame contains all the information about what blocks are available,
the scope, local variables, self, etc.

The only way to get a new ruby_frame is to use rb_funcall instead of
directly calling m_func2.


VALUE
m_func1(VALUE self) {
rb_funcall(self, rb_intern("func2"), 0);
}


This code is going to be quite slower than just calling m_func2
directly. If performance is what you are after, I would recommend
breaking out the core functionality of m_func2 into an internal
function (one that is not exposed to the ruby interpreter). m_func1
would call this internal function, and you would create a new m_func2
that handles a block and calls this same internal fucntion.

Blessings,
TwP