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:
parent
2262aba6a2
commit
5856347f16
3 changed files with 34 additions and 18 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue