From f07face4e5d24c17984ca7254e1f8fb2dcd6ff87 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Mon, 6 Mar 2023 12:18:50 -0800 Subject: [PATCH] Fix crash when no scanning has been done `StringScanner.new("foo").named_captures` will crash because no regular expression has been set. This commit returns an empty hash if no re is set on the string scanner --- ext/strscan/strscan.c | 4 ++++ test/strscan/test_stringscanner.rb | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c index f7888e2cf1..da434ae5c1 100644 --- a/ext/strscan/strscan.c +++ b/ext/strscan/strscan.c @@ -1502,6 +1502,10 @@ strscan_named_captures(VALUE self) named_captures_data data; data.self = self; data.captures = rb_hash_new(); + if (NIL_P(p->regex)) { + return data.captures; + } + 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 b7ffac816d..a2693dd34a 100644 --- a/test/strscan/test_stringscanner.rb +++ b/test/strscan/test_stringscanner.rb @@ -778,6 +778,12 @@ def test_named_captures assert_equal(9, scan.match?(/(?foo)(?bar)(?baz)/)) assert_equal({"f" => "foo", "r" => "bar", "z" => "baz"}, scan.named_captures) end + + def test_named_captures_no_match + omit("not implemented on TruffleRuby") if ["truffleruby"].include?(RUBY_ENGINE) + scan = StringScanner.new("foobarbaz") + assert_equal({}, scan.named_captures) + end end class TestStringScanner < Test::Unit::TestCase