[#16154] : and :: — Shin-ichiro HARA <sinara@...>
原です。
まつもと ゆきひろです
原です。
まつもと ゆきひろです
原です。
[#16178] Marshal::dump calls Proc#yield? (1.6.7) — akira yamada / やまだあきら <akira@...>
まつもと ゆきひろです
[#16191] getopts() broken — "Akinori MUSHA" <knu@...>
getopts が最新の 1.6/1.7 で動かなくなっているようなので、
[#16211] pstore.rb and sync.rb — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
[#16214] net/http.rb version_1_2 not work — Tietew <tietew-ml-ruby-dev@...>
Tietew です。
[#16223] importing racc-runtime — "Akinori MUSHA" <knu@...>
rough にある racc runtime モジュールを眺めていたんですが、
[#16231] LoadLibraryEx vs. LoadLibrary — WATANABE Hirofumi <eban@...>
わたなべです。
[#16240] [Oni Guruma] look behind — nobu.nakada@...
なかだです。
nobu.nakada@nifty.ne.jpさんの
In article <20020307054004.BFADD57D@helium.ruby-lang.org>,
Tanaka Akiraさんの<hvog03clxib.fsf@coulee.a02.aist.go.jp>から
[#16277] Dir::glob(pattern, flags = 0) — "Akinori MUSHA" <knu@...>
しばらく放置していた、
[#16283] ライブラリ拡大計画 — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
高橋征義です。
まつもと ゆきひろです
In article <1015827556.101112.6552.nullmailer@ev.netlab.jp>,
まつもと ゆきひろです
なかだです。
あおきです。
まつもと ゆきひろです
In article <hvowuwjbo4j.fsf@coulee.a02.aist.go.jp>,
わたなべです。
At Mon, 11 Mar 2002 12:17:12 +0900,
まつもと ゆきひろです
At Wed, 27 Mar 2002 18:56:03 +0900,
まつもと ゆきひろです
At Thu, 28 Mar 2002 00:12:49 +0900,
At Thu, 28 Mar 2002 23:45:49 +0900,
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
なかだです。
At Fri, 29 Mar 2002 20:32:17 +0900,
At Sun, 31 Mar 2002 02:20:04 +0900,
At Sun, 31 Mar 2002 02:20:04 +0900,
なかだです。
わたなべです。
At Fri, 8 Mar 2002 18:05:01 +0900,
まつもと ゆきひろです
なかだです。
In article <20020314133401.3918E10F3@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
In article <20020315050614.C975F10F0@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
In article <20020315160435.7A84B114C@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
In article <200204161515.g3GFFjM17207@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
In article <200204170729.g3H7TeM15268@sharui.nakada.kanuma.tochigi.jp>,
[#16290] IO#gets improvement — nobu.nakada@...
なかだです。
In article <20020308131426.8C36123B9@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
In article <20020309025151.5405C24F2@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
なかだです。
わたなべです。
なかだです。
わたなべです。
なかだです。
わたなべです。
なかだです。
わたなべです。
なかだです。
[#16351] map in printf format — nobu.nakada@...
なかだです。
[#16411] block local var — "K.Kosako" <kosako@...>
Version: 1.7 latest
> コンパイル時点で、ブロック変数かどうかの判定が
[#16422] abort with message — nobu.nakada@...
なかだです。
西山和広です。
[#16423] Re: [ruby-list:34301] Re: Enumerable#inject (Re: しぶらぐっ議事録。) — Koji Arai <JCA02266@...>
新井です。
[#16433] class variable & inheritance & singlton method / 1.6.7 — sinara@...
原です。
[#16454] Re: ext/iconv does not work with iconv 2.0 (FreeBSD) (PR#273) — nobu.nakada@...
なかだです。
[#16486] mswin32 configuration — nobu.nakada@...
なかだです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
なかだです。
[#16508] Re: [ruby-cvs] ruby: * mkconfig.rb: don't touch rbconfig.rb if there is a trouble. — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
In article <20020320203914.55E9.USA@osb.att.ne.jp>,
[#16514] MAKEFLAGS for ext — nobu.nakada@...
なかだです。
[#16518] ruby-zlib cvs operation — "Akinori MUSHA" <knu@...>
At Thu, 21 Mar 2002 16:53:03 +0000,
In article <86d6xxerjd.wl@daemon.musha.org>,
新井です。
うえのです。
[#16522] sprintf("%u") — Koji Arai <JCA02266@...>
新井です。
[#16532] 定数の再定義 — Wakou Aoyama <wakou@...>
青山です。
[#16545] BigFloat — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
At Sat, 23 Mar 2002 22:55:45 +0900,
At Sun, 24 Mar 2002 02:20:26 +0900,
In article <867ko3yyik.wl@archon.local.idaemons.org>,
At Sun, 24 Mar 2002 04:21:59 +0900,
In article <864rj7yljs.wl@archon.local.idaemons.org>,
At Sun, 24 Mar 2002 07:44:15 +0900,
In article <861yeazvtg.wl@archon.local.idaemons.org>,
At Sun, 24 Mar 2002 15:41:18 +0900,
けいじゅ@日本ラショナルソフトウェアです.
けいじゅ@日本ラショナルソフトウェアです.
At Tue, 2 Apr 2002 16:16:04 +0900,
原です。
小林です。
[#16555] File.fnmatch (Re: [rubyist:1286] Re: ARGV の機能) — Koji Arai <JCA02266@...>
新井です。
In article <20020324.135631.115921076.JCA02266@nifty.ne.jp>,
新井です。
In article <20020324.143726.89024092.JCA02266@nifty.ne.jp>,
新井です。
[#16593] Oniguruma and multibyte character literal — TAKAHASHI Masayoshi <maki@...>
高橋征義です。
まつもと ゆきひろです
なかだです。
[#16609] control uid/gid — nagai@...
永井@知能.九工大です.
[#16633] socket.c/sock_addrinfo() — WATANABE Tetsuya <tetsu@...>
渡辺哲也です。
[#16636] -L for iconv — Tanaka Akira <akr@...17n.org>
FreeBSD で --prefix つきで Ruby を install するときに、ext/iconv を使
[#16652] [OniGuruma] nested repeat operator — "K.Kosako" <kosako@...>
[ruby-talk:36959]で指摘された
なかだです。
なひです。
なかだです。
なひです。
なかだです。
まつもと ゆきひろです
In article <20020329022810.68F9E17@helium.ruby-lang.org>,
Tanaka Akiraさんの<hvohemzoku6.fsf@coulee.a02.aist.go.jp>から
In article <20020329090116.832F4807@helium.ruby-lang.org>,
Tanaka Akiraさんの<hvod6xnohi8.fsf@coulee.a02.aist.go.jp>から
In article <20020402043641.5E1F6783@helium.ruby-lang.org>,
[#16697] assignment nil to $~ — Tanaka Akira <akr@...17n.org>
% ruby -e '$~ = nil'
まつもと ゆきひろです
In article <1017631490.892199.30753.nullmailer@ev.netlab.jp>,
[ruby-dev:16180] Re: autoload (Re: Re: : and ::)
なかださん wrote: > > +static VALUE autoload_tbl = 0; > > +static VALUE autoload_target = 0; > > +#define AUTOLOAD_TARGET autoload_target > > +#define IS_AUTOLOAD_TARGET(obj) ((obj)==autoload_target) > > Qundefでもいいかも。 なるほど、それを使うのが良さそうですね。 というわけで、変更してみました。 先の差分からの変更点は、他に以下の点です。 - 1.6.7を元にした - 定数書き換え時のautoload情報削除し忘れを修正 - rb_hash_delete()を直接使うようにした - autoload?(mod,sym) を mod.autoload?(sym) に変更 -- MOROHOSHI Akihiko
Attachments (1)
diff -ruN --exclude config* --exclude *~ --exclude Makefile --exclude ext --exclude *.rb ruby-1.6.7.orig/eval.c ruby-1.6.7/eval.c
--- ruby-1.6.7.orig/eval.c Wed Feb 27 13:50:29 2002
+++ ruby-1.6.7/eval.c Sun Mar 3 19:15:23 2002
@@ -3079,9 +3079,6 @@
}
klass = 0;
- if ((ruby_class == rb_cObject) && rb_autoload_defined(node->nd_cname)) {
- rb_autoload_load(node->nd_cname);
- }
if (rb_const_defined_at(ruby_class, node->nd_cname)) {
klass = rb_const_get(ruby_class, node->nd_cname);
}
@@ -3126,9 +3123,6 @@
rb_raise(rb_eTypeError, "no outer class/module");
}
module = 0;
- if ((ruby_class == rb_cObject) && rb_autoload_defined(node->nd_cname)) {
- rb_autoload_load(node->nd_cname);
- }
if (rb_const_defined_at(ruby_class, node->nd_cname)) {
module = rb_const_get(ruby_class, node->nd_cname);
}
@@ -6057,8 +6051,6 @@
#endif
}
-VALUE rb_f_autoload();
-
void
Init_load()
{
@@ -6072,7 +6064,6 @@
rb_define_global_function("load", rb_f_load, -1);
rb_define_global_function("require", rb_f_require, 1);
- rb_define_global_function("autoload", rb_f_autoload, 2);
rb_global_variable(&ruby_wrapper);
ruby_dln_librefs = rb_ary_new();
diff -ruN --exclude config* --exclude *~ --exclude Makefile --exclude ext --exclude *.rb ruby-1.6.7.orig/hash.c ruby-1.6.7/hash.c
--- ruby-1.6.7.orig/hash.c Mon Feb 25 18:16:41 2002
+++ ruby-1.6.7/hash.c Sun Mar 3 19:34:02 2002
@@ -386,7 +386,7 @@
return indexes;
}
-static VALUE
+VALUE
rb_hash_delete(hash, key)
VALUE hash, key;
{
diff -ruN --exclude config* --exclude *~ --exclude Makefile --exclude ext --exclude *.rb ruby-1.6.7.orig/inits.c ruby-1.6.7/inits.c
--- ruby-1.6.7.orig/inits.c Wed Mar 21 17:04:11 2001
+++ ruby-1.6.7/inits.c Sun Mar 3 20:01:02 2002
@@ -13,6 +13,7 @@
#include "ruby.h"
void Init_Array _((void));
+void Init_autoload _((void));
void Init_Bignum _((void));
void Init_Comparable _((void));
void Init_Dir _((void));
@@ -72,6 +73,7 @@
Init_signal();
Init_process();
Init_load();
+ Init_autoload();
Init_Proc();
Init_Math();
Init_GC();
diff -ruN --exclude config* --exclude *~ --exclude Makefile --exclude ext --exclude *.rb ruby-1.6.7.orig/intern.h ruby-1.6.7/intern.h
--- ruby-1.6.7.orig/intern.h Wed Feb 27 13:50:30 2002
+++ ruby-1.6.7/intern.h Sun Mar 3 19:34:40 2002
@@ -200,6 +200,7 @@
VALUE rb_hash_freeze _((VALUE));
VALUE rb_hash_aref _((VALUE, VALUE));
VALUE rb_hash_aset _((VALUE, VALUE, VALUE));
+VALUE rb_hash_delete _((VALUE, VALUE));
VALUE rb_hash_delete_if _((VALUE));
int rb_path_check _((char *));
int rb_env_path_tainted _((void));
@@ -358,8 +359,6 @@
void rb_set_class_path _((VALUE, VALUE, const char*));
VALUE rb_path2class _((const char*));
void rb_name_class _((VALUE, ID));
-void rb_autoload _((const char*, const char*));
-VALUE rb_f_autoload _((VALUE, VALUE, VALUE));
void rb_gc_mark_global_tbl _((void));
VALUE rb_f_trace_var _((int, VALUE*));
VALUE rb_f_untrace_var _((int, VALUE*));
@@ -380,14 +379,12 @@
VALUE rb_mod_const_of _((VALUE, VALUE));
VALUE rb_mod_remove_const _((VALUE, VALUE));
int rb_const_defined_at _((VALUE, ID));
-int rb_autoload_defined _((ID));
int rb_const_defined _((VALUE, ID));
VALUE rb_const_get _((VALUE, ID));
VALUE rb_const_get_at _((VALUE, ID));
void rb_const_set _((VALUE, ID, VALUE));
void rb_const_assign _((VALUE, ID, VALUE));
VALUE rb_mod_constants _((VALUE));
-void rb_autoload_load _((ID));
void rb_cvar_declare _((VALUE, ID, VALUE));
VALUE rb_cvar_defined _((VALUE, ID));
void rb_cvar_set _((VALUE, ID, VALUE));
diff -ruN --exclude config* --exclude *~ --exclude Makefile --exclude ext --exclude *.rb ruby-1.6.7.orig/variable.c ruby-1.6.7/variable.c
--- ruby-1.6.7.orig/variable.c Tue Feb 19 13:48:04 2002
+++ ruby-1.6.7/variable.c Sun Mar 3 20:18:26 2002
@@ -245,40 +245,6 @@
rb_iv_set(klass, "__classid__", ID2SYM(id));
}
-static st_table *autoload_tbl = 0;
-
-static void
-rb_autoload_id(id, filename)
- ID id;
- const char *filename;
-{
- rb_secure(4);
- if (!rb_is_const_id(id)) {
- rb_raise(rb_eNameError, "autoload must be constant name",
- rb_id2name(id));
- }
-
- if (!autoload_tbl) {
- autoload_tbl = st_init_numtable();
- }
- st_insert(autoload_tbl, id, strdup(filename));
-}
-
-void
-rb_autoload(klass, filename)
- const char *klass, *filename;
-{
- rb_autoload_id(rb_intern(klass), filename);
-}
-
-VALUE
-rb_f_autoload(obj, klass, file)
- VALUE obj, klass, file;
-{
- rb_autoload_id(rb_to_id(klass), STR2CSTR(file));
- return Qnil;
-}
-
char *
rb_class2name(klass)
VALUE klass;
@@ -1032,22 +998,115 @@
return val;
}
+static VALUE autoload_tbl = Qnil;
+#define AUTOLOAD_TARGET Qundef
+#define IS_AUTOLOAD_TARGET(obj) ((obj)==Qundef)
+#define AUTOLOAD_KEY_NEW(klass,id) rb_ary_new3(2,klass,ID2SYM(id))
+
+static void
+autoload_add(VALUE klass, ID id, VALUE file) {
+ VALUE key;
+
+ rb_secure(4);
+ Check_SafeStr(file);
+ if (!rb_is_const_id(id)) {
+ rb_raise(rb_eNameError, "autoload must be constant name",
+ rb_id2name(id));
+ }
+
+ key = AUTOLOAD_KEY_NEW(klass, id);
+ rb_hash_aset(autoload_tbl, key, file);
+}
+
+static VALUE
+rb_mod_autoload(VALUE mod, VALUE sym, VALUE file) {
+ ID id = rb_to_id(sym);
+
+ if (rb_const_defined_at(mod,id))
+ return Qnil;
+
+ rb_const_set(mod, id, AUTOLOAD_TARGET);
+ autoload_add(mod, id, file);
+
+ return Qnil;
+}
+
+static VALUE
+rb_f_autoload(VALUE obj, VALUE sym, VALUE file) {
+ /* I use ruby_class instead of obj, as same as NODE_CDECL,
+ * assuming autoload is another way of const_set.
+ */
+ return rb_mod_autoload(ruby_class, sym, file);
+}
+
+static void
+autoload_delete(VALUE klass, VALUE id) {
+ VALUE key = AUTOLOAD_KEY_NEW(klass, id);
+ rb_hash_delete(autoload_tbl, key);
+}
+
+static void
+autoload_load(VALUE klass, ID id) {
+ VALUE key, file;
+
+ if (RCLASS(klass)->iv_tbl) {
+ VALUE value;
+ st_delete(ROBJECT(klass)->iv_tbl, &id, &value);
+ if (! IS_AUTOLOAD_TARGET(value))
+ rb_bug("autoload_laod: removed normal constant: %s::%s",
+ rb_class2name(klass), rb_id2name(id));
+ } else {
+ rb_bug("autoload_load: constant not found: %s::%s",
+ rb_class2name(klass), rb_id2name(id));
+ }
+
+ key = AUTOLOAD_KEY_NEW(klass, id);
+ file = rb_hash_delete(autoload_tbl, key);
+
+ if (NIL_P(file)) {
+ rb_bug("autoload file not found for %s::%s",
+ rb_class2name(klass), rb_id2name(id));
+ }
+
+ if (rb_provided(RSTRING(file)->ptr))
+ return;
+
+ FL_UNSET(file, FL_TAINT);
+ rb_f_require(Qnil, file);
+}
+
+static VALUE
+rb_mod_autoload_p(VALUE mod, VALUE sym) {
+ ID id = rb_to_id(sym);
+ return NIL_P(rb_hash_aref(autoload_tbl, AUTOLOAD_KEY_NEW(mod,id))) ?
+ Qfalse : Qtrue;
+}
+
+static VALUE
+rb_f_autoload_p(VALUE self, VALUE sym) {
+ /* use ruby_class as same as rb_f_autoload. */
+ return rb_mod_autoload_p(ruby_class, sym);
+}
+
+void
+Init_autoload() {
+ autoload_tbl = rb_hash_new();
+ rb_global_variable(&autoload_tbl);
+
+ rb_define_method(rb_cModule, "autoload", rb_mod_autoload, 2);
+ rb_define_method(rb_cModule, "autoload?", rb_mod_autoload_p, 1);
+ rb_define_global_function("autoload", rb_f_autoload, 2);
+ rb_define_global_function("autoload?", rb_f_autoload_p, 1);
+}
+
static int
top_const_get(id, klassp)
ID id;
VALUE *klassp;
{
- VALUE value;
-
/* pre-defined class */
if (st_lookup(rb_class_tbl, id, klassp)) return Qtrue;
- /* autoload */
- if (autoload_tbl && st_lookup(autoload_tbl, id, 0)) {
- rb_autoload_load(id);
- *klassp = rb_const_get(rb_cObject, id);
- return Qtrue;
- }
return Qfalse;
}
@@ -1058,7 +1117,12 @@
{
VALUE value;
+retry:
if (RCLASS(klass)->iv_tbl && st_lookup(RCLASS(klass)->iv_tbl, id, &value)) {
+ if (IS_AUTOLOAD_TARGET(value)) {
+ autoload_load(klass, id);
+ goto retry;
+ }
return value;
}
if (klass == rb_cObject && top_const_get(id, &value)) {
@@ -1070,24 +1134,6 @@
return Qnil; /* not reached */
}
-void
-rb_autoload_load(id)
- ID id;
-{
- char *modname;
- VALUE module;
-
- st_delete(autoload_tbl, &id, &modname);
- if (rb_provided(modname)) {
- free(modname);
- return;
- }
- module = rb_str_new2(modname);
- free(modname);
- FL_UNSET(module, FL_TAINT);
- rb_f_require(Qnil, module);
-}
-
VALUE
rb_const_get(klass, id)
VALUE klass;
@@ -1100,6 +1146,10 @@
retry:
while (tmp) {
if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,&value)) {
+ if (IS_AUTOLOAD_TARGET(value)) {
+ autoload_load(tmp,id);
+ goto retry;
+ }
return value;
}
if (tmp == rb_cObject && top_const_get(id, &value)) return value;
@@ -1128,6 +1178,7 @@
VALUE value;
VALUE ary;
{
+ /* autoload constants: included. */
if (rb_is_const_id(key)) {
VALUE kval = rb_str_new2(rb_id2name(key));
if (!rb_ary_includes(ary, kval)) {
@@ -1152,7 +1203,15 @@
if (OBJ_FROZEN(mod)) rb_error_frozen("class/module");
if (RCLASS(mod)->iv_tbl && st_delete(ROBJECT(mod)->iv_tbl, &id, &val)) {
- return val;
+ if (IS_AUTOLOAD_TARGET(val)) {
+ /* cancel autoload and go through.
+ *
+ * XXX - should we do autoload and retry?
+ */
+ autoload_delete(mod, id);
+ } else {
+ return val;
+ }
}
if (rb_const_defined_at(mod, id)) {
rb_raise(rb_eNameError, "cannot remove %s::%s",
@@ -1163,19 +1222,6 @@
return Qnil; /* not reached */
}
-static int
-autoload_i(key, name, ary)
- ID key;
- const char *name;
- VALUE ary;
-{
- VALUE kval = rb_str_new2(rb_id2name(key));
- if (!rb_ary_includes(ary, kval)) {
- rb_ary_push(ary, kval);
- }
- return ST_CONTINUE;
-}
-
VALUE
rb_mod_const_at(mod, ary)
VALUE mod, ary;
@@ -1185,9 +1231,6 @@
}
if ((VALUE)mod == rb_cObject) {
st_foreach(rb_class_tbl, sv_i, ary);
- if (autoload_tbl) {
- st_foreach(autoload_tbl, autoload_i, ary);
- }
}
return ary;
}
@@ -1217,6 +1260,7 @@
VALUE klass;
ID id;
{
+ /* autoload constants: included */
if (RCLASS(klass)->iv_tbl && st_lookup(RCLASS(klass)->iv_tbl, id, 0)) {
return Qtrue;
}
@@ -1227,21 +1271,13 @@
}
int
-rb_autoload_defined(id)
- ID id;
-{
- if (autoload_tbl && st_lookup(autoload_tbl, id, 0))
- return Qtrue;
- return Qfalse;
-}
-
-int
rb_const_defined(klass, id)
VALUE klass;
ID id;
{
VALUE tmp = klass;
+ /* autoload constants: included */
while (tmp) {
if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,0)) {
return Qtrue;
@@ -1253,7 +1289,7 @@
}
if (st_lookup(rb_class_tbl, id, 0))
return Qtrue;
- return rb_autoload_defined(id);
+ return Qfalse;
}
static void
@@ -1272,8 +1308,12 @@
RCLASS(klass)->iv_tbl = st_init_numtable();
}
else if (isconst) {
- if (st_lookup(RCLASS(klass)->iv_tbl, id, 0) ||
- (klass == rb_cObject && st_lookup(rb_class_tbl, id, 0))) {
+ VALUE value;
+ if (st_lookup(RCLASS(klass)->iv_tbl, id, &value)) {
+ if (IS_AUTOLOAD_TARGET(value))
+ autoload_delete(klass, id);
+ rb_warn("already initialized %s %s", dest, rb_id2name(id));
+ } else if (klass == rb_cObject && st_lookup(rb_class_tbl, id, 0)) {
rb_warn("already initialized %s %s", dest, rb_id2name(id));
}
}
@@ -1297,9 +1337,15 @@
VALUE val;
{
VALUE tmp = klass;
-
+
+retry:
while (tmp) {
- if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,0)) {
+ VALUE value;
+ if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,&value)) {
+ if (IS_AUTOLOAD_TARGET(value)) {
+ autoload_load(tmp,id);
+ goto retry;
+ }
st_insert(RCLASS(tmp)->iv_tbl, id, val);
return;
}
@@ -1308,16 +1354,6 @@
/* pre-defined class */
if (st_lookup(rb_class_tbl, id, 0)) {
st_delete(rb_class_tbl, id, 0);
- st_insert(RCLASS(rb_cObject)->iv_tbl, id, val);
- return;
- }
-
- /* autoload */
- if (autoload_tbl && st_lookup(autoload_tbl, id, 0)) {
- char *modname;
-
- st_delete(autoload_tbl, &id, &modname);
- free(modname);
st_insert(RCLASS(rb_cObject)->iv_tbl, id, val);
return;
}