Calling class methods from C

Hello,

I'm trying to call a class method from C. I've tried all combinations of
rb_intern I could think of to make it work, but I've gotten nothing.

Example class

class CallTest
def go
(do something here)
end

end

rb_funcall(?, rb_intern("go"), 0);

What goes in the ? space? I know if I use Qnil there, it will call
global functions, but I'd prefer class methods.

Am I heading in the wrong direction?

Also, I'd prefer not to have to know the class name ahead of time if
possible, but if I have to require that I know what it is, I can try
passing it by name to my application.

I'm using SWIG to generate the binding.

···

--
Posted via http://www.ruby-forum.com/.

From the top of my head:

rb_funcall(rb_const_get("CallTest"), rb_intern("go"), 0);

And if you're calling "global" methods, it's better to call it on
Kernel, where the methods are defined anyway:

rb_funcall(rb_mKernel, rb_intern("method_name"), args);

Hope that helps.

Jason

···

On Thu, Jan 22, 2009 at 2:11 PM, Robert Rouse <scyllinice@scyllinice.com> wrote:

Hello,

I'm trying to call a class method from C. I've tried all combinations of
rb_intern I could think of to make it work, but I've gotten nothing.

Example class

class CallTest
def go
(do something here)
end

end

rb_funcall(?, rb_intern("go"), 0);

What goes in the ? space? I know if I use Qnil there, it will call
global functions, but I'd prefer class methods.

Am I heading in the wrong direction?

Also, I'd prefer not to have to know the class name ahead of time if
possible, but if I have to require that I know what it is, I can try
passing it by name to my application.

I'm using SWIG to generate the binding.
--
Posted via http://www.ruby-forum.com/\.

Bah, saw a small issue right when I hit "Send".

My call line works for a class defined as such:

class CallTest
   def self.go
      (do something here)
   end
end

If you need to call an instance method on an instance of the class
CallTest, you need to of course get a hold of that instance, or make a
new one:

VALUE obj = rb_funcall(rb_const_get("CallTest"), rb_intern("new"), 0);
rb_funcall(obj, rb_intern("go"), 0);

Jason

···

On Thu, Jan 22, 2009 at 2:19 PM, Jason Roelofs <jameskilton@gmail.com> wrote:

From the top of my head:

rb_funcall(rb_const_get("CallTest"), rb_intern("go"), 0);

And if you're calling "global" methods, it's better to call it on
Kernel, where the methods are defined anyway:

rb_funcall(rb_mKernel, rb_intern("method_name"), args);

Hope that helps.

Jason

On Thu, Jan 22, 2009 at 2:11 PM, Robert Rouse <scyllinice@scyllinice.com> wrote:

Hello,

I'm trying to call a class method from C. I've tried all combinations of
rb_intern I could think of to make it work, but I've gotten nothing.

Example class

class CallTest
def go
(do something here)
end

end

rb_funcall(?, rb_intern("go"), 0);

What goes in the ? space? I know if I use Qnil there, it will call
global functions, but I'd prefer class methods.

Am I heading in the wrong direction?

Also, I'd prefer not to have to know the class name ahead of time if
possible, but if I have to require that I know what it is, I can try
passing it by name to my application.

I'm using SWIG to generate the binding.
--
Posted via http://www.ruby-forum.com/\.

Jason Roelofs wrote:

Bah, saw a small issue right when I hit "Send".

My call line works for a class defined as such:

class CallTest
   def self.go
      (do something here)
   end
end

If you need to call an instance method on an instance of the class
CallTest, you need to of course get a hold of that instance, or make a
new one:

VALUE obj = rb_funcall(rb_const_get("CallTest"), rb_intern("new"), 0);
rb_funcall(obj, rb_intern("go"), 0);

Jason

I tried using rb_const_get but it doesn't appear to call the method.
What should I use for those parameters (VALUE and ID)?

···

--
Posted via http://www.ruby-forum.com/\.