[exerb-dev:0511] ruby1.8.6 重複ロード

Back to archive index

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/




exerb-developer メーリングリストの案内
Back to archive index