summaryrefslogtreecommitdiff
path: root/variable.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <matz@ruby-lang.org>1995-02-01 19:48:24 +0900
committerTakashi Kokubun <takashikkbn@gmail.com>2019-08-17 22:09:31 +0900
commit897cf066952978ccbae1d57bbc14a03c7b98a1e1 (patch)
treebc83424954929dc9574e40a0aee874f45965a8ae /variable.c
parent5d828b25d4ae30a000c054a724ac248dadbb97b3 (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.c146
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