summaryrefslogtreecommitdiff
path: root/vm_insnhelper.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2019-11-09 09:59:32 +0900
committerKoichi Sasada <ko1@atdot.net>2019-11-09 10:04:04 +0900
commit21f7cca2c6394aaaec9189a7cb08a9ad8a2196e3 (patch)
tree3e87628d54d0c8dc792ad3a60071521ff86eeb6b /vm_insnhelper.c
parentc5b4d2a2592942766dc2789f46105b91eba7026a (diff)
initialize kw special local var.
A method which has keyword parameters has an implicit local variable to specify which keywords are (un)specified. vm_call_iseq_setup_kwparm_nokwarg() is special function to invoke a ISeq method without any keyword arguments. However, it should also initialize the special local var. Without this initialization, the implicit lvar can points a freed (T_NONE) object.
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r--vm_insnhelper.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 890cbf6659..8378fc37b9 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -2073,9 +2073,12 @@ vm_call_iseq_setup_kwparm_nokwarg(rb_execution_context_t *ec, rb_control_frame_t
VALUE * const argv = cfp->sp - calling->argc;
VALUE * const klocals = argv + kw_param->bits_start - kw_param->num;
- for (int i=0; i<kw_param->num; i++) {
+ int i;
+ for (i=0; i<kw_param->num; i++) {
klocals[i] = kw_param->default_values[i];
}
+ klocals[i] = INT2FIX(0); // kw specify flag
+
/* NOTE: don't need to setup (clear) unspecified bits
because no code check it.
klocals[kw_param->num] = INT2FIX(0); */