summaryrefslogtreecommitdiff
path: root/variable.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <matz@ruby-lang.org>1995-02-21 18:56:56 +0900
committerTakashi Kokubun <takashikkbn@gmail.com>2019-08-17 22:09:31 +0900
commit2f106ab85c4f4e171374aee261f5a12bdd923c41 (patch)
tree6810f0a05ad8df30a269eb522eea5f77186b90c6 /variable.c
parentc080fb6d10bbcb697b6ba16e640de8db3f1973d0 (diff)
version 0.67v0_67
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): コメント行の終りが`\'であった時,次の行に継続し ているとみなすようにした.
Diffstat (limited to 'variable.c')
-rw-r--r--variable.c60
1 files changed, 39 insertions, 21 deletions
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;
}
@@ -248,18 +276,6 @@ rb_gvar_set2(name, 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;
ID id;
@@ -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 */
}