diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c index f7888e2cf1fb39..9f24287e35f01d 100644 --- a/ext/strscan/strscan.c +++ b/ext/strscan/strscan.c @@ -1502,7 +1502,9 @@ strscan_named_captures(VALUE self) named_captures_data data; data.self = self; data.captures = rb_hash_new(); - onig_foreach_name(RREGEXP_PTR(p->regex), named_captures_iter, &data); + if (!RB_NIL_P(p->regex)) { + onig_foreach_name(RREGEXP_PTR(p->regex), named_captures_iter, &data); + } return data.captures; } diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb index b7ffac816d2e31..2fce4c3e748cf9 100644 --- a/test/strscan/test_stringscanner.rb +++ b/test/strscan/test_stringscanner.rb @@ -775,6 +775,7 @@ def test_scan_aref_repeatedly def test_named_captures omit("not implemented on TruffleRuby") if ["truffleruby"].include?(RUBY_ENGINE) scan = StringScanner.new("foobarbaz") + assert_equal({}, scan.named_captures) assert_equal(9, scan.match?(/(?foo)(?bar)(?baz)/)) assert_equal({"f" => "foo", "r" => "bar", "z" => "baz"}, scan.named_captures) end