arton
arton****@yahoo*****
2007年 3月 18日 (日) 22:05:14 JST
artonです。 ruby 1.8.6 用にExerb 4.1を作って動作を調べていて遭遇したのですが、たとえ ば、vrubyのtests/sample.rb などが開始=終了という異常な動作をします。 原因は、1.8.6でautoloadの仕様が変わって、rb_preloadedではsoに関してはロー ド済みかどうかの検出に利用できなくなったからです(と思うんだけど、完全に は理解しきれていないです)。 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/30435 のあたりです。 vrubyの例では、以下の修正で動作することは確認したのですが、ご意見を頂き たく。 方針: soの場合、rb_preloadedではなくrb_feature_p を利用してロード済みか どうかを判断する。 1. libruby/eval_exerb.c の rb_feature_p からstatic修飾子を削除 2. exerb/exerb.c に以下の修正を適用 (rb_preloaded の代わりに、rb_feature_p をsoのロード済み判定に利用) diff -u exerb.cpp ..\exerb\src\exerb\exerb.cpp --- exerb.cpp Mon Feb 26 19:32:13 2007 +++ ..\exerb\src\exerb\exerb.cpp Sun Mar 18 22:02:46 2007 @@ -51,6 +51,7 @@ extern "C" VALUE rb_load_path; extern "C" VALUE rb_argv0; extern "C" VALUE rb_progname; +extern "C" int rb_feature_p _((const char *, const char *, int)); //////////////////////////////////////////////////////////////////////////////// @@ -258,7 +259,8 @@ loaded_library_entry->handle = NULL; return Qtrue; } else if ( ::exerb_find_file_inside(fname, &id, &feature, &realname) ) { - if ( ::rb_provided(RSTRING_PTR(feature)) ) return Qfalse; + const char* ext = strrchr(RSTRING_PTR(feature), '.'); + if (::rb_feature_p(RSTRING_PTR(feature), ext, Qfalse)) return Qfalse; FILE_ENTRY_HEADER *file_entry = ::exerb_find_file_entry(id); @@ -279,9 +281,8 @@ return Qtrue; } } else if ( ::exerb_find_file_outside(fname, &feature, &realname) ) { - if ( ::rb_provided(RSTRING_PTR(feature)) ) return Qfalse; - const char *ext = ::strrchr(RSTRING_PTR(feature), '.'); + if (::rb_feature_p(RSTRING_PTR(feature), ext, Qfalse)) return Qfalse; if ( ::stricmp(ext, ".rb") == 0 ) { ::rb_provide(RSTRING_PTR(feature)); -- arton <arton****@yahoo*****> -------------------------------------- Start Yahoo! Auction now! Check out the cool campaign http://pr.mail.yahoo.co.jp/auction/