From b3f9ba5a3720de81a9a14d9d906509f81abeef7a Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 19 Dec 1994 12:01:10 +0900 Subject: version 0.62 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.62.tar.gz Mon Dec 19 12:01:10 1994 Yukihiro Matsumoto (matz@ix-02) * parse.y(cond): 条件式に代入式が置かれた場合,`-v'オプションで警 告が出るように. * parse.y(**): 冪乗演算子`**'の優先順位を単項演算子より高くした. * parse.y(and,or): 優先順位の低い演算子`and', `or'. * 0.62 released. * eval.c: 不必要になったPUSH_ENV, POP_ENVを減らした. * env.h: ENVIONからselfをはずした.PUSH_ENVはsuperの準備のためだけ に用いることにした. * eval.c: 下記のオブジェクト化で遅くなった実行速度をもとに戻した. Mon Dec 17 23:01:10 1994 Yukihiro Matsumoto (matz@ix-02) * eval.c: env.{argv,argc}とscope.local_varsのオブジェクト化. * eval.c: 1スコープ内で複数Blockを生成したときのバグを修正. Fri Dec 16 15:52:06 1994 Yukihiro Matsumoto (matz@ix-02) * parse.y: `&&'と`||'の両辺はいつでも条件式とした. Thu Dec 15 00:16:04 1994 Yukihiro Matsumoto (matz@dyna) * eval.c(Block): Blockオブジェクトを実現. * node.h: NODE_QLISTはなくなった. * eval.c(rb_call): 引数への代入を名前で一つずつ代入するのをやめて, 一度にコピーするようにした. * eval.c(rb_call): rubyで記述されたメソッドへの引数渡しをinline化. * eval.c: イテレータ判定処理の全面書き換え.不適切なイテレータ呼び 出しをなくした.例えば「[foo(),bar()]{i|baz(i)}」でfooもbarもイ テレータとして呼び出され*ない*. * eval.c(rb_call): SCOPE処理をinline化.メソッド呼び出しの若干の高 速化. Wed Dec 14 18:09:33 1994 Yukihiro Matsumoto (matz@ix-02) * node.h: nodeもオブジェクトにする.よってGCで回収される. --- variable.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'variable.c') diff --git a/variable.c b/variable.c index ae3163de19..aa01b31921 100644 --- a/variable.c +++ b/variable.c @@ -3,7 +3,7 @@ variable.c - $Author: matz $ - $Date: 1994/11/01 08:28:42 $ + $Date: 1994/12/19 08:30:16 $ created at: Tue Apr 19 23:55:15 JST 1994 ************************************************/ @@ -55,9 +55,10 @@ struct global_entry { } v; VALUE (*get_hook)(); VALUE (*set_hook)(); + void *data; }; -static +static mark_global_entry(key, entry) ID key; struct global_entry *entry; @@ -73,9 +74,13 @@ mark_global_entry(key, entry) default: break; } + if (entry->data) { + gc_mark_maybe(entry->data); + } return ST_CONTINUE; } +void gc_mark_global_tbl() { st_foreach(global_tbl, mark_global_entry, 0); @@ -99,11 +104,12 @@ rb_global_entry(id) } void -rb_define_variable(name, var, get_hook, set_hook) +rb_define_variable(name, var, get_hook, set_hook, data) char *name; VALUE *var; VALUE (*get_hook)(); VALUE (*set_hook)(); + void *data; { struct global_entry *entry; ID id; @@ -123,13 +129,15 @@ rb_define_variable(name, var, get_hook, set_hook) entry->v.var = var; entry->get_hook = get_hook; entry->set_hook = set_hook; + entry->data = data; } void -rb_define_varhook(name, get_hook, set_hook) +rb_define_varhook(name, get_hook, set_hook, data) char *name; VALUE (*get_hook)(); VALUE (*set_hook)(); + void *data; { struct global_entry *entry; ID id; @@ -154,6 +162,9 @@ rb_define_varhook(name, get_hook, set_hook) entry->v.val = Qnil; entry->get_hook = get_hook; entry->set_hook = set_hook; + if (data) { + entry->data = data; + } } VALUE @@ -183,7 +194,7 @@ rb_gvar_get(entry) VALUE val; if (entry->get_hook) - val = (*entry->get_hook)(entry->id); + val = (*entry->get_hook)(entry->id, entry->data); switch (entry->mode) { case GLOBAL_VAL: return entry->v.val; @@ -258,7 +269,7 @@ rb_gvar_set(entry, val) VALUE val; { if (entry->set_hook) - (*entry->set_hook)(val, entry->id); + (*entry->set_hook)(val, entry->id, entry->data); if (entry->mode == GLOBAL_VAR) { if (entry->v.var == Qnil) { -- cgit v1.2.3