From fdc2113ac0303dd50e901ad9435b3f1082f1e9e8 Mon Sep 17 00:00:00 2001 From: NAITOH Jun Date: Mon, 8 Jan 2024 14:52:50 +0900 Subject: [PATCH] fix captures nil case fix https://github.com/ruby/strscan/issues/70 --- .../jruby/ext/strscan/RubyStringScanner.java | 7 ++++++- ext/strscan/strscan.c | 18 +++++++++++------- test/strscan/test_stringscanner.rb | 4 ++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java b/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java index 0b4d6338ff..89e7e09a05 100644 --- a/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java +++ b/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java @@ -901,9 +901,14 @@ public IRubyObject captures(ThreadContext context) { newAry = RubyArray.newArray(runtime, numRegs); for (i = 1; i < numRegs; i++) { - IRubyObject str = extractRange(runtime, + IRubyObject str; + if (REGION_ADAPTER.getBeg(regs, i) == -1) { + str = context.nil; + } else { + str = extractRange(runtime, adjustRegisterPosition(REGION_ADAPTER.getBeg(regs, i)), adjustRegisterPosition(REGION_ADAPTER.getEnd(regs, i))); + } newAry.push(str); } diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c index a2bf56ce4f..7dbd971ae9 100644 --- a/ext/strscan/strscan.c +++ b/ext/strscan/strscan.c @@ -1243,10 +1243,10 @@ strscan_size(VALUE self) * If nothing was priorly matched, it returns nil. * * s = StringScanner.new("Fri Dec 12 1975 14:39") - * s.scan(/(\w+) (\w+) (\d+) /) # -> "Fri Dec 12 " - * s.captures # -> ["Fri", "Dec", "12"] - * s.scan(/(\w+) (\w+) (\d+) /) # -> nil - * s.captures # -> nil + * s.scan(/(\w+) (\w+) (\d+) (1980)?/) # -> "Fri Dec 12 " + * s.captures # -> ["Fri", "Dec", "12", nil] + * s.scan(/(\w+) (\w+) (\d+) (1980)?/) # -> nil + * s.captures # -> nil */ static VALUE strscan_captures(VALUE self) @@ -1262,9 +1262,13 @@ strscan_captures(VALUE self) new_ary = rb_ary_new2(num_regs); for (i = 1; i < num_regs; i++) { - VALUE str = extract_range(p, - adjust_register_position(p, p->regs.beg[i]), - adjust_register_position(p, p->regs.end[i])); + VALUE str; + if (p->regs.beg[i] == -1) + str = Qnil; + else + str = extract_range(p, + adjust_register_position(p, p->regs.beg[i]), + adjust_register_position(p, p->regs.end[i])); rb_ary_push(new_ary, str); } diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb index 2fce4c3e74..29626b159f 100644 --- a/test/strscan/test_stringscanner.rb +++ b/test/strscan/test_stringscanner.rb @@ -737,8 +737,8 @@ def test_size def test_captures s = create_string_scanner("Timestamp: Fri Dec 12 1975 14:39") s.scan("Timestamp: ") - s.scan(/(\w+) (\w+) (\d+) /) - assert_equal(["Fri", "Dec", "12"], s.captures) + s.scan(/(\w+) (\w+) (\d+) (1980)?/) + assert_equal(["Fri", "Dec", "12", nil], s.captures) s.scan(/(\w+) (\w+) (\d+) /) assert_nil(s.captures) end