summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--eval.c7
-rw-r--r--regex.c16
-rw-r--r--variable.c90
-rw-r--r--version.h4
5 files changed, 74 insertions, 57 deletions
diff --git a/ChangeLog b/ChangeLog
index 45bfc7ce60..371229d93c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/eval.c b/eval.c
index 595bb8a3b3..6756111f1c 100644
--- a/eval.c
+++ b/eval.c
@@ -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);
diff --git a/regex.c b/regex.c
index a3d8e2c243..9033e0ac81 100644
--- a/regex.c
+++ b/regex.c
@@ -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;
}
diff --git a/version.h b/version.h
index bf74e7c1eb..538f448ea2 100644
--- a/version.h
+++ b/version.h
@@ -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