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

Back to archive index

arton arton****@yahoo*****
2007年 3月 18日 (日) 22:33:37 JST


artonです。

いじっているうちに壊したみたいで、今度は、rbを重複ロードしてました。
以下と差し替えます。

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:31:17 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));
 
 ////////////////////////////////////////////////////////////////////////////////
 
@@ -274,6 +275,8 @@
 			return Qtrue;
 #endif
 		case FILE_ENTRY_HEADER_TYPE_EXTENSION_LIBRARY:
+			const char* ext = strrchr(RSTRING_PTR(feature), '.');
+			if (::rb_feature_p(RSTRING_PTR(feature), ext, Qfalse)) return Qfalse;
 			::rb_provide(RSTRING_PTR(feature));
 			::exerb_load_extension_library(file_entry);
 			return Qtrue;
@@ -281,13 +284,14 @@
 	} else if ( ::exerb_find_file_outside(fname, &feature, &realname) ) {
 		if ( ::rb_provided(RSTRING_PTR(feature)) ) return Qfalse;
 
-		const char *ext = ::strrchr(RSTRING_PTR(feature), '.');
+		const char* ext = strrchr(RSTRING_PTR(feature), '.');
 
 		if ( ::stricmp(ext, ".rb") == 0 ) {
 			::rb_provide(RSTRING_PTR(feature));
 			::exerb_load_ruby_script(RSTRING_PTR(realname));
 			return Qtrue;
 		} else if ( ::stricmp(ext, ".so") == 0 ) {
+			if (::rb_feature_p(RSTRING_PTR(feature), ext, Qfalse)) return Qfalse;
 			::rb_provide(RSTRING_PTR(feature));
 			::exerb_load_extension_library(RSTRING_PTR(realname));
 			return Qtrue;

-- 
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