From: Shinku Fag Date: 2010-06-06T03:30:50+09:00 Subject: Re: Use a core C function not included in intern.h Tim Pease wrote: > The "eval" method in the eval.c source file is marked as static. It > cannot be called from outside the eval.c source file. This is a feature > of the compiler/linker, and to the best of my knowledge there is no easy > way around it. Uh-huh, thanks. Now I see. Non-static functions in sources is actually linkable. > On second thought, use the rb_funcall method ... Yeah, sometimes it suits for C function, though, unfortunately, necessity of rb_funcall often causes a performance penalty. Marvin G端lker wrote: > Why not directly use rb_eval_string? Because it uses the ruby_top_self (main:Object) instead of specific object in context of which we want to evaluate the string. Hence, we can't use it to evaluate an implicit method calls as 'count("\n")', for example. >> v = eval(ruby_top_self, rb_str_new2(str), Qnil, 0, 0); Well, I used rb_funcall here... What I've tried to do is function that rolls the stack back to the optional frame and evaluates the src string in the scope of that frame. static VALUE rb_eval_frame(VALUE self, VALUE src, VALUE levv) { struct FRAME *frame_orig = ruby_frame; NODE *node_orig = ruby_current_node; VALUE val; int lev = FIX2INT(levv); while (lev-- > 0) { ruby_frame = ruby_frame->prev; if (!ruby_frame) break; } val = rb_funcall(self, rb_intern("eval"), 1, src); ruby_current_node = node_orig; ruby_frame = frame_orig; return val; } But I would fail anyway, because neither FRAME nor RNode nor SCOPE structs don't contain references to previous scopes. Is there any way to get NOT current scope? -- Posted via http://www.ruby-forum.com/.