diff options
author | tarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-05-31 21:56:01 +0000 |
---|---|---|
committer | tarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-05-31 21:56:01 +0000 |
commit | 9ce69e7cef1272c86a93eeb9a1888fe6d2a94704 (patch) | |
tree | 6f4d9205835546c4c3d3c49b13d909b1b0b772b5 /load.c | |
parent | 867fa454d81cf5fcbd10c96863e6ef9b8075985a (diff) |
* load.c (loaded_feature_path): cut nonsence loop execution to fix
performance bug.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31875 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'load.c')
-rw-r--r-- | load.c | 19 |
1 files changed, 15 insertions, 4 deletions
@@ -73,16 +73,27 @@ loaded_feature_path(const char *name, long vlen, const char *feature, long len, int type, VALUE load_path) { long i; - + long plen; + const char *e; + + if(vlen < len) return 0; + if (!strncmp(name+(vlen-len),feature,len)){ + plen = vlen - len - 1; + } else { + for (e = name + vlen; name != e && *e != '.' && *e != '/'; --e); + if (*e!='.' || + e-name < len || + strncmp(e-len,feature,len) ) + return 0; + plen = e - name - len - 1; + } 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 (vlen < n + len + 1) continue; + if (n != plen ) continue; if (n && (strncmp(name, s, n) || name[n] != '/')) continue; - if (strncmp(name + n + 1, feature, len)) continue; - if (name[n+len+1] && name[n+len+1] != '.') continue; switch (type) { case 's': if (IS_DLEXT(&name[n+len+1])) return p; |