From 2f106ab85c4f4e171374aee261f5a12bdd923c41 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 21 Feb 1995 18:56:56 +0900 Subject: version 0.67 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://cache.ruby-lang.org/pub/ruby/1.0/ruby-0.66-0.67.diff.gz Tue Feb 21 18:56:56 1995 Yukihiro Matsumoto (matz@ix-02) * io.c(STDIN, STDOUT, STDERR): 定数として定義.今までの$stdinなど は将来なくなるかも知れない. * io.c(select): bug fix. * version 0.67 Mon Feb 20 16:10:14 1995 Yukihiro Matsumoto (matz@ix-02) * parse.y(yylex): 定数を`%識別子'から,第1文字が大文字の識別子に変 更.それにともないクラスは定数となった. * eval.c: クラス定義内のselfがクラス定義外部のthe_classだった. * variable.c(rb_name_class): クラス名をインスタンス変数に格納する. Thu Feb 16 15:36:17 1995 Yukihiro Matsumoto (matz@ix-02) * parse.y: BLOCKをbraceで表現する文法に変更したものを作ってみる. MLに提示してみるが反応がない. * object.c(do,forever): なくした. Wed Feb 15 13:20:49 1995 Yukihiro Matsumoto (matz@ix-02) * re.c(new): 第2引数が与えられて,かつnilでないときだけ設定するよ うに(以前はnilの時にも設定を行なっていた). * parse.y(parse_regexp): 正規表現リテラルで大文字小文字を無視する かどうか指定できるように. Tue Feb 14 00:55:33 1995 Yukihiro Matsumoto (matz@dyna) * parse.y: (compexpr) -> (expr). Fri Feb 10 16:30:00 1995 Yukihiro Matsumoto (matz@ix-02) * ruby.c(load_file): scriptを読み込む時だけ"#!"の解析を行うように. * ruby.c(readin): ファイル読み込み時に先頭に"#!"があり,rubyに引数 が与えられていれば,その引数も有効になる. * parse.y(yylex): コメント行の終りが`\'であった時,次の行に継続し ているとみなすようにした. --- variable.c | 60 +++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 21 deletions(-) (limited to 'variable.c') diff --git a/variable.c b/variable.c index bdfca0a2cf..9ac538c37e 100644 --- a/variable.c +++ b/variable.c @@ -38,11 +38,40 @@ rb_name_class(class, id) { VALUE body; - if (st_lookup(class_tbl, id, &body)) { - Bug("%s %s already exists", - TYPE(body)==T_CLASS?"class":"module", rb_id2name(id)); + rb_ivar_set_1(class, rb_intern("__classname__"), INT2FIX(id)); +} + +char * +rb_class2name(class) + struct RClass *class; +{ + int name; + + switch (TYPE(class)) { + case T_ICLASS: + class = (struct RClass*)RBASIC(class)->class; + break; + case T_CLASS: + case T_MODULE: + break; + default: + Fail("0x%x is not a class/module", class); + } + + while (FL_TEST(class, FL_SINGLE)) { + class = (struct RClass*)class->super; + } + + while (TYPE(class) == T_ICLASS) { + class = (struct RClass*)class->super; } - st_add_direct(class_tbl, id, class); + + name = rb_ivar_get_1(class, rb_intern("__classname__")); + if (name) { + name = FIX2INT(name); + return rb_id2name((ID)name); + } + Bug("class 0x%x not named", class); } struct global_entry { @@ -203,8 +232,7 @@ rb_gvar_get(entry) default: break; } - if (verbose) - Warning("global var %s not initialized", rb_id2name(entry->id)); + Warning("global var %s not initialized", rb_id2name(entry->id)); return Qnil; } @@ -247,18 +275,6 @@ rb_gvar_set2(name, val) return val; } -VALUE -rb_mvar_get(id) - ID id; -{ - VALUE val; - - if (st_lookup(class_tbl, id, &val)) return val; - if (verbose) - Warning("local var %s not initialized", rb_id2name(id)); - return Qnil; -} - VALUE rb_ivar_get_1(obj, id) struct RObject *obj; @@ -278,9 +294,7 @@ rb_ivar_get_1(obj, id) rb_class2name(CLASS_OF(obj))); break; } - if (verbose) { - Warning("instance var %s not initialized", rb_id2name(id)); - } + Warning("instance var %s not initialized", rb_id2name(id)); return Qnil; } @@ -333,6 +347,10 @@ rb_const_get(id) } class = class->super; } + + /* pre-defined class */ + if (st_lookup(class_tbl, id, &value)) return value; + Fail("Uninitialized constant %s", rb_id2name(id)); /* not reached */ } -- cgit v1.2.3