summaryrefslogtreecommitdiff
path: root/variable.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <matz@ruby-lang.org>1995-01-10 00:58:20 +0900
committerTakashi Kokubun <takashikkbn@gmail.com>2019-08-17 22:09:31 +0900
commit5d828b25d4ae30a000c054a724ac248dadbb97b3 (patch)
tree080fc6e3b41b9c59cf5def77ae619a82e7e252db /variable.c
parentbd0c733b77b561f4d12daccebf06a7c71917000b (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.c75
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;
-
-}