From: Daniel Berger Date: 2007-02-14T07:35:07+09:00 Subject: Re: Converting class_for to a C extension On Feb 13, 3:26 pm, "Daniel Berger" 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