Forum: Ruby creating Ruby objects from C

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Mark V. (Guest)
on 2007-03-11 07:11
(Received via mailing list)
The following snippet of C code shows my attempt to create a Ruby
string object by invoking the "new" method on the Ruby String class.
I know it would be easier to do this using the rb_str_new or
rb_str_new2 functions. However, I'm trying to understand how to
create arbitrary Ruby objects from C using the "new" method. Can you
spot what's wrong with this code?

   ID class_id = rb_intern("String");
   VALUE stringClass = rb_const_get(rb_cClass, class_id); // wrong
1st parameter?

   ID method_id = rb_intern("new");
   VALUE s1 = rb_funcall(stringClass, method_id, 1, "test");
   printf("s1 = %s!\n", RSTRING(s1)->ptr);
Mark V. (Guest)
on 2007-03-11 07:25
(Received via mailing list)
On Mar 10, 2007, at 11:11 PM, Mark V. wrote:

>
>   ID method_id = rb_intern("new");
>   VALUE s1 = rb_funcall(stringClass, method_id, 1, "test");
>   printf("s1 = %s!\n", RSTRING(s1)->ptr);

I think I found the answer. Using rb_class_new_instance works and is
much simpler that what I was attempting.
Ryan D. (Guest)
on 2007-03-11 22:37
(Received via mailing list)
On Mar 10, 2007, at 9:11 PM, Mark V. wrote:

> The following snippet of C code shows my attempt to create a Ruby
> string object by invoking the "new" method on the Ruby String
> class. I know it would be easier to do this using the rb_str_new or
> rb_str_new2 functions. However, I'm trying to understand how to
> create arbitrary Ruby objects from C using the "new" method. Can
> you spot what's wrong with this code?

require 'rubygems'
require 'inline'

class X
   def initialize
     puts "blah"
   end
end

class Y
   inline do |builder|
     builder.c '
       VALUE blah() {
         return rb_funcall(rb_path2class("X"), rb_intern("new"), 0);
       }'
   end
end

p Y.new.blah

# % ./blah.rb
# blah
# #<X:0x1090ec4>
This topic is locked and can not be replied to.