diff options
author | Yukihiro Matsumoto <[email protected]> | 1995-02-01 19:48:24 +0900 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2019-08-17 22:09:31 +0900 |
commit | 897cf066952978ccbae1d57bbc14a03c7b98a1e1 (patch) | |
tree | bc83424954929dc9574e40a0aee874f45965a8ae /variable.c | |
parent | 5d828b25d4ae30a000c054a724ac248dadbb97b3 (diff) |
version 0.65v0_65
https://cache.ruby-lang.org/pub/ruby/1.0/ruby-0.65.tar.gz
Wed Feb 1 19:48:24 1995 Yukihiro Matsumoto (matz@ix-02)
* string.c(str_replace): 置き換える文字列の長さが等しい時メモリコ
ピーをしない.
* string.c(rindex): バグ修正.
Mon Jan 30 11:23:05 1995 Yukihiro Matsumoto (matz@ix-02)
* parse.y(value_expr): ifのチェックを追加.
* gc.c(gc_mark): free cellの扱いにバグ.
* parse.y: 文法の変更(よりシンプルに).例外を減らした.
Thu Jan 26 00:52:55 1995 Yukihiro Matsumoto (matz@dyna)
* parse.y: 引数として連想配列を置くことができるように.この場合,
連想配列リテラルが最終引数となる.
* parse.y: 配列参照の`[]'内が空でもよいことにした.
Tue Jan 24 14:45:15 1995 Yukihiro Matsumoto (matz@ix-02)
* class.c(rb_include_module): `-v'を指定した時にはincludeしたモジュー
ルとクラス定数が衝突していないかチェックする.
Mon Jan 23 10:42:09 1995 Yukihiro Matsumoto (matz@ix-02)
* parse.y(rb_class2name): メタクラスに関するbug fix.
* dict.c: Dict[..]で辞書の生成が出来るように.
* array.c: Array[..]で配列の生成が出来るように.
* parse.y: 辞書の表現として{a,b,..}という形式も許すように.
Fri Jan 20 10:28:38 1995 Yukihiro Matsumoto (matz@ix-02)
* re.c(Regexp.quote): 正規表現をエスケープするメソッド.
* 無駄なrb_intern()を減らした.
* parse.y: `!', `!=', `!~'を特殊演算子にする.よってこれらは再定義
できなくなった.
Wed Jan 18 13:20:41 1995 Yukihiro Matsumoto (matz@ix-02)
* parse.y: 文法の整理(unless,untilをなくした).
Tue Jan 17 11:11:27 1995 Yukihiro Matsumoto (matz@ix-02)
* eval.c: defでメソッド再定義時にはスーパークラスのメソッドの可視
性を継承する.最初の定義の時は今までと同じデフォルト(トップレベ
ルで関数的,クラス定義内で通常メソッド).
* object.c(Class::new): オブジェクトの生成時に関数的メ
ソッドinit_objectが必ず呼ばれるように変更.
* eval.c: 未定義のメソッドに対してunknownメソッドが呼ばれるように
なった.エラー表示が今までと同じになるようにenvを調節している.
Fri Jan 13 14:40:30 1995 Yukihiro Matsumoto (matz@ix-02)
* gc.c: gcを若干書き換えて整理した.が,あまり変化はなかったようだ.
* parse.y(yylex): symbolを\symから:symに変更した.
Thu Jan 12 01:39:28 1995 Yukihiro Matsumoto (matz@dyna)
* eval.c: 新規関数 rb_eval_string().
* gc.c: gc_mark()を一部非再帰化.
* variable.c(rb_ivar_{get,set}): インスタンス変数のアクセス周りで
チェックが足りなかった.
* variable.c: クラス定数とインスタンス変数でハッシュテーブルを共有
するようにした.
* ruby.h: iv_tblをRBasicからRObjectとRClassへ移動した.これにより,
ObjectとClass,Moduleしかインスタンス変数を持てなくなる.が,メモ
リ効率は若干向上する.
Diffstat (limited to 'variable.c')
-rw-r--r-- | variable.c | 146 |
1 files changed, 81 insertions, 65 deletions
diff --git a/variable.c b/variable.c index 88a306841f..bdfca0a2cf 100644 --- a/variable.c +++ b/variable.c @@ -3,14 +3,13 @@ variable.c - $Author: matz $ - $Date: 1995/01/10 10:43:03 $ + $Date: 1995/01/12 08:54:53 $ created at: Tue Apr 19 23:55:15 JST 1994 ************************************************/ #include "ruby.h" #include "env.h" -#include "node.h" #include "ident.h" #include "st.h" @@ -210,58 +209,6 @@ rb_gvar_get(entry) } VALUE -rb_ivar_get_1(obj, id) - struct RBasic *obj; - ID id; -{ - VALUE val; - - if (obj->iv_tbl == Qnil) - return Qnil; - if (st_lookup(obj->iv_tbl, id, &val)) - return val; - if (verbose) - Warning("instance var %s not initialized", rb_id2name(id)); - return Qnil; -} - -VALUE -rb_ivar_get(id) - ID id; -{ - return rb_ivar_get_1(Qself, id); -} - -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_const_get(id) - ID id; -{ - struct RClass *class = (struct RClass*)CLASS_OF(Qself); - VALUE value; - - while (class) { - if (class->c_tbl && st_lookup(class->c_tbl, id, &value)) { - return value; - } - class = class->super; - } - Fail("Uninitialized constant %s", rb_id2name(id)); - /* not reached */ -} - -VALUE rb_gvar_set(entry, val) struct global_entry *entry; VALUE val; @@ -301,13 +248,67 @@ 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; +{ + VALUE val; + + switch (TYPE(obj)) { + case T_OBJECT: + case T_CLASS: + case T_MODULE: + if (obj->iv_tbl && st_lookup(obj->iv_tbl, id, &val)) + return val; + return Qnil; + default: + Fail("class %s can not have instance variables", + rb_class2name(CLASS_OF(obj))); + break; + } + if (verbose) { + Warning("instance var %s not initialized", rb_id2name(id)); + } + return Qnil; +} + +VALUE +rb_ivar_get(id) + ID id; +{ + return rb_ivar_get_1(Qself, id); +} + +VALUE rb_ivar_set_1(obj, id, val) - struct RBasic *obj; + struct RObject *obj; ID id; VALUE val; { - if (obj->iv_tbl == Qnil) obj->iv_tbl = new_idhash(); - st_insert(obj->iv_tbl, id, val); + switch (TYPE(obj)) { + case T_OBJECT: + case T_CLASS: + case T_MODULE: + if (obj->iv_tbl == Qnil) obj->iv_tbl = new_idhash(); + st_insert(obj->iv_tbl, id, val); + break; + default: + Fail("class %s can not have instance variables", + rb_class2name(CLASS_OF(obj))); + break; + } return val; } @@ -319,13 +320,30 @@ rb_ivar_set(id, val) return rb_ivar_set_1(Qself, id, val); } -static VALUE -const_bound(class, id) +VALUE +rb_const_get(id) + ID id; +{ + struct RClass *class = (struct RClass*)CLASS_OF(Qself); + VALUE value; + + while (class) { + if (class->iv_tbl && st_lookup(class->iv_tbl, id, &value)) { + return value; + } + class = class->super; + } + Fail("Uninitialized constant %s", rb_id2name(id)); + /* not reached */ +} + +VALUE +rb_const_bound(class, id) struct RClass *class; ID id; { while (class) { - if (class->c_tbl && st_lookup(class->c_tbl, id, Qnil)) { + if (class->iv_tbl && st_lookup(class->iv_tbl, id, Qnil)) { return TRUE; } class = class->super; @@ -339,13 +357,11 @@ rb_const_set(class, id, val) ID id; VALUE val; { - if (const_bound(class, id)) + if (rb_const_bound(class, id)) Fail("already initialized constnant"); - if (class->c_tbl == Qnil) - class->c_tbl = new_idhash(); - - st_insert(class->c_tbl, id, val); + if (class->iv_tbl == Qnil) class->iv_tbl = new_idhash(); + st_insert(class->iv_tbl, id, val); } void |