diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | eval.c | 7 | ||||
-rw-r--r-- | regex.c | 16 | ||||
-rw-r--r-- | variable.c | 90 | ||||
-rw-r--r-- | version.h | 4 |
5 files changed, 74 insertions, 57 deletions
@@ -1,3 +1,17 @@ +Wed Jun 6 16:11:06 2001 Yukihiro Matsumoto <matz@ruby-lang.org> + + * eval.c (rb_load): should check if tainted even when wrap is + specified. + +Wed Jun 6 14:34:27 2001 Yukihiro Matsumoto <matz@ruby-lang.org> + + * regex.c (re_compile_pattern): too much optimization for the + cases like /(.|a)b/. + +Tue Jun 5 23:58:43 2001 Yukihiro Matsumoto <matz@ruby-lang.org> + + * variable.c (fc_i): removed vast string allocation. + Tue Jun 5 15:16:06 2001 Yukihiro Matsumoto <matz@ruby-lang.org> * eval.c (rb_add_method): should not call rb_secure(), for @@ -5128,12 +5128,7 @@ rb_load(fname, wrap) NODE *saved_cref = ruby_cref; TMP_PROTECT; - if (wrap) { - Check_Type(fname, T_STRING); - } - else { - Check_SafeStr(fname); - } + Check_SafeStr(fname); file = rb_find_file(RSTRING(fname)->ptr); if (!file) { rb_raise(rb_eLoadError, "No such file to load -- %s", RSTRING(fname)->ptr); @@ -2360,21 +2360,7 @@ re_compile_pattern(pattern, size, bufp) laststart++; EXTRACT_NUMBER_AND_INCR(mcnt, laststart); - if (mcnt == 4 && *laststart == anychar) { - switch ((enum regexpcode)laststart[1]) { - case jump_n: - case finalize_jump: - case maybe_finalize_jump: - case jump: - case jump_past_alt: - case dummy_failure_jump: - bufp->options |= RE_OPTIMIZE_ANCHOR; - break; - default: - break; - } - } - else if (*laststart == charset || *laststart == charset_not) { + if (*laststart == charset || *laststart == charset_not) { p0 = laststart; mcnt = *++p0; p0 += mcnt+1; diff --git a/variable.c b/variable.c index b5a92dc6cb..c05fc11a99 100644 --- a/variable.c +++ b/variable.c @@ -36,6 +36,33 @@ struct fc_result { struct fc_result *prev; }; +static VALUE +fc_path(fc, name) + struct fc_result *fc; + ID name; +{ + VALUE path, tmp; + + path = rb_str_new2(rb_id2name(name)); + while (fc) { + if (fc->track == rb_cObject) break; + if (ROBJECT(fc->track)->iv_tbl && + st_lookup(ROBJECT(fc->track)->iv_tbl, rb_intern("__classpath__"), &tmp)) { + tmp = rb_str_dup(tmp); + rb_str_cat2(tmp, "::"); + rb_str_append(tmp, path); + + return tmp; + } + tmp = rb_str_new2(rb_id2name(fc->name)); + rb_str_cat2(tmp, "::"); + rb_str_append(tmp, path); + path = tmp; + fc = fc->prev; + } + return path; +} + static int fc_i(key, value, res) ID key; @@ -43,48 +70,43 @@ fc_i(key, value, res) struct fc_result *res; { VALUE path; - char *name; if (!rb_is_const_id(key)) return ST_CONTINUE; - name = rb_id2name(key); - if (res->path) { - path = rb_str_dup(res->path); - rb_str_cat2(path, "::"); - rb_str_cat2(path, name); - } - else { - path = rb_str_new2(name); - } if (value == res->klass) { - res->name = key; - res->path = path; + res->path = fc_path(res, key); return ST_STOP; } - if (rb_obj_is_kind_of(value, rb_cModule)) { - struct fc_result arg; - struct fc_result *list; - - + switch (TYPE(value)) { + case T_MODULE: + case T_CLASS: if (!RCLASS(value)->iv_tbl) return ST_CONTINUE; + else { + struct fc_result arg; + struct fc_result *list; + + list = res; + while (list) { + if (list->track == value) return ST_CONTINUE; + list = list->prev; + } - list = res; - while (list) { - if (list->track == value) return ST_CONTINUE; - list = list->prev; + arg.name = key; + arg.path = 0; + arg.klass = res->klass; + arg.track = value; + arg.prev = res; + st_foreach(RCLASS(value)->iv_tbl, fc_i, &arg); + if (arg.path) { + res->path = arg.path; + return ST_STOP; + } } + break; - arg.name = 0; - arg.path = path; - arg.klass = res->klass; - arg.track = value; - arg.prev = res; - st_foreach(RCLASS(value)->iv_tbl, fc_i, &arg); - if (arg.name) { - res->name = arg.name; - res->path = arg.path; - return ST_STOP; - } + default: + break; + } return ST_CONTINUE; } @@ -103,10 +125,10 @@ find_class_path(klass) if (RCLASS(rb_cObject)->iv_tbl) { st_foreach(RCLASS(rb_cObject)->iv_tbl, fc_i, &arg); } - if (arg.name == 0) { + if (arg.path == 0) { st_foreach(rb_class_tbl, fc_i, &arg); } - if (arg.name) { + if (arg.path) { st_insert(ROBJECT(klass)->iv_tbl,rb_intern("__classpath__"),arg.path); return arg.path; } @@ -1,4 +1,4 @@ #define RUBY_VERSION "1.6.4" -#define RUBY_RELEASE_DATE "2001-06-05" +#define RUBY_RELEASE_DATE "2001-06-06" #define RUBY_VERSION_CODE 164 -#define RUBY_RELEASE_CODE 20010605 +#define RUBY_RELEASE_CODE 20010606 |