[前][次][番号順一覧][スレッド一覧]

ruby-changes:8679

From: nobu <ko1@a...>
Date: Tue, 11 Nov 2008 23:54:39 +0900 (JST)
Subject: [ruby-changes:8679] Ruby:r20214 (ruby_1_8): * eval.c (rb_feature_p): returns found feature name if loading.

nobu	2008-11-11 23:54:14 +0900 (Tue, 11 Nov 2008)

  New Revision: 20214

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=20214

  Log:
    * eval.c (rb_feature_p): returns found feature name if loading.
      [ruby-core:19798]
    * eval.c (search_required): ditto.

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/eval.c

Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 20213)
+++ ruby_1_8/ChangeLog	(revision 20214)
@@ -1,3 +1,10 @@
+Tue Nov 11 23:54:12 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* eval.c (rb_feature_p): returns found feature name if loading.
+	  [ruby-core:19798]
+
+	* eval.c (search_required): ditto.
+
 Tue Nov 11 17:51:30 2008  NAKAMURA Usaku  <usa@r...>
 
 	* win32/win32.c (rb_w32_accept): secure fd before accept because if
Index: ruby_1_8/eval.c
===================================================================
--- ruby_1_8/eval.c	(revision 20213)
+++ ruby_1_8/eval.c	(revision 20214)
@@ -7123,16 +7123,16 @@
     0
 };
 
-static int rb_feature_p _((const char *, const char *, int));
+static int rb_feature_p _((const char **, const char *, int));
 static int search_required _((VALUE, VALUE *, VALUE *));
 
 static int
-rb_feature_p(feature, ext, rb)
-    const char *feature, *ext;
+rb_feature_p(ftptr, ext, rb)
+    const char **ftptr, *ext;
     int rb;
 {
     VALUE v;
-    const char *f, *e;
+    const char *f, *e, *feature = *ftptr;
     long i, len, elen;
 
     if (ext) {
@@ -7150,18 +7150,21 @@
 	    continue;
 	if (!*(e = f + len)) {
 	    if (ext) continue;
+	    *ftptr = 0;
 	    return 'u';
 	}
 	if (*e != '.') continue;
 	if ((!rb || !ext) && (IS_SOEXT(e) || IS_DLEXT(e))) {
+	    *ftptr = 0;
 	    return 's';
 	}
 	if ((rb || !ext) && (strcmp(e, ".rb") == 0)) {
+	    *ftptr = 0;
 	    return 'r';
 	}
     }
     if (loading_tbl) {
-	if (st_lookup(loading_tbl, (st_data_t)feature, 0)) {
+	if (st_lookup(loading_tbl, (st_data_t)feature, (st_data_t *)ftptr)) {
 	    if (!ext) return 'u';
 	    return strcmp(ext, ".rb") ? 's' : 'r';
 	}
@@ -7173,7 +7176,7 @@
 	    MEMCPY(buf, feature, char, len);
 	    for (i = 0; (e = loadable_ext[i]) != 0; i++) {
 		strncpy(buf + len, e, DLEXT_MAXLEN + 1);
-		if (st_lookup(loading_tbl, (st_data_t)buf, 0)) {
+		if (st_lookup(loading_tbl, (st_data_t)buf, (st_data_t *)ftptr)) {
 		    return i ? 's' : 'r';
 		}
 	    }
@@ -7181,6 +7184,7 @@
     }
     return 0;
 }
+#define rb_feature_p(feature, ext, rb) rb_feature_p(&feature, ext, rb)
 
 int
 rb_provided(feature)
@@ -7289,7 +7293,7 @@
     VALUE fname, *featurep, *path;
 {
     VALUE tmp;
-    char *ext, *ftptr;
+    const char *ext, *ftptr;
     int type;
 
     *featurep = fname;
@@ -7297,12 +7301,18 @@
     ext = strrchr(ftptr = RSTRING_PTR(fname), '.');
     if (ext && !strchr(ext, '/')) {
 	if (strcmp(".rb", ext) == 0) {
-	    if (rb_feature_p(ftptr, ext, Qtrue)) return 'r';
+	    if (rb_feature_p(ftptr, ext, Qtrue)) {
+		if (ftptr) *path = rb_str_new2(ftptr);
+		return 'r';
+	    }
 	    if ((*path = rb_find_file(fname)) != 0) return 'r';
 	    return 0;
 	}
 	else if (IS_SOEXT(ext)) {
-	    if (rb_feature_p(ftptr, ext, Qfalse)) return 's';
+	    if (rb_feature_p(ftptr, ext, Qfalse)) {
+		if (ftptr) *path = rb_str_new2(ftptr);
+		return 's';
+	    }
 	    tmp = rb_str_new(RSTRING_PTR(fname), ext-RSTRING_PTR(fname));
 	    *featurep = tmp;
 #ifdef DLEXT2
@@ -7321,7 +7331,10 @@
 #endif
 	}
 	else if (IS_DLEXT(ext)) {
-	    if (rb_feature_p(ftptr, ext, Qfalse)) return 's';
+	    if (rb_feature_p(ftptr, ext, Qfalse)) {
+		if (ftptr) *path = rb_str_new2(ftptr);
+		return 's';
+	    }
 	    if ((*path = rb_find_file(fname)) != 0) return 's';
 	}
     }
@@ -7330,13 +7343,16 @@
     *featurep = tmp;
     switch (type) {
       case 0:
-	ftptr = RSTRING_PTR(tmp);
-	return rb_feature_p(ftptr, 0, Qfalse);
+	type = rb_feature_p(ftptr, 0, Qfalse);
+	if (type && ftptr) *path = rb_str_new2(ftptr);
+	return type;
 
       default:
 	ext = strrchr(ftptr = RSTRING(tmp)->ptr, '.');
-	if (rb_feature_p(ftptr, ext, !--type)) break;
-	*path = rb_find_file(tmp);
+	if (!rb_feature_p(ftptr, ext, !--type))
+	    *path = rb_find_file(tmp);
+	else if (ftptr)
+	    *path = rb_str_new2(ftptr);
     }
     return type ? 's' : 'r';
 }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]