From e12d4c654e3cb7a4473014610bc3bae41aaf811e Mon Sep 17 00:00:00 2001 From: Luke Gruber Date: Sat, 30 Dec 2023 13:26:59 -0500 Subject: Don't create T_MATCH object if /regexp/.match(string) doesn't match Fixes [Bug #20104] --- re.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 're.c') diff --git a/re.c b/re.c index cb8cc865b2..bf4dc5ccbf 100644 --- a/re.c +++ b/re.c @@ -1747,15 +1747,18 @@ rb_reg_search_set_match(VALUE re, VALUE str, long pos, int reverse, int set_back .range = reverse ? 0 : len, }; - VALUE match = match_alloc(rb_cMatch); - struct re_registers *regs = RMATCH_REGS(match); + struct re_registers regs = {0}; - OnigPosition result = rb_reg_onig_match(re, str, reg_onig_search, &args, regs); + OnigPosition result = rb_reg_onig_match(re, str, reg_onig_search, &args, ®s); if (result == ONIG_MISMATCH) { rb_backref_set(Qnil); return ONIG_MISMATCH; } + VALUE match = match_alloc(rb_cMatch); + rb_matchext_t *rm = RMATCH_EXT(match); + rm->regs = regs; + if (set_backref_str) { RB_OBJ_WRITE(match, &RMATCH(match)->str, rb_str_new4(str)); } -- cgit v1.2.3