I just installed a clean Mavericks installation with Homebrew and RVM. Both brew doctor
and rvm requirements
return \"all good\", however, when I run <
Immediate Cause
psych.so
is not located at the proper location.
Solution/Workaround
In my case,
cp /usr/local/share/ruby/gems/2.0/gems/psych-2.0.13/lib/psych.so \
/usr/share/ruby/vendor_ruby/2.0/
Details
path2class
method is defined in psych_to_ruby.c
and registered into Psych::ClassLoader
class as a private method by rb_define_private_method()
. The following is the code. Take a look at the last line of Init_psych_to_ruby()
function.
static VALUE path2class(VALUE self, VALUE path)
{
#ifdef HAVE_RUBY_ENCODING_H
return rb_path_to_class(path);
#else
return rb_path2class(StringValuePtr(path));
#endif
}
void Init_psych_to_ruby(void)
{
VALUE psych = rb_define_module("Psych");
VALUE class_loader = rb_define_class_under(psych, "ClassLoader", rb_cObject);
VALUE visitors = rb_define_module_under(psych, "Visitors");
VALUE visitor = rb_define_class_under(visitors, "Visitor", rb_cObject);
cPsychVisitorsToRuby = rb_define_class_under(visitors, "ToRuby", visitor);
rb_define_private_method(cPsychVisitorsToRuby, "build_exception", build_exception, 2);
rb_define_private_method(class_loader, "path2class", path2class, 1);
}
Init_psych_to_ruby()
is called from Init_psych()
function, which is defined in psych.c
.
void Init_psych(void)
{
mPsych = rb_define_module("Psych");
rb_define_singleton_method(mPsych, "libyaml_version", libyaml_version, 0);
Init_psych_parser();
Init_psych_emitter();
Init_psych_to_ruby();
Init_psych_yaml_tree();
}
Ruby calls Init_{library}()
function after it loads the library's shared library (.so file). So, in the case of psych, if psych.so
is found and loaded, Init_psych()
function is called and in turn Init_psych_to_ruby()
is called, and finally path2class
is registered. However, if psych.so
does not exist, path2class
is never registered and you will see the error message "undefined method `path2class'".
Probably, there is something wrong in the packaging process of either psych or Ruby.