From: Tim Pease Date: 2010-06-05T05:48:55+09:00 Subject: Re: Use a core C function not included in intern.h On Jun 4, 2010, at 9:19 AM, Tim Pease wrote: > > On Jun 3, 2010, at 6:48 PM, Shinku Fag wrote: > >> Hello. >> >> I trying to make a function with C extension for 1.8.7 that should use >> functions defined in Ruby such as >>> VALUE eval(VALUE,VALUE,VALUE,const char*,int) >> But functions that aren't reflected (sorry, I don't know how to call it >> better r_r) in intern.h, seems to be unusable. If I just add string >>> VALUE eval _((VALUE,VALUE,VALUE,const char*,int)); >> to extension source or intern.h then I get >>> symbol lookup error: /usr/lib/ruby/gems/1.8/gems/rmtools-1.0.0/lib/rmtools.so: undefined symbol: eval >> >> So, is there a way to use such functions in the extension without >> copypasting half the eval.c (and maybe even something else) into it? >> > > 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. > > If someone with more recent C experience could chime in, it would be appreciated. My C is a little rusty, and would love for someone to double check my facts. > On second thought, use the rb_funcall method ... rb_funcall(rb_mKernel, rb_intern("eval"), ... ) That should do what you are trying to accomplish. Blessings, TwP