Daniel Berger
2/13/2007 10:35:00 PM
On Feb 13, 3:26 pm, "Daniel Berger" <djber...@gmail.com> wrote:
> Hi all,
>
> 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;
>
> v_names = rb_funcall(klass_name, id_split, 1, rb_str_new2("::"));
> v_result = rb_cObject;
>
> for(i = 0; i < RARRAY(v_names)->len; i++)
> v_result = rb_const_get(RBASIC(v_result)->klass, RARRAY(v_names)-
>
> >ptr[i]);
>
> return v_result;
>
> }
>
> 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?
Naturally I saw my mistake 2 minutes later:
It should be:
for(i = 0; i < RARRAY(v_names)->len; i++){
v_result = rb_const_get(
v_result,
rb_intern(StringValuePtr(RARRAY(v_names)->ptr[i]))
);
}
Regards,
Dan