diff options
Diffstat (limited to 'compile.c')
-rw-r--r-- | compile.c | 27 |
1 files changed, 15 insertions, 12 deletions
@@ -2455,23 +2455,26 @@ compile_array_(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE* node_root, APPEND_LIST(ret, anchor); break; case COMPILE_ARRAY_TYPE_HASH: - if (first) { - first = 0; - ADD_INSN1(anchor, line, newhash, INT2FIX(i)); - APPEND_LIST(ret, anchor); - } - else if (i > 0) { - ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - ADD_INSN(ret, line, swap); - APPEND_LIST(ret, anchor); - ADD_SEND(ret, line, ID2SYM(id_core_hash_merge_ptr), INT2FIX(i + 1)); + if (i > 0) { + if (first) { + ADD_INSN1(anchor, line, newhash, INT2FIX(i)); + APPEND_LIST(ret, anchor); + } + else { + ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + ADD_INSN(ret, line, swap); + APPEND_LIST(ret, anchor); + ADD_SEND(ret, line, ID2SYM(id_core_hash_merge_ptr), INT2FIX(i + 1)); + } } if (kw) { + VALUE nhash = (i > 0 || !first) ? INT2FIX(2) : INT2FIX(1); ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - ADD_INSN(ret, line, swap); + if (i > 0 || !first) ADD_INSN(ret, line, swap); COMPILE(ret, "keyword splat", kw); - ADD_SEND(ret, line, ID2SYM(id_core_hash_merge_kwd), INT2FIX(2)); + ADD_SEND(ret, line, ID2SYM(id_core_hash_merge_kwd), nhash); } + first = 0; break; case COMPILE_ARRAY_TYPE_ARGS: APPEND_LIST(ret, anchor); |