[#21225] Re: [ruby-cvs] ruby: * enum.c (inject_i): use rb_yield_values. — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

14 messages 2003/08/22
[#21227] Re: [ruby-cvs] ruby: * enum.c (inject_i): use rb_yield_values. — nobu.nakada@... 2003/08/22

なかだです。

[#21228] Re: [ruby-cvs] ruby: * enum.c (inject_i): use rb_yield_values. — matz@... (Yukihiro Matsumoto) 2003/08/22

まつもと ゆきひろです

[#21281] 大量メモリ消費攻撃に対する対応 — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

16 messages 2003/08/29
[#21285] Re: 大量メモリ消費攻撃に対する対応 — matz@... (Yukihiro Matsumoto) 2003/08/29

まつもと ゆきひろです

[#21288] Re: 大量メモリ消費攻撃に対する対応 — Hidetoshi NAGAI <nagai@...> 2003/08/29

永井@知能.九工大です.

[#21306] Re: 大量メモリ消費攻撃に対する対応 — matz@... (Yukihiro Matsumoto) 2003/09/03

まつもと ゆきひろです

[ruby-dev:21071] Re: searching class name

From: nobu.nakada@...
Date: 2003-08-02 03:54:47 UTC
List: ruby-dev #21071
なかだです。

At Sat, 2 Aug 2003 12:03:49 +0900,
Masahiro Sakai (酒井政裕) wrote:
> このパッチはまだ適用されていないようですが、
> 1.8.0には入らないのでしょうか?

忘れてました。

その後の変更でこのパッチは当たらなくなってるので、作り直してみ
ました。


Index: variable.c
===================================================================
RCS file: /cvs/ruby/src/ruby/variable.c,v
retrieving revision 1.99
diff -u -2 -p -r1.99 variable.c
--- variable.c	26 Jul 2003 02:25:56 -0000	1.99
+++ variable.c	2 Aug 2003 03:35:22 -0000
@@ -21,5 +21,5 @@
 static st_table *rb_global_tbl;
 st_table *rb_class_tbl;
-static ID autoload;
+static ID autoload, classpath, tmp_classpath;
 
 void
@@ -29,4 +29,6 @@ Init_var_tables()
     rb_class_tbl = st_init_numtable();
     autoload = rb_intern("__autoload__");
+    classpath = rb_intern("__classpath__");
+    tmp_classpath = rb_intern("__tmp_classpath__");
 }
 
@@ -50,5 +52,5 @@ fc_path(fc, name)
 	if (fc->track == rb_cObject) break;
 	if (ROBJECT(fc->track)->iv_tbl &&
-	    st_lookup(ROBJECT(fc->track)->iv_tbl, rb_intern("__classpath__"), &tmp)) {
+	    st_lookup(ROBJECT(fc->track)->iv_tbl, classpath, &tmp)) {
 	    tmp = rb_str_dup(tmp);
 	    rb_str_cat2(tmp, "::");
@@ -132,5 +134,6 @@ find_class_path(klass)
 	    ROBJECT(klass)->iv_tbl = st_init_numtable();
 	}
-	st_insert(ROBJECT(klass)->iv_tbl,rb_intern("__classpath__"),arg.path);
+	st_insert(ROBJECT(klass)->iv_tbl, classpath, arg.path);
+	st_delete(RCLASS(klass)->iv_tbl, &tmp_classpath, 0);
 	return arg.path;
     }
@@ -143,5 +146,4 @@ classname(klass)
 {
     VALUE path = Qnil;
-    ID classpath = rb_intern("__classpath__");
 
     klass = rb_class_real(klass);
@@ -152,5 +154,5 @@ classname(klass)
 
 	    if (!st_lookup(ROBJECT(klass)->iv_tbl, classid, &path)) {
-		return Qnil;
+		return find_class_path(klass);
 	    }
 	    path = rb_str_new2(rb_id2name(SYM2ID(path)));
@@ -163,5 +165,5 @@ classname(klass)
 	return path;
     }
-    return Qnil;
+    return find_class_path(klass);
 }
 
@@ -183,17 +185,11 @@ rb_class_path(klass)
 
     if (!NIL_P(path)) return path;
+    if (RCLASS(klass)->iv_tbl && st_lookup(RCLASS(klass)->iv_tbl,
+					   tmp_classpath, &path)) {
+	return path;
+    }
     else {
-	ID tmppath = rb_intern("__tmp_classpath__");
 	char *s = "Class";
 
-	path = find_class_path(klass);
-	if (!NIL_P(path)) {
-	    st_delete(RCLASS(klass)->iv_tbl, (st_data_t*)&tmppath, 0);
-	    return path;
-	}
-	if (RCLASS(klass)->iv_tbl && st_lookup(RCLASS(klass)->iv_tbl, tmppath, &path)) {
-	    return path;
-	}
-
 	if (TYPE(klass) == T_MODULE) {
 	    if (rb_obj_class(klass) == rb_cModule) {
@@ -207,5 +203,5 @@ rb_class_path(klass)
 	sprintf(RSTRING(path)->ptr, "#<%s:0x%lx>", s, klass);
 	RSTRING(path)->len = strlen(RSTRING(path)->ptr);
-	rb_iv_set(klass, "__tmp_classpath__", path);
+	rb_ivar_set(klass, tmp_classpath, path);
 
 	return path;
@@ -228,5 +224,5 @@ rb_set_class_path(klass, under, name)
 	rb_str_cat2(str, name);
     }
-    rb_iv_set(klass, "__classpath__", str);
+    rb_ivar_set(klass, classpath, str);
 }
 
@@ -256,6 +252,5 @@ rb_path2class(path)
 	if (!rb_const_defined(c, id)) {
 	  undefined_class:
-	    rb_raise(rb_eArgError, "undefined class/module %s", rb_id2name(id));
-	    rb_raise(rb_eArgError, "undefined class/module %s", path);
+	    rb_raise(rb_eArgError, "undefined class/module %.*s", p-path, path);
 	}
 	c = rb_const_get_at(c, id);


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread