From c28ee91263818d19d49fe0ce280b7ec557010daa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Wed, 31 Jan 2024 15:42:22 +0100 Subject: [PATCH] [PRISM] Fix incorrect use of VM_CALL_KW_SPLAT_MUT in zsuper with keyword splat This copies the changes from 771a2f039b9a059a73e8f111d1d46590fa697f63. Fixes ruby/prism#2310. --- prism_compile.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index b0265d671a..f5648381bb 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -4983,14 +4983,11 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, if (local_body->param.flags.has_kwrest) { int idx = local_body->local_table_size - local_keyword->rest_start; ADD_GETLOCAL(args, &dummy_line_node, idx, depth); - if (local_keyword->num > 0) { - ADD_SEND(args, &dummy_line_node, rb_intern("dup"), INT2FIX(0)); - flag |= VM_CALL_KW_SPLAT_MUT; - } + RUBY_ASSERT(local_keyword->num > 0); + ADD_SEND(args, &dummy_line_node, rb_intern("dup"), INT2FIX(0)); } else { ADD_INSN1(args, &dummy_line_node, newhash, INT2FIX(0)); - flag |= VM_CALL_KW_SPLAT_MUT; } int i = 0; for (; i < local_keyword->num; ++i) { @@ -5000,13 +4997,13 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, ADD_GETLOCAL(args, &dummy_line_node, idx, depth); } ADD_SEND(args, &dummy_line_node, id_core_hash_merge_ptr, INT2FIX(i * 2 + 1)); - flag |= VM_CALL_KW_SPLAT; + flag |= VM_CALL_KW_SPLAT| VM_CALL_KW_SPLAT_MUT; } else if (local_body->param.flags.has_kwrest) { int idx = local_body->local_table_size - local_keyword->rest_start; ADD_GETLOCAL(args, &dummy_line_node, idx, depth); argc++; - flag |= VM_CALL_KW_SPLAT | VM_CALL_KW_SPLAT_MUT; + flag |= VM_CALL_KW_SPLAT; } ADD_SEQ(ret, args);