I found this snippet posted to handle doing const_get for nested
classes/modules:
def class_for(class_name)
names = class_name.split("::")
result = Object
names.each { |n|
result = result.const_get(n)
}
result
rescue NameError
nil
end
I’m trying to convert this to a C extension, but I’m having some
trouble:
static VALUE class_for(VALUE klass_name){
VALUE v_names, v_result;
ID id_split = rb_intern(“split”);
int i;
With this code I get “uninitialized constant Class::(null)
(NameError)”.
It appears to be a problem with the first argument to rb_const_get().
I’m not sure what that value should be, but I also tried
TYPE(v_result) - which caused a segfault - and just v_result - which
resulted in a similar “uninitialized constant (null) (NameError)”
error.
What am I doing wrong here?
Thanks,
Dan
PS - Yes, I realize I’m not doing error handling in the C extension -
I’m not worried about that for now.
}
ID id_split = rb_intern(“split”);
}
What am I doing wrong here?
Thanks,
Dan
PS - Yes, I realize I’m not doing error handling in the C extension -
I’m not worried about that for now.
You should the (null) stuff is a sign that you’re using a NULL
pointer somewhere, though I can’t get where. The segfault is another
indication. So one thing here is returning false or NULL…
The problem, in my opinion, is here:
RBASIC(v_result)->klass
Why do you need to use ->klass ?? All objects you’re getting are
classes or modules already. You end up looking for constants in the
Class class, and that is not where they are defined.
One of these days I’m going to write a patch to expose this to
Ruby
Expose what to Ruby?
I think he just means that there’s no direct equivalent in plain Ruby
(right?).
Yup. I’ve reimplemented rb_path2class() numerous times in ruby, and
there’s a perfectly good C method lying around that needs only a one-
line patch to be accessible.
I think just patching const_get to handle “::” would suffice.
I think he just means that there’s no direct equivalent in plain Ruby
(right?).
Yup. I’ve reimplemented rb_path2class() numerous times in ruby, and
there’s a perfectly good C method lying around that needs only a one-
line patch to be accessible.
I think just patching const_get to handle “::” would suffice.
Possibly.
I tried messing with object.c yesterday, but I couldn’t make it work.
Any ideas for a patch? It would be nice to get one in for 1.8.6 if
possible.
I tried messing with object.c yesterday, but I couldn’t make it work.
Any ideas for a patch? It would be nice to get one in for 1.8.6 if
possible.
Oh, I was mistaken, its VALUE rb_path2class(const char *) not VALUE
rb_path2class(VALUE), so a wrapper function needs to be written (so
more than one line). I don’t know if Object::path2class is a good
name, since the C implementation can only have Object as its root.