From: Vincent Fourmond Date: 2007-02-14T07:38:34+09:00 Subject: Re: Converting class_for to a C extension 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? > > 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. Cheers, Vince -- Vincent Fourmond, PhD student (not for long anymore) http://vincent.fourmond.neuf.fr/