# Calling instance\_eval on a block in C

**URL:** <https://www.ruby-forum.com/t/calling-instance-eval-on-a-block-in-c/57839>\
**Category:** Ruby\
**Created:** [April 14, 2006, 7:35pm UTC](https://www.ruby-forum.com/t/calling-instance-eval-on-a-block-in-c/57839 "2006-04-14T19:35:54Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![johnlester](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e480ec/32.png) [@johnlester](https://www.ruby-forum.com/u/johnlester)\
**Post date:** [April 14, 2006, 7:35pm UTC](https://www.ruby-forum.com/t/calling-instance-eval-on-a-block-in-c/57839/1 "2006-04-14T19:35:54Z")

</div>

If I have this ruby method:

def eval\_it(obj, &b)  
obj.instance\_eval(&b)  
end

How do write the C code to make this happen? If I do this:

rb\_funcall(obj, rb\_intern(“instance\_eval”), 1, zz);

Ruby is apparently expecting a String for the type of zz.

Any ideas?

Thanks!  
-John

> **[John Lam's Blog](https://www.iunknown.com/)**
>
> Since 1997

---

<div class="post-metadata">

**Author:** ![johnlester](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e480ec/32.png) [@johnlester](https://www.ruby-forum.com/u/johnlester)\
**Post date:** [April 14, 2006, 8:03pm UTC](https://www.ruby-forum.com/t/calling-instance-eval-on-a-block-in-c/57839/2 "2006-04-14T20:03:32Z")

</div>

On Apr 14, 2006, at 10:33 AM, John L. wrote:

> Ruby is apparently expecting a String for the type of zz.  
> Hey John,

I’m not positive, but I don’t think it is possible, because of the  
block. Blocks come in through manipulated ruby\_frames, even if they  
look like they are passed in via shells. Clues being:

static VALUE  
rb\_f\_block\_given\_p()  
{  
if (ruby\_frame-\>prev && ruby\_frame-\>prev-\>iter == ITER\_CUR &&  
ruby\_block)  
return Qtrue;  
return Qfalse;  
}

and the first hunk of specific\_eval reading:

```
 if (rb_block_given_p()) {
     if (argc > 0) {
         rb_raise(rb_eArgError, "wrong number of arguments (%d

```

for 0)", argc  
);  
}  
return yield\_under(klass, self);  
}

---

<div class="post-metadata">

**Author:** ![johnlester](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e480ec/32.png) [@johnlester](https://www.ruby-forum.com/u/johnlester)\
**Post date:** [April 14, 2006, 8:31pm UTC](https://www.ruby-forum.com/t/calling-instance-eval-on-a-block-in-c/57839/3 "2006-04-14T20:31:09Z")

</div>

I think you’re right. I’ve tried all sorts of combinations before  
posting  
this plea for help 🙂

Now I have to turn this method that I’ve been writing all morning  
inside-out  
since I can’t make this happen … yuck.

Thanks for looking around!  
-John

> **[John Lam's Blog](https://www.iunknown.com/)**
>
> Since 1997

Hey John,

---

<div class="post-metadata">

**Author:** ![johnlester](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e480ec/32.png) [@johnlester](https://www.ruby-forum.com/u/johnlester)\
**Post date:** [April 15, 2006, 11:45am UTC](https://www.ruby-forum.com/t/calling-instance-eval-on-a-block-in-c/57839/4 "2006-04-15T11:45:03Z")

</div>

> > > > > “J” == John L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

J\> def eval\_it(obj, &b)  
J\> obj.instance\_eval(&b)  
J\> end

moulon% cat a.c  
#include \<ruby.h\>

static VALUE  
a\_eval\_it(VALUE obj, VALUE a)  
{  
return rb\_obj\_instance\_eval(0, 0, a);  
}

void Init\_a()  
{  
VALUE a\_cA = rb\_define\_class(“A”, rb\_cObject);  
rb\_define\_method(a\_cA, “eval\_it”, a\_eval\_it, 1);  
}  
moulon%

moulon% ruby -ra -e ‘b = Object.new; A.new.eval\_it(b) {p self; @b = 12};  
p b’  
#Object:0xb7d5ec8c  
#\<Object:0xb7d5ec8c @b=12\>  
moulon%

Guy Decoux

---

<div class="post-metadata">

**Author:** ![johnlester](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e480ec/32.png) [@johnlester](https://www.ruby-forum.com/u/johnlester)\
**Post date:** [April 17, 2006, 11:26pm UTC](https://www.ruby-forum.com/t/calling-instance-eval-on-a-block-in-c/57839/5 "2006-04-17T23:26:47Z")

</div>

THANK YOU!!!

You have saved me from probably a good week’s worth of hell (aka C++). I  
spent a lot of time building up my abstractions in RubyCLR so that all  
of  
the nasty marshaling / interop goo generation stuff was handled in Ruby.  
Without your solution, I would have had to re-implement about half of  
those  
abstractions in raw C++, which probably would have taken me at least  
another  
week to implement.

Let me know if we’re ever in the same city - I definitely owe you dinner  
for  
this one 🙂

Cheers,  
-John

> **[John Lam's Blog](https://www.iunknown.com/)**
>
> Since 1997

---

<div class="post-metadata">

**Author:** ![johnlester](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e480ec/32.png) [@johnlester](https://www.ruby-forum.com/u/johnlester)\
**Post date:** [April 14, 2006, 10:40pm UTC](https://www.ruby-forum.com/t/calling-instance-eval-on-a-block-in-c/57839/6 "2006-04-14T22:40:44Z")

</div>

On Sat, Apr 15, 2006 at 03:02:55AM +0900, Ryan D. wrote:

> > Ruby is apparently expecting a String for the type of zz.
> 
> I’m not positive, but I don’t think it is possible, because of the  
> block.

See [ruby-talk:180647].
