From 8b080a53cd7e97087f20f9b1c968d2a0ef5c3ee3 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 17 Feb 2026 13:58:30 +0900 Subject: [PATCH] mruby-compiler: extract gen_pat_key() helper for hash pattern codegen Reduce code duplication by extracting the key-loading pattern (NODE_SYM check + OP_LOADSYM/codegen) into gen_pat_key() helper. The pattern appeared 4 times in NODE_PAT_HASH codegen. Co-authored-by: Claude --- mrbgems/mruby-compiler/core/codegen.c | 42 ++++++++++----------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 09ab8e724..823321c64 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -4451,6 +4451,18 @@ codegen_case_match(codegen_scope *s, node *varnode, int val) * fail_pos: linked list of jump positions for pattern match failure * known_array_len: -1 if unknown, >= 0 if target is known to be an array of that length */ +/* generate code to load a hash pattern key onto the stack */ +static void +gen_pat_key(codegen_scope *s, node *key) +{ + if (node_type(key) == NODE_SYM) { + genop_2(s, OP_LOADSYM, cursp(), sym_idx(s, sym_node(key)->symbol)); + } + else { + codegen(s, key, VAL); + } +} + static void codegen_pattern(codegen_scope *s, node *pattern, int target, uint32_t *fail_pos, int known_array_len) { @@ -4952,13 +4964,7 @@ codegen_pattern(codegen_scope *s, node *pattern, int target, uint32_t *fail_pos, /* Partial match: pass keys array */ int i = 0; for (pair = pat_hash->pairs; pair; pair = pair->cdr, i++) { - node *key = pair->car->car; - if (node_type(key) == NODE_SYM) { - genop_2(s, OP_LOADSYM, cursp(), sym_idx(s, sym_node(key)->symbol)); - } - else { - codegen(s, key, VAL); - } + gen_pat_key(s, pair->car->car); push(); } genop_2(s, OP_ARRAY, cursp() - num_keys, num_keys); @@ -4979,12 +4985,7 @@ codegen_pattern(codegen_scope *s, node *pattern, int target, uint32_t *fail_pos, /* Check key existence: hash.key?(key) */ gen_move(s, cursp(), hash_reg, 0); push(); - if (node_type(key) == NODE_SYM) { - genop_2(s, OP_LOADSYM, cursp(), sym_idx(s, sym_node(key)->symbol)); - } - else { - codegen(s, key, VAL); - } + gen_pat_key(s, key); push(); push(); pop(); pop(); pop(); genop_3(s, OP_SEND, cursp(), sym_idx(s, MRB_SYM_Q_2(s->mrb, key)), 1); tmp = genjmp2(s, OP_JMPNOT, cursp(), *fail_pos, 1); @@ -4993,12 +4994,7 @@ codegen_pattern(codegen_scope *s, node *pattern, int target, uint32_t *fail_pos, /* Get value: hash[key] */ gen_move(s, cursp(), hash_reg, 0); push(); - if (node_type(key) == NODE_SYM) { - genop_2(s, OP_LOADSYM, cursp(), sym_idx(s, sym_node(key)->symbol)); - } - else { - codegen(s, key, VAL); - } + gen_pat_key(s, key); push(); push(); pop(); pop(); pop(); genop_3(s, OP_SEND, cursp(), sym_idx(s, MRB_OPSYM_2(s->mrb, aref)), 1); push(); @@ -5031,13 +5027,7 @@ codegen_pattern(codegen_scope *s, node *pattern, int target, uint32_t *fail_pos, if (num_keys > 0) { int i = 0; for (pair = pat_hash->pairs; pair; pair = pair->cdr, i++) { - node *key = pair->car->car; - if (node_type(key) == NODE_SYM) { - genop_2(s, OP_LOADSYM, cursp(), sym_idx(s, sym_node(key)->symbol)); - } - else { - codegen(s, key, VAL); - } + gen_pat_key(s, pair->car->car); push(); } genop_2(s, OP_ARRAY, recv + 1, num_keys);