1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* vm_insnhelper.h: define struct SVAR for SVAR.

This data type is also same layout of NODE (NODE_IF).
* vm_insnhelper.c: catch up this change.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49899 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2015-03-08 21:53:05 +00:00
parent 2262aba6a2
commit 5856347f16
3 changed files with 34 additions and 18 deletions

View file

@ -1,3 +1,10 @@
Mon Mar 09 06:44:48 2015 Koichi Sasada <ko1@atdot.net>
* vm_insnhelper.h: define struct SVAR for SVAR.
This data type is also same layout of NODE (NODE_IF).
* vm_insnhelper.c: catch up this change.
Mon Mar 9 06:43:21 2015 Koichi Sasada <ko1@atdot.net>
* vm_insnhelper.c (lep_svar_set): add WBs.

View file

@ -141,7 +141,7 @@ rb_error_arity(int argc, int min, int max)
/* svar */
static inline NODE **
static inline struct SVAR **
lep_svar_place(rb_thread_t *th, const VALUE *lep)
{
const VALUE *svar;
@ -153,25 +153,25 @@ lep_svar_place(rb_thread_t *th, const VALUE *lep)
svar = &th->root_svar;
}
return (NODE **)svar;
return (struct SVAR **)svar;
}
static VALUE
lep_svar_get(rb_thread_t *th, const VALUE *lep, rb_num_t key)
{
NODE ** const svar_place = lep_svar_place(th, lep);
const NODE * const svar = *svar_place;
struct SVAR ** const svar_place = lep_svar_place(th, lep);
const struct SVAR *const svar = *svar_place;
if (NIL_P((VALUE)svar)) return Qnil;
if (nd_type(svar) == NODE_CREF) return Qnil;
switch (key) {
case VM_SVAR_LASTLINE:
return svar->u1.value;
return svar->lastline;
case VM_SVAR_BACKREF:
return svar->u2.value;
return svar->backref;
default: {
const VALUE ary = svar->u3.value;
const VALUE ary = svar->others;
if (NIL_P(ary)) {
return Qnil;
@ -186,31 +186,31 @@ lep_svar_get(rb_thread_t *th, const VALUE *lep, rb_num_t key)
static void
lep_svar_set(rb_thread_t *th, VALUE *lep, rb_num_t key, VALUE val)
{
NODE **svar_place = (NODE **)lep_svar_place(th, lep);
NODE *svar = *svar_place;
struct SVAR **svar_place = lep_svar_place(th, lep);
struct SVAR *svar = *svar_place;
if (NIL_P((VALUE)svar)) {
svar = *svar_place = NEW_IF(Qnil, Qnil, Qnil);
svar->nd_reserved = Qfalse;
svar = *svar_place = (struct SVAR *)NEW_IF(Qnil, Qnil, Qnil);
svar->cref = NULL;
}
else if (nd_type(svar) == NODE_CREF) {
const rb_cref_t *cref = (rb_cref_t *)svar;
svar = *svar_place = NEW_IF(Qnil, Qnil, Qnil);
RB_OBJ_WRITE(svar, &svar->nd_reserved, (VALUE)cref);
svar = *svar_place = (struct SVAR *)NEW_IF(Qnil, Qnil, Qnil);
RB_OBJ_WRITE(svar, &svar->cref, (VALUE)cref);
}
switch (key) {
case VM_SVAR_LASTLINE:
RB_OBJ_WRITE(svar, &svar->u1.value, val);
RB_OBJ_WRITE(svar, &svar->lastline, val);
return;
case VM_SVAR_BACKREF:
RB_OBJ_WRITE(svar, &svar->u2.value, val);
RB_OBJ_WRITE(svar, &svar->backref, val);
return;
default: {
VALUE ary = svar->u3.value;
VALUE ary = svar->others;
if (NIL_P(ary)) {
RB_OBJ_WRITE(svar, &svar->u3.value, ary = rb_ary_new());
RB_OBJ_WRITE(svar, &svar->others, ary = rb_ary_new());
}
rb_ary_store(ary, key - VM_SVAR_EXTRA_START, val);
}
@ -265,7 +265,7 @@ ep_cref(const VALUE *ep)
return (rb_cref_t *)svar;
}
else {
return (rb_cref_t *)((NODE *)svar)->nd_reserved;
return (rb_cref_t *)((struct SVAR *)svar)->cref;
}
}

View file

@ -229,5 +229,14 @@ enum vm_regan_acttype {
static VALUE make_no_method_exception(VALUE exc, const char *format,
VALUE obj, int argc, const VALUE *argv);
/* SVAR */
struct SVAR {
VALUE flags;
const rb_cref_t *cref;
VALUE lastline;
VALUE backref;
VALUE others;
};
#endif /* RUBY_INSNHELPER_H */