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

ruby-changes:25420

From: shirosaki <ko1@a...>
Date: Tue, 6 Nov 2012 00:24:14 +0900 (JST)
Subject: [ruby-changes:25420] shirosaki:r37477 (trunk): Clarify and explain loaded_feature_path and rb_feature_p

shirosaki	2012-11-06 00:24:03 +0900 (Tue, 06 Nov 2012)

  New Revision: 37477

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

  Log:
    Clarify and explain loaded_feature_path and rb_feature_p
    
    * load.c (loaded_feature_path): clarify and briefly comment
      function.  These clarifications have no effect on the behavior
      of the function.
    
    * load.c (rb_feature_p): explain the search loop.  Especially
      useful because the logic is complicated as described in the
      second paragraph.
      Patch by Greg Price.
      [ruby-core:47970] [Bug #7158]

  Modified files:
    trunk/ChangeLog
    trunk/load.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 37476)
+++ ChangeLog	(revision 37477)
@@ -1,3 +1,15 @@
+Mon Nov  5 23:21:14 2012  Greg Price  <price@m...>
+
+	* load.c (loaded_feature_path): clarify and briefly comment
+	  function.  These clarifications have no effect on the behavior
+	  of the function.
+
+	* load.c (rb_feature_p): explain the search loop.  Especially
+	  useful because the logic is complicated as described in the
+	  second paragraph.
+	  Patch by Greg Price.
+	  [ruby-core:47970] [Bug #7158]
+
 Mon Nov  5 22:45:03 2012  Hiroshi Shirosaki  <h.shirosaki@g...>
 
 	* ext/dl/win32/lib/Win32API.rb (Win32API#call): use 64bit pointer for x64
Index: load.c
===================================================================
--- load.c	(revision 37476)
+++ load.c	(revision 37477)
@@ -69,6 +69,17 @@
     return GET_VM()->loading_table;
 }
 
+/* This searches `load_path` for a value such that
+     name == "#{load_path[i]}/#{feature}"
+   if `feature` is a suffix of `name`, or otherwise
+     name == "#{load_path[i]}/#{feature}#{ext}"
+   for an acceptable string `ext`.  It returns
+   `load_path[i].to_str` if found, else 0.
+
+   If type is 's', then `ext` is acceptable only if IS_DLEXT(ext);
+   if 'r', then only if IS_RBEXT(ext); otherwise `ext` may be absent
+   or have any value matching `%r{^\.[^./]*$}`.
+*/
 static VALUE
 loaded_feature_path(const char *name, long vlen, const char *feature, long len,
 		    int type, VALUE load_path)
@@ -77,7 +88,7 @@
     long plen;
     const char *e;
 
-    if (vlen < len) return 0;
+    if (vlen < len+1) return 0
     if (!strncmp(name+(vlen-len), feature, len)) {
 	plen = vlen - len - 1;
     }
@@ -89,23 +100,22 @@
 	    return 0;
 	plen = e - name - len - 1;
     }
+    if (type == 's' && !IS_DLEXT(&name[plen+len+1])
+     || type == 'r' && !IS_RBEXT(&name[plen+len+1])
+     || name[plen] != '/') {
+       return 0;
+    }
+    /* Now name == "#{prefix}/#{feature}#{ext}" where ext is acceptable
+       (possibly empty) and prefix is some string of length plen. */
+
     for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	VALUE p = RARRAY_PTR(load_path)[i];
 	const char *s = StringValuePtr(p);
 	long n = RSTRING_LEN(p);
 
 	if (n != plen) continue;
-	if (n && (strncmp(name, s, n) || name[n] != '/')) continue;
-	switch (type) {
-	  case 's':
-	    if (IS_DLEXT(&name[n+len+1])) return p;
-	    break;
-	  case 'r':
-	    if (IS_RBEXT(&name[n+len+1])) return p;
-	    break;
-	  default:
-	    return p;
-	}
+	if (n && strncmp(name, s, n)) continue;
+	return p;
     }
     return 0;
 }
@@ -153,6 +163,25 @@
     }
     features = get_loaded_features();
     for (i = 0; i < RARRAY_LEN(features); ++i) {
+	/* This loop searches `features` for an entry such that either
+	     "#{features[i]}" == "#{load_path[j]}/#{feature}#{e}"
+	   for some j, or
+	     "#{features[i]}" == "#{feature}#{e}"
+	   Here `e` is an "allowed" extension -- either empty or one
+	   of the extensions accepted by IS_RBEXT, IS_SOEXT, or
+	   IS_DLEXT.  Further, if `ext && rb` then `IS_RBEXT(e)`,
+	   and if `ext && !rb` then `IS_SOEXT(e) || IS_DLEXT(e)`.
+
+	   If `expanded`, then only the latter form (without
+	   load_path[j]) is accepted.  Otherwise either form is
+	   accepted, *unless* `ext` is false and an otherwise-matching
+	   entry of the first form is preceded by an entry of the form
+	     "#{features[i2]}" == "#{load_path[j2]}/#{feature}#{e2}"
+	   where `e2` matches /^\.[^./]*$/ but is not an allowed extension.
+	   After a "distractor" entry of this form, only entries of the
+	   form "#{feature}#{e}" are accepted.
+	*/
+
 	v = RARRAY_PTR(features)[i];
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;

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

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