diff options
author | Yukihiro Matsumoto <matz@ruby-lang.org> | 1995-01-10 00:58:20 +0900 |
---|---|---|
committer | Takashi Kokubun <takashikkbn@gmail.com> | 2019-08-17 22:09:31 +0900 |
commit | 5d828b25d4ae30a000c054a724ac248dadbb97b3 (patch) | |
tree | 080fc6e3b41b9c59cf5def77ae619a82e7e252db /variable.c | |
parent | bd0c733b77b561f4d12daccebf06a7c71917000b (diff) |
version 0.64v0_64
https://cache.ruby-lang.org/pub/ruby/1.0/ruby-0.64.tar.gz
Tue Jan 10 00:58:20 1995 Yukihiro Matsumoto (matz@dyna)
* eval.c: レシーバと引数は常にiterではない.
* cons.c(aref,aset): negative offset対応.
Mon Jan 9 14:40:39 1995 Yukihiro Matsumoto (matz@ix-02)
* parse.y: foo{..}の形式において,fooをローカル変数やクラス名では
なく,引数なしの関数型メソッド呼び出しとみなすようにした.
* list.c -> cons.c: 名称変更(クラス名も).
* list.c: a::b::c::nilをリスト(a b c)とみなすlisp形式から,a::b::c
をリスト(a b c)とみなすruby形式に変更.[], []=, eachもそれに会わ
せた仕様とする.
* list.c: consペアとしての機能を強調.仕様変更.
Sat Jan 7 01:26:26 1995 Yukihiro Matsumoto (matz@dyna)
* eval.c: 自己代入の不具合修正.
* eval.c(masign): 多重代入が配列もリストもとれるようにした.
* list.c: assocを2要素の配列からList(CONSペア)に変更した.
Fri Jan 6 13:42:12 1995 Yukihiro Matsumoto (matz@ix-02)
* parse.y: a[b]+=cやa.b+=cなどの自己代入形式で,aやbを2度評価しな
くなった.
* eval.c: iterator設定のバグフィックス.
* list.c: Listクラスを新設.
Thu Jan 5 13:55:00 1995 Yukihiro Matsumoto (matz@ix-02)
* parse.y: SCOPEのメモリリークをなくした.
* eval.c: built-inメソッドへの引数の引き渡し方を変更して,配列の生
成数を減らした.
* re.c: match-dataを毎回生成することをやめた.`$~'をアクセスした時
にon-demandで生成する.
* string.c etc: 不必要なmemmoveをmemcpyに置換.
* parse.y: =~, !~は副作用があるのでコンパイル時に展開できない.
Tue Jan 3 02:04:36 1995 Yukihiro Matsumoto (matz@dyna)
* eval.c: rest引数のbug fix.
* eval.c,gc.c: scopeをオブジェクトにした.
* eval.c: envとscopeの扱いを変更した.
Wed Dec 28 09:46:57 1994 Yukihiro Matsumoto (matz@ix-02)
* parse.y: evalでローカル変数が追加された場合に対応した.
* parse.y: 演算子を含むaliasのbug fix.
Tue Dec 27 16:45:20 1994 Yukihiro Matsumoto (matz@ix-02)
* parse.y: def A Bをalias A Bに変更.
* eval.c: alias関係のbug修正.nodeをオブジェクト化した時にenbugし
たようだ.
* signal.c: システムコールの再定義を止めた.
* io.c(select): write/exceptのフラグ設定にバグ.
* Makefile.in: static link用オプションをMake変数として独立させた.
Diffstat (limited to 'variable.c')
-rw-r--r-- | variable.c | 75 |
1 files changed, 12 insertions, 63 deletions
diff --git a/variable.c b/variable.c index af8ae603f8..88a306841f 100644 --- a/variable.c +++ b/variable.c @@ -3,7 +3,7 @@ variable.c - $Author: matz $ - $Date: 1994/12/20 05:07:14 $ + $Date: 1995/01/10 10:43:03 $ created at: Tue Apr 19 23:55:15 JST 1994 ************************************************/ @@ -47,7 +47,7 @@ rb_name_class(class, id) } struct global_entry { - enum { GLOBAL_VAL, GLOBAL_VAR, GLOBAL_SYSVAR, GLOBAL_UNDEF } mode; + enum { GLOBAL_VAL, GLOBAL_VAR, GLOBAL_UNDEF } mode; ID id; union { VALUE val; @@ -68,7 +68,6 @@ mark_global_entry(key, entry) gc_mark(entry->v.val); /* normal global value */ break; case GLOBAL_VAR: - case GLOBAL_SYSVAR: if (entry->v.var) gc_mark(*entry->v.var); /* c variable pointer */ break; @@ -117,14 +116,14 @@ rb_define_variable(name, var, get_hook, set_hook, data) if (name[0] == '$') id = rb_intern(name); else { - char *buf = (char*)alloca(strlen(name)+2); + char *buf = ALLOCA_N(char, strlen(name)+2); buf[0] = '$'; strcpy(buf+1, name); id = rb_intern(buf); } entry = rb_global_entry(id); - entry->mode = GLOBAL_SYSVAR; + entry->mode = GLOBAL_VAR; entry->v.var = var; entry->get_hook = get_hook; entry->set_hook = set_hook; @@ -143,7 +142,7 @@ rb_define_varhook(name, get_hook, set_hook, data) if (name[0] == '$') id = rb_intern(name); else { - char *buf = (char*)alloca(strlen(name)+2); + char *buf = ALLOCA_N(char, strlen(name)+2); buf[0] = '$'; strcpy(buf+1, name); id = rb_intern(buf); @@ -199,7 +198,6 @@ rb_gvar_get(entry) return entry->v.val; case GLOBAL_VAR: - case GLOBAL_SYSVAR: if (entry->v.var == Qnil) return val; return *entry->v.var; @@ -271,17 +269,18 @@ rb_gvar_set(entry, val) if (entry->set_hook) (*entry->set_hook)(val, entry->id, entry->data); - if (entry->mode == GLOBAL_VAR || entry->mode == GLOBAL_SYSVAR) { - if (entry->v.var == Qnil) { - rb_readonly_hook(val, entry->id); + if (entry->mode == GLOBAL_VAR) { + if (entry->v.var) { + *entry->v.var = val; } - return *entry->v.var = val; } else { - if (entry->mode == GLOBAL_UNDEF) + if (entry->mode == GLOBAL_UNDEF) { entry->mode = GLOBAL_VAL; - return entry->v.val = val; + } + entry->v.val = val; } + return val; } VALUE @@ -378,53 +377,3 @@ rb_iv_set(obj, name, val) return rb_ivar_set_1(obj, id, val); } - -VALUE -Fdefined(obj, name) - VALUE obj; - struct RString *name; -{ - ID id; - struct global_entry *entry; - - if (FIXNUM_P(name)) { - id = FIX2INT(name); - } - else { - Check_Type(name, T_STRING); - id = rb_intern(name->ptr); - } - - if (id == rb_intern("nil") || id == rb_intern("self")) return TRUE; - - switch (id & ID_SCOPE_MASK) { - case ID_GLOBAL: - if (st_lookup(global_tbl, id, &entry) && entry->mode != GLOBAL_UNDEF) - return TRUE; - break; - - case ID_INSTANCE: - if (TYPE(Qself) != T_OBJECT || instance_tbl == Qnil) break; - if (st_lookup(instance_tbl, id, Qnil)) return TRUE; - break; - - case ID_CONST: - return const_bound(CLASS_OF(Qself), id); - break; - - default: - { - int i, max; - - if (the_scope->local_tbl) { - for (i=1, max=the_scope->local_tbl[0]+1; i<max; i++) { - if (the_scope->local_tbl[i] == id) return TRUE; - } - } - } - if (st_lookup(class_tbl, id, Qnil)) return TRUE; - break; - } - return FALSE; - -} |