diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-07-10 08:04:52 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-07-10 08:04:52 +0000 |
commit | a6e3d19f3ac344613da68dff705fb411d9120d63 (patch) | |
tree | 7f16e466dd79c5750c740d3aac7a4704b924885e /insnhelper.ci | |
parent | d4662d49d925484f673969693f47cd4ac4338206 (diff) | |
download | ruby-a6e3d19f3ac344613da68dff705fb411d9120d63.tar.gz |
* vm.c, insnhelper.ci: fix svar interface.
* compile.c (iseq_compile_each), yarvcore.h: fix to use new
svar interface for flip flop.
* eval.c: ditto.
* insns.def: ditto.
* include/ruby/intern.h: remove "rb_svar()" declaration.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12731 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'insnhelper.ci')
-rw-r--r-- | insnhelper.ci | 85 |
1 files changed, 59 insertions, 26 deletions
diff --git a/insnhelper.ci b/insnhelper.ci index 2fe540d1cb..2b33e6b1d6 100644 --- a/insnhelper.ci +++ b/insnhelper.ci @@ -747,42 +747,75 @@ new_value(void) return val; } -static VALUE * -lfp_svar(VALUE *lfp, int cnt) +static struct RValues * +lfp_svar_place(rb_thread_t *th, VALUE *lfp) { - struct RValues *val; - rb_thread_t *th = GET_THREAD(); + struct RValues *svar; if (th->local_lfp != lfp) { - val = (struct RValues *)lfp[-1]; - if ((VALUE)val == Qnil) { - val = new_value(); - lfp[-1] = (VALUE)val; + svar = (struct RValues *)lfp[-1]; + if ((VALUE)svar == Qnil) { + svar = new_value(); + lfp[-1] = (VALUE)svar; } } else { - val = (struct RValues *)th->local_svar; - if ((VALUE)val == Qnil) { - val = new_value(); - th->local_svar = (VALUE)val; + svar = (struct RValues *)th->local_svar; + if ((VALUE)svar == Qnil) { + svar = new_value(); + th->local_svar = (VALUE)svar; } } - switch (cnt) { - case -1: - return &val->basic.klass; + return svar; +} + +static VALUE +lfp_svar_get(rb_thread_t *th, VALUE *lfp, VALUE key) +{ + struct RValues *svar = lfp_svar_place(th, lfp); + + switch (key) { + case (VALUE)-1: + return svar->basic.klass; case 0: - return &val->v1; + return svar->v1; case 1: - return &val->v2; - default:{ - VALUE ary; - if ((ary = val->v3) == Qnil) { - ary = val->v3 = rb_ary_new(); - } - if (RARRAY_LEN(ary) <= cnt) { - rb_ary_store(ary, cnt, Qnil); - } - return &RARRAY_PTR(ary)[cnt]; + return svar->v2; + default: { + VALUE hash = svar->v3; + + if (hash == Qnil) { + return Qnil; + } + else { + return rb_hash_aref(hash, key); + } + } + } +} + +static void +lfp_svar_set(rb_thread_t *th, VALUE *lfp, VALUE key, VALUE val) +{ + struct RValues *svar = lfp_svar_place(th, lfp); + + switch (key) { + case (VALUE)-1: + svar->basic.klass = val; + return; + case 0: + svar->v1 = val; + return; + case 1: + svar->v2 = val; + return; + default: { + VALUE hash = svar->v3; + + if (hash == Qnil) { + svar->v3 = hash = rb_hash_new(); + } + rb_hash_aset(hash, key, val); } } } |