summaryrefslogtreecommitdiff
path: root/vm_insnhelper.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-12-16 14:13:32 +0900
committerKoichi Sasada <ko1@atdot.net>2020-12-16 14:20:20 +0900
commit98dca855736c9fb8d4edef8b33a5df1cfe67ebb7 (patch)
tree72563e21405e0ba9bf819b20af4b913678fdfce9 /vm_insnhelper.c
parent1bafb3cb47649037cc93fec97503c18a864e3983 (diff)
tuning vm_setivar_slowpath() more.
specify inline/noinline code for is_attr condition.
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r--vm_insnhelper.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 3b56353102..e8c9719155 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1190,8 +1190,9 @@ vm_getivar(VALUE obj, ID id, const rb_iseq_t *iseq, IVC ic, const struct rb_call
}
}
-
-NOINLINE(static VALUE vm_setivar_slowpath(VALUE obj, ID id, VALUE val, const rb_iseq_t *iseq, IVC ic, const struct rb_callcache *cc, int is_attr));
+ALWAYS_INLINE(static VALUE vm_setivar_slowpath(VALUE obj, ID id, VALUE val, const rb_iseq_t *iseq, IVC ic, const struct rb_callcache *cc, int is_attr));
+NOINLINE(static VALUE vm_setivar_slowpath_ivar(VALUE obj, ID id, VALUE val, const rb_iseq_t *iseq, IVC ic));
+NOINLINE(static VALUE vm_setivar_slowpath_attr(VALUE obj, ID id, VALUE val, const struct rb_callcache *cc));
static VALUE
vm_setivar_slowpath(VALUE obj, ID id, VALUE val, const rb_iseq_t *iseq, IVC ic, const struct rb_callcache *cc, int is_attr)
@@ -1232,6 +1233,18 @@ vm_setivar_slowpath(VALUE obj, ID id, VALUE val, const rb_iseq_t *iseq, IVC ic,
return rb_ivar_set(obj, id, val);
}
+static VALUE
+vm_setivar_slowpath_ivar(VALUE obj, ID id, VALUE val, const rb_iseq_t *iseq, IVC ic)
+{
+ return vm_setivar_slowpath(obj, id, val, iseq, ic, NULL, false);
+}
+
+static VALUE
+vm_setivar_slowpath_attr(VALUE obj, ID id, VALUE val, const struct rb_callcache *cc)
+{
+ return vm_setivar_slowpath(obj, id, val, NULL, NULL, cc, true);
+}
+
static inline VALUE
vm_setivar(VALUE obj, ID id, VALUE val, const rb_iseq_t *iseq, IVC ic, const struct rb_callcache *cc, int is_attr)
{
@@ -1259,7 +1272,12 @@ vm_setivar(VALUE obj, ID id, VALUE val, const rb_iseq_t *iseq, IVC ic, const str
RB_DEBUG_COUNTER_INC(ivar_set_ic_miss_noobject);
}
#endif /* OPT_IC_FOR_IVAR */
- return vm_setivar_slowpath(obj, id, val, iseq, ic, cc, is_attr);
+ if (is_attr) {
+ return vm_setivar_slowpath_attr(obj, id, val, cc);
+ }
+ else {
+ return vm_setivar_slowpath_ivar(obj, id, val, iseq, ic);
+ }
}
static inline VALUE