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>
|
Mon Mar 9 06:43:21 2015 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
* vm_insnhelper.c (lep_svar_set): add WBs.
|
* vm_insnhelper.c (lep_svar_set): add WBs.
|
||||||
|
|
|
@ -141,7 +141,7 @@ rb_error_arity(int argc, int min, int max)
|
||||||
|
|
||||||
/* svar */
|
/* svar */
|
||||||
|
|
||||||
static inline NODE **
|
static inline struct SVAR **
|
||||||
lep_svar_place(rb_thread_t *th, const VALUE *lep)
|
lep_svar_place(rb_thread_t *th, const VALUE *lep)
|
||||||
{
|
{
|
||||||
const VALUE *svar;
|
const VALUE *svar;
|
||||||
|
@ -153,25 +153,25 @@ lep_svar_place(rb_thread_t *th, const VALUE *lep)
|
||||||
svar = &th->root_svar;
|
svar = &th->root_svar;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (NODE **)svar;
|
return (struct SVAR **)svar;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
lep_svar_get(rb_thread_t *th, const VALUE *lep, rb_num_t key)
|
lep_svar_get(rb_thread_t *th, const VALUE *lep, rb_num_t key)
|
||||||
{
|
{
|
||||||
NODE ** const svar_place = lep_svar_place(th, lep);
|
struct SVAR ** const svar_place = lep_svar_place(th, lep);
|
||||||
const NODE * const svar = *svar_place;
|
const struct SVAR *const svar = *svar_place;
|
||||||
|
|
||||||
if (NIL_P((VALUE)svar)) return Qnil;
|
if (NIL_P((VALUE)svar)) return Qnil;
|
||||||
if (nd_type(svar) == NODE_CREF) return Qnil;
|
if (nd_type(svar) == NODE_CREF) return Qnil;
|
||||||
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case VM_SVAR_LASTLINE:
|
case VM_SVAR_LASTLINE:
|
||||||
return svar->u1.value;
|
return svar->lastline;
|
||||||
case VM_SVAR_BACKREF:
|
case VM_SVAR_BACKREF:
|
||||||
return svar->u2.value;
|
return svar->backref;
|
||||||
default: {
|
default: {
|
||||||
const VALUE ary = svar->u3.value;
|
const VALUE ary = svar->others;
|
||||||
|
|
||||||
if (NIL_P(ary)) {
|
if (NIL_P(ary)) {
|
||||||
return Qnil;
|
return Qnil;
|
||||||
|
@ -186,31 +186,31 @@ lep_svar_get(rb_thread_t *th, const VALUE *lep, rb_num_t key)
|
||||||
static void
|
static void
|
||||||
lep_svar_set(rb_thread_t *th, VALUE *lep, rb_num_t key, VALUE val)
|
lep_svar_set(rb_thread_t *th, VALUE *lep, rb_num_t key, VALUE val)
|
||||||
{
|
{
|
||||||
NODE **svar_place = (NODE **)lep_svar_place(th, lep);
|
struct SVAR **svar_place = lep_svar_place(th, lep);
|
||||||
NODE *svar = *svar_place;
|
struct SVAR *svar = *svar_place;
|
||||||
|
|
||||||
if (NIL_P((VALUE)svar)) {
|
if (NIL_P((VALUE)svar)) {
|
||||||
svar = *svar_place = NEW_IF(Qnil, Qnil, Qnil);
|
svar = *svar_place = (struct SVAR *)NEW_IF(Qnil, Qnil, Qnil);
|
||||||
svar->nd_reserved = Qfalse;
|
svar->cref = NULL;
|
||||||
}
|
}
|
||||||
else if (nd_type(svar) == NODE_CREF) {
|
else if (nd_type(svar) == NODE_CREF) {
|
||||||
const rb_cref_t *cref = (rb_cref_t *)svar;
|
const rb_cref_t *cref = (rb_cref_t *)svar;
|
||||||
svar = *svar_place = NEW_IF(Qnil, Qnil, Qnil);
|
svar = *svar_place = (struct SVAR *)NEW_IF(Qnil, Qnil, Qnil);
|
||||||
RB_OBJ_WRITE(svar, &svar->nd_reserved, (VALUE)cref);
|
RB_OBJ_WRITE(svar, &svar->cref, (VALUE)cref);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case VM_SVAR_LASTLINE:
|
case VM_SVAR_LASTLINE:
|
||||||
RB_OBJ_WRITE(svar, &svar->u1.value, val);
|
RB_OBJ_WRITE(svar, &svar->lastline, val);
|
||||||
return;
|
return;
|
||||||
case VM_SVAR_BACKREF:
|
case VM_SVAR_BACKREF:
|
||||||
RB_OBJ_WRITE(svar, &svar->u2.value, val);
|
RB_OBJ_WRITE(svar, &svar->backref, val);
|
||||||
return;
|
return;
|
||||||
default: {
|
default: {
|
||||||
VALUE ary = svar->u3.value;
|
VALUE ary = svar->others;
|
||||||
|
|
||||||
if (NIL_P(ary)) {
|
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);
|
rb_ary_store(ary, key - VM_SVAR_EXTRA_START, val);
|
||||||
}
|
}
|
||||||
|
@ -265,7 +265,7 @@ ep_cref(const VALUE *ep)
|
||||||
return (rb_cref_t *)svar;
|
return (rb_cref_t *)svar;
|
||||||
}
|
}
|
||||||
else {
|
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,
|
static VALUE make_no_method_exception(VALUE exc, const char *format,
|
||||||
VALUE obj, int argc, const VALUE *argv);
|
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 */
|
#endif /* RUBY_INSNHELPER_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue