diff options
author | Koichi Sasada <ko1@atdot.net> | 2019-11-09 09:59:32 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2019-11-09 10:04:04 +0900 |
commit | 21f7cca2c6394aaaec9189a7cb08a9ad8a2196e3 (patch) | |
tree | 3e87628d54d0c8dc792ad3a60071521ff86eeb6b /vm_insnhelper.c | |
parent | c5b4d2a2592942766dc2789f46105b91eba7026a (diff) | |
download | bundler-21f7cca2c6394aaaec9189a7cb08a9ad8a2196e3.tar.gz |
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.c | 5 |
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); */ |