summaryrefslogtreecommitdiff
path: root/insnhelper.ci
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-07-10 08:04:52 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-07-10 08:04:52 +0000
commita6e3d19f3ac344613da68dff705fb411d9120d63 (patch)
tree7f16e466dd79c5750c740d3aac7a4704b924885e /insnhelper.ci
parentd4662d49d925484f673969693f47cd4ac4338206 (diff)
* 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.ci85
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);
}
}
}