summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-11-19 15:35:59 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-11-19 15:35:59 +0900
commitc308a149f0eaa529d5b3236e696aed13a19733ae (patch)
tree85f0ab27b94f511f652bf59dd96158dcd2047fc6 /src/vm.c
parent423f872c846d63056ba75f067201ba9c221231d1 (diff)
downloadmruby-c308a149f0eaa529d5b3236e696aed13a19733ae.tar.gz
mruby-c308a149f0eaa529d5b3236e696aed13a19733ae.zip
Add Hash type check for `OP_KARG` and `OP_KEY_P`; ref #4166
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/vm.c b/src/vm.c
index 2d12df4ba..6bb9a48a5 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1892,7 +1892,7 @@ RETRY_TRY_BLOCK:
mrb_value k = mrb_symbol_value(syms[b]);
mrb_value kdict = regs[mrb->c->ci->argc];
- if (!mrb_hash_key_p(mrb, kdict, k)) {
+ if (!mrb_hash_p(kdict) || !mrb_hash_key_p(mrb, kdict, k)) {
mrb_value str = mrb_format(mrb, "missing keyword: %S", k);
mrb_exc_set(mrb, mrb_exc_new_str(mrb, E_ARGUMENT_ERROR, str));
goto L_RAISE;
@@ -1905,8 +1905,11 @@ RETRY_TRY_BLOCK:
CASE(OP_KEY_P, BB) {
mrb_value k = mrb_symbol_value(syms[b]);
mrb_value kdict = regs[mrb->c->ci->argc];
- mrb_bool key_p = mrb_hash_key_p(mrb, kdict, k);
+ mrb_bool key_p = FALSE;
+ if (mrb_hash_p(kdict)) {
+ key_p = mrb_hash_key_p(mrb, kdict, k);
+ }
regs[a] = mrb_bool_value(key_p);
NEXT;
}